Пакетный скриптинг: получить UUID сетевого подключения

722
Klinghust

Вкратце: мне нужен способ найти UUID сетевого подключения "xyz" из пакетного файла.

Я пытаюсь настроить скрипт, который будет помещать запланированное задание на текущего пользователя. Я намерен отправить этот сценарий нескольким лицам, и поэтому он должен быть полностью автоматическим. Эта задача должна выполняться только при подключении к определенной сети.

Что я сделал:

  • Создал задачу, в которой я хочу, Task Schedulerи экспортировал ее, чтобы использовать в качестве шаблона для задачи, которую я хочу импортировать со сценарием.
  • Установите сценарий для замены определенных значений в шаблоне конкретными данными пользователя.

У меня проблема с поиском UUID, который планировщик задач использует при настройке Start only if the following network connection is availiable. Из того, что я обнаружил, это не тот же UUID, что и сетевой интерфейс UUID. Экспортированный XML-файл для этой опции выглядит так:

<NetworkSettings> <Name>AndoidAP</Name> <Id></Id> </NetworkSettings> 

В примере я использовал AndroidAP, который будет беспроводным устройством. Реальный случай будет проводным соединением. Не знаете, имеет ли это какое-то значение?

Scheduler GUI

Любая помощь или предложения будут с благодарностью!

1
Я думал, что у меня есть решение в пределах досягаемости, когда я нашел разделы реестра для сетевых профилей в реестре. Но мои надежды были разбиты, когда я обнаружил, что мне не разрешено (возможно, по групповой политике) запрашивать ключи в HKEY_LOCAL_MACHINE \ SOFTWARE Klinghust 7 лет назад 0
@Facebook Спасибо за ваш ответ! Я еще не закончил это. Я думаю, что шлюз по умолчанию в значительной степени остается статичным. Как так??? :) Я обнаружил, что `wevtutil` перечисляет GUID, если не отформатирован как текст (т.е. отформатирован как XML). Работать со строками в пакетном режиме - такая боль, поэтому я работаю над сценарием .vbs для извлечения GUID из вывода wevtutil. Этот сценарий VBS я планирую создать из пакетного сценария и удалить после завершения. Я опубликую свое решение, как только у меня будет время закончить. Klinghust 7 лет назад 0
Еще один вопрос, является ли основная и наиболее важная цель вашей задачи здесь для обеспечения *** «Эта задача должна выполняться только при подключении к определенной сети» ***? Является ли это главной целью здесь независимо от `UUID`, который вы записываете через какой-то CLI и пакетный скрипт или скрипт vbs? У меня есть простая идея, которая может помочь, но я хотел бы сначала услышать от вас ответ, если это возможно. Pimp Juice IT 7 лет назад 0
@Facebook Да, это главная цель, поскольку сценарий должен отражать указанную пользователем папку в сетевой папке. Если сценарий запустится в другой сети, он может зеркально отразить папку на компьютере какого-то незнакомца. Klinghust 7 лет назад 0
Хорошо, у меня есть идея, я поиграю с подтверждением работ, как я думаю, а затем напишу в ответ, по крайней мере, для вас. Я предполагаю, что этот сетевой ресурс доступен только в этой сети, так как какой-то UNC-путь, такой как `\\ server \ share`, слишком корректен? Я протестирую некоторые идеи с помощью пакета, чтобы увидеть, можно ли выполнить пару проверок перед запуском скрипта. Pimp Juice IT 7 лет назад 0
@Facebook Правильно. Klinghust 7 лет назад 0

2 ответа на вопрос

1
Pimp Juice IT

Ваши требования

По сути, у вас есть задача, которую вы хотите запустить, только если определенные условия ИСТИНА :

  1. Процесс должен быть запущен только если он подключен к определенной сети
  2. Процесс должен быть запущен, только если доступен определенный общий файловый ресурс

Потенциально

Вы можете использовать некоторую логику IF и просто проверить состояние условий и принять соответствующие меры, чтобы « выйти из обработки » или « продолжить обработку » остальной части определенной логики.

По сути, это будет., ,

  1. ping шлюз по умолчанию через его IP-адрес
  2. проверьте кэш arp для MAC-адреса шлюза по умолчанию, переданного в FindStr
    • Если MAC-адрес не найден, тоEXIT
    • Если MAC-адрес найден, продолжайте обработку
  3. проверьте, существует ли доля UNC
    • Если доля UNC не существует, тоEXIT
    • Если общий ресурс UNC существует, продолжайте обработку, т. Е. Остальную часть логики

Предпосылки

  1. Получите IPv4-адрес шлюза по умолчанию из ipconfigкоманды

    enter image description here

  2. Получить физический Mac-адрес из IP-адреса шлюза по умолчанию

    • Запустите pingкоманду для IP-адреса шлюза по умолчанию
    • Запустите arp -aкоманду и обратите внимание, Physical Addressчто IP-адрес совпадает со значением шлюза по умолчанию

    enter image description here


Пакетный скрипт

Очевидно GatewayIP=, что значения GWMacAddr=, и FolderShr=переменные должны быть установлены с точными значениями, чтобы это работало должным образом - я проверил и подтвердил, что это с моей стороны.

@ECHO ON   SET GatewayIP=192.168.1.254 SET GWMacAddr=e1-c3-5b-ed-4d-61 SET FolderShr=\\machinename\sharename  ping -n 02 %GatewayIP% arp -a | findstr /c:"%GWMacAddr%"  IF NOT %ERRORLEVEL%==0 EXIT IF NOT EXIST "%FolderShr%" EXIT  <Rest of batch logic here since both checks above passed> EXIT 


Дополнительные ресурсы

Спасибо за подробные инструкции! Аккуратный подход. Единственным недостатком, который я вижу, является то, что при подключении к другой сети окно cmd будет кратковременно мигать на экране во время выполнения проверок. Также ... я не знаю почему, но IP-адрес не отображается в `arp -a` даже после пинга. Klinghust 7 лет назад 0
@Klinghust Если пинг отвечает, то должны появиться IP и MAC, но, возможно, убедитесь, что вы запускаете `cmd.exe` от имени администратора. Вы можете запустить это скрытым несколькими способами, которые я знаю, как сделать, и ни один из них не сложен вообще. Посмотрите мой ответ здесь: https://superuser.com/questions/957267/how-to-disable-automatic-reboots-in-windows-10/1208716#1208716 и посмотрите на `# 2` (создайте скрипт vbs) , `# 9`,` # 10` и `# 11` (выбор параметров действий) для моей первоначальной идеи запуска скрытого, так как в планировщике заданий я думаю, что вы должны иметь опцию` Запускать только когда пользователь вошел в систему ` Pimp Juice IT 7 лет назад 0
Если эхо-запрос не отвечает, то при тестировании поведение и IP-адрес или MAC-адрес не должны отображаться, так что, возможно, он запускает проблему с правами администратора, если он не работает должным образом, а DW, на который вы пингуете, не отвечает? Pimp Juice IT 7 лет назад 0
Команда ping отвечает: `Ответ от 10.250.30.27: байты = 32 время = 24 мс TTL = 121 Статистика пинга для 10.250.30.27: Пакеты: Отправлено = 4, Получено = 4, Потерянно = 0 (потеря 0%)` Но по-прежнему нет трассировки об этом в `arp -a`. Те же результаты при запуске cmd от имени администратора. Klinghust 7 лет назад 0
@ Klinghust Как ваша топография сети с этим? Можете ли вы объяснить, как машина, на которой вы работаете, взаимодействует с этим шлюзом для каких-либо прыжков? Это физическая машина или виртуальная машина? Я попытаюсь найти другой способ, но на самом деле, если общая папка доступна только при подключении к этой сети по сравнению с другими, тогда, возможно, вы можете просто установить и использовать логику «IF NOT EXIST»% FolderShr% «EXIT» и даже не беспокойтесь о кеше arp. Возможно, было бы лучше просто ответить на команду ping с успехом и проверить общий доступ? Pimp Juice IT 7 лет назад 0
Я не уверен в топологии сети, так как я не в ИТ. Но из того, что я могу найти, используя `tracert`, кажется, что этот сервер находится где-то, кроме дома (8hops). Меня беспокоит то, что если кто-то подключится к другой сети и существует сервер с таким же именем, файлы будут скопированы в него. Вот почему я хочу GUID, поскольку он уникален для сети. Klinghust 7 лет назад 0
@Klinghust Если вы создадите скрытый фиктивный ресурс с уникальным именем и подтвердите его доступность, то я думаю, что этого будет достаточно. Кроме того, какой бы сценарий у вас ни выполнялся, укажите на сценарий в общем сетевом ресурсе, так что в случае, если у кого-то случится все это в его среде, у него, вероятно, не будет сценария в пути UNC, который вы используете для него. , Так что, если это локальные машинные сценарии, которые выполняются только в сети, сделайте их доступными только из той же сети. Если сценарий недоступен, задание будет запущено, но сценарий не будет выполнен. Pimp Juice IT 7 лет назад 0
@ Klinghust Что касается UUID, GUID или чего-то еще, я думаю, что ОС Windows хранит уникальное имя для сетей, к которым она подключается, и это только для каждой машины. Таким образом, UUID на самом деле не является сетью, передающей это, а скорее ОС WIndows, хранящей это и создающей UUID для каждого компьютера в сети, поэтому один и тот же сетевой UUID на ПК1 и ПК2 не будет иметь одинаковый идентификационный номер. Я должен буду прочитать об этом больше, но из того, что я понял из краткого прочтения, похоже, что так и есть. Pimp Juice IT 7 лет назад 0
Я не могу использовать IP как условие, так как у меня нет гарантии, что он останется таким же, как серверы обмениваются время от времени. Я могу использовать имя сервера, так как он всегда будет обновлять ссылку в «net use», если имя меняется. Ваши предположения о GUID / UUID, насколько я понял, верны. И именно поэтому мне нужно получить его автоматически с ПК, на котором выполняется сценарий, который добавляет запланированное задание. Klinghust 7 лет назад 0
Вы запускаете пакетный скрипт из планировщика задач? Если это так, то вместо указания программы / скрипта на локальный пакетный скрипт `C: \ scripts \ process.cmd`, вызывайте его из` \\ server \ share \ scripts \ process.cmd`. Я не думаю, что IP-адрес генерального директора должен меняться так часто, но сервер и ПК, как я понимаю, это отдельная история. Конечно, в другой сети с тем же IP-адресом, что и у DG, и даже если есть сервер с такими же настройками имен общих ресурсов, вероятно, не будет пакетного сценария с таким же именем, выполняющего логику. Я думаю, что простое решение, как это было бы хорошо. Pimp Juice IT 7 лет назад 1
Я полагаю, что размещение сценария на сервере было бы неплохим решением. Я мог бы пойти на это в конце, а также вставить GUID в запланированное задание :) Спасибо за все ваши усилия! Klinghust 7 лет назад 0
0
Klinghust

Получить GUID сетевого подключения

Это получит GUID для данного имени сети. Поскольку GUID уникален для каждого компьютера, этот GUID не является GUID для сети, а является уникальным идентификатором, который компьютер использует для идентификации сети. В настоящее время я не знаю критериев, которые Windows использует для идентификации сети, но на данный момент это удовлетворяет мои потребности. В моем случае подсказка не понадобится, поскольку имя сети является константой (изменяется только тогда, когда компания меняет название ).

Что это делает:

  1. Создает несколько временных папок.
  2. Запросите у пользователя имя сети. Текущее название сети можно найти здесь:See network name here
  3. Получить записи журнала, содержащие имя сети.
  4. Создает VBS-скрипт.
  5. Запускает VBS-скрипт, который извлечет GUID из записей журнала и покажет всплывающее окно с GUID.
  6. Очистите временные файлы и папки.

Обновление: Lol. Забыл вставить скрипт. Вот так:

Автор сценария:

@ECHO OFF CLS  REM Make temp folder to place temporary files in IF NOT EXIST "%tmp%\TKH\Mirror_Folders" MD "%tmp%\TKH\Mirror_Folders"  REM Ask user for name of network to find GUID for ECHO wscript.echo inputbox(WScript.Arguments(0),WScript.Arguments(1)) >"%tmp%\TKH\Mirror_Folders\NetworkName.vbs" FOR /f "tokens=* delims=" %%a IN ('cscript //nologo "%tmp%\TKH\Mirror_Folders\NetworkName.vbs" "Enter the name of the network" "Select network"') DO SET NetworkToSearchFor=%%a  REM Add 'Name'> to %NetworkToSearchFor% to filter out false results SET SearchString="'Name'^^^>%NetworkToSearchFor%"  REM Get log entry for networkname FOR /f "delims=" %%i IN ('wevtutil qe Microsoft-Windows-NetworkProfile/Operational /q:"Event[System[(EventID=10000)]]" /c:100 /rd:true /f:xml ^| FINDSTR /R "%SearchString%"') DO ( ECHO %%i>>"%tmp%\TKH\Mirror_Folders\Log entries.txt" ) REM Make VBS-script to get GUID ( ECHO. 'Creates local variables ECHO. Private Arg, objInputFile, tmpStr ECHO. 'Populate array with arguments ECHO. 'Arg^(0^): filepath^+filename ECHO. Set Arg = WScript.Arguments ECHO. ECHO. Set objInputFile = CreateObject^("Scripting.FileSystemObject"^).OpenTextFile^(Arg^(0^)^) ECHO. tmpStr = objInputFile.ReadLine ECHO. ECHO. FirstCharacterToGet = InStr^(tmpStr, "<Data Name='Guid'>"^)^+18 ECHO. NumberOfCharactersToGet = 38 ECHO. GUID = mid^(tmpStr, FirstCharacterToGet, NumberOfCharactersToGet^) ECHO. WScript.Echo GUID )>"%tmp%\TKH\Mirror_Folders\Get GUID.vbs"  REM Call VBS-script to get GUID FOR /F "usebackq tokens=*" %%r in (`CSCRIPT "%tmp%\TKH\Mirror_Folders\Get GUID.vbs" "%tmp%\TKH\Mirror_Folders\Log entries.txt"`) DO SET GUID=%%r ECHO %GUID% mshta "javascript:alert('Your networks GUID is:\n%GUID%');close()"  REM Clean up RD /Q /S "%tmp%\TKH\ 

Сохраните это как "get GUID.cmd"