1

Вкратце: мне нужен способ найти 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, который будет беспроводным устройством. Реальный случай будет проводным соединением. Не знаете, имеет ли это какое-то значение?

Планировщик GUI

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

2 ответа2

1

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

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

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

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

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

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

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

Предпосылки

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

  2. Получить физический 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


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

0

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

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

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

  1. Создает несколько временных папок.
  2. Запросите у пользователя имя сети. Текущее название сети можно найти здесь:Смотрите имя сети здесь
  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"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .