Пакетный скриптинг: получить UUID сетевого подключения
Вкратце: мне нужен способ найти UUID сетевого подключения "xyz" из пакетного файла.
Я пытаюсь настроить скрипт, который будет помещать запланированное задание на текущего пользователя. Я намереваюсь отправить этот сценарий нескольким лицам, и поэтому он должен быть полностью автоматическим. Эта задача должна выполняться только при подключении к определенной сети.
Что я сделал:
- Создал задачу, в которой я хочу
Task Scheduler
и экспортировал его, чтобы использовать в качестве шаблона для задачи, которую я хочу импортировать со сценарием. - Установите сценарий для замены определенных значений в шаблоне конкретными данными пользователя.
У меня проблема с поиском UUID, который планировщик задач использует при настройке Start only if the following network connection is availiable
, Из того, что я обнаружил, это не тот же UUID, что и сетевой интерфейс UUID. Экспортированный XML-файл для этой опции выглядит так:
<NetworkSettings>
<Name>AndoidAP</Name>
<Id>{some-random-UUID-here}</Id>
</NetworkSettings>
В примере я использовал AndroidAP, который будет беспроводным устройством. Реальный случай будет проводным соединением. Не знаете, имеет ли это какое-то значение?
Любая помощь или предложения будут с благодарностью!
2 ответа
Получить GUID сетевого подключения
Это получит GUID для данного имени сети. Поскольку GUID уникален для каждого компьютера, этот GUID не является GUID для сети, а является уникальным идентификатором, который компьютер использует для идентификации сети. В настоящее время я не знаю критериев, которые Windows использует для идентификации сети, но на данный момент это удовлетворяет мои потребности. В моем случае подсказка не понадобится, поскольку имя сети является константой (меняется только тогда, когда компания меняет название).
Что это делает:
- Создает несколько временных папок.
- Запросите у пользователя имя сети. Текущее название сети можно найти здесь:
- Получить записи журнала, содержащие имя сети.
- Создает VBS-скрипт.
- Запускает VBS-скрипт, который извлечет GUID из записей журнала и покажет всплывающее окно с GUID.
- Очистите временные файлы и папки.
Обновление: 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"
Ваши требования
По сути, у вас есть задача, которую вы хотите запустить, только если определенные условия ИСТИНА:
- Процесс должен быть запущен только если он подключен к определенной сети
- Процесс должен быть запущен, только если доступен определенный общий файловый ресурс
Потенциально
Вы можете использовать некоторую логику IF и просто проверить состояние условий и принять соответствующие меры, чтобы " выйти из обработки " или " продолжить обработку " остальной части определенной логики.
По сути, это будет. , ,
ping
шлюз по умолчанию через его IP-адрес- проверьте кэш arp для MAC-адреса шлюза по умолчанию, переданного в FindStr
- Если MAC-адрес не найден, то
EXIT
- Если MAC-адрес найден, продолжайте обработку
- проверьте, существует ли доля UNC
- Если доля UNC не существует, то
EXIT
- Если общий ресурс UNC существует, продолжайте обработку, т. Е. Оставшуюся логику
Предпосылки
Получите IPv4-адрес шлюза по умолчанию из
ipconfig
командаПолучить физический Mac-адрес с IP-адреса шлюза по умолчанию
- Запустить
ping
команда против IP-адреса шлюза по умолчанию - Запустить
arp -a
команда и обратите внимание наPhysical Address
IP-адрес соответствующего значения шлюза по умолчанию
- Запустить
Пакетный скрипт
Очевидно, что 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