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


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

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


Я думал, что у меня есть решение в пределах досягаемости, когда я нашел ключи реестра для сетевых профилей в реестре. Но мои надежды были разбиты, так как я обнаружил, что мне не разрешено (возможно, по групповой политике) запрашивать ключи в HKEY_LOCAL_MACHINE \ SOFTWARE
Klinghust

@Facebook Спасибо за ваш ответ! Я еще не закончил это. Я думаю, что шлюз по умолчанию в значительной степени остается статичным. Как так??? :) Я обнаружил, что wevtutilперечисляет GUID, если не отформатирован как текст (т.е. отформатирован как XML). Работать со строками в пакетном режиме - такая боль, поэтому я работаю над сценарием .vbs для извлечения GUID из вывода wevtutil. Этот сценарий VBS я планирую создать из пакетного сценария и удалить после завершения. Я опубликую свое решение, как только у меня будет время закончить.
Klinghust

Еще один вопрос, является ли основная и самая важная цель вашей задачи здесь, чтобы гарантировать, что «эта задача должна выполняться только при подключении к определенной сети» ? Является ли это главной целью здесь, независимо от того, что UUIDвы перехватываете через некоторый CLI и пакетный скрипт или скрипт vbs? У меня есть простая идея, которая может помочь, но я хотел бы сначала получить от вас ответ, если это возможно.
Сок Pimp IT

@Facebook Да, это главная цель, так как сценарий должен отражать указанную пользователем папку для общего сетевого ресурса. Если сценарий запускается в другой сети, он может зеркально отразить папку на компьютере какого-то незнакомца.
Klinghust

Хорошо, у меня есть идея, я поиграю с подтверждением работ, как я думаю, а затем напишу в ответ, по крайней мере, для вас. Я предполагаю, что эта сетевая папка доступна только в этой сети, как какой-то UNC-путь, такой как \\server\shareслишком правильный? Я протестирую некоторые идеи с помощью пакета, чтобы увидеть, можно ли выполнить пару проверок перед запуском скрипта.
Сок Pimp IT

Ответы:


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


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


Спасибо за подробные инструкции! Аккуратный подход. Единственным недостатком, который я вижу, является то, что при подключении к другой сети окно cmd будет кратковременно мигать на экране во время выполнения проверок. Также ... я не знаю почему, но IP-адрес не появляется arp -aдаже после пинга.
Klinghust

@Klinghust Если пинг отвечает, то должны появиться IP и MAC, но, возможно, убедитесь, что вы работаете cmd.exeот имени администратора. Вы можете запустить это скрытым несколькими способами, которые я знаю, как сделать, и ни один из них не сложен вообще. Посмотрите мой ответ здесь: superuser.com/questions/957267/... и посмотреть на #2(создать скрипт VBS), #9, #10и #11(выбор вариантов действий) для моей первоначальной идеи запустить скрытый , так как планировщик задач , я думаю , вы должны иметь ОпцияRun only when the user is logged on
Сок Pimp IT

Если эхо-запрос не отвечает, то при тестировании поведение и IP-адрес или MAC-адрес не должны отображаться, поэтому, возможно, он запускает проблему от имени администратора, если он не работает должным образом, а DW, на который вы пингуете, не отвечает?
Сок Pimp IT

Команда ping отвечает, Reply from 10.250.30.27: bytes=32 time=24ms TTL=121 Ping statistics for 10.250.30.27: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss)но до сих пор ее не видно arp -a. Те же результаты при запуске cmd от имени администратора.
Klinghust

1
Вы запускаете пакетный скрипт из планировщика задач? Если это так, то вместо того, чтобы указывать программу / скрипт на локальный C:\scripts\process.cmdпакетный скрипт, вызывайте его из \\server\share\scripts\process.cmd. Я не думаю, что IP-адрес генерального директора должен меняться так часто, но сервер и ПК, как я понимаю, это отдельная история. Конечно, в другой сети с тем же IP-адресом, что и у DG, и даже если есть сервер с такими же настройками имен общих ресурсов, вероятно, не будет пакетного сценария с таким же именем, выполняющего логику. Я думаю, что простое решение, как это было бы хорошо.
Сок Pimp IT

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"

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.