Массовая замена WSUS ID на клонированных машинах

Перемещаясь из одной компании в другую, практически везде вижу одну и ту же картину: клонированные с помощью Acronis или Ghost рабочие станции, а также тиражированные на гипервизоре VMWare сервера не распознаются сервером Windows Server Update Services (WSUS). То есть, компьютеры видят WSUS и ставят с него обновления, на самой же консоли управления WSUS их не видно — из 600 рабочих станций распознаются, к примеру, всего 100.

Причина весьма проста — после первого же визита на Windows Update служба WUAUServ генерирует уникальный идентификатор SusClientId, затем администратор сохраняет образ уже обновленной операционной системы. У всех растиражированных с данного образа копии ОС этот идентификатор будет одинаков.

Заменить SusClientId просто, и статей на эту тему предостаточно. Меня же интересовало написание скрипта, который можно применить в любой компании сразу ко всем машинам. Думается, мне не жалко им поделиться с вами. Сохраните скрипт в шаринг NetLogon контроллера домена, затем сконфигурируйте его запуск в качестве Startup Script для всех компьютеров домена. Для отсылки уведомлений на почту раскидайте на все компьютеры программу BLAT (http://www.blat.net/).

 

@echo off
set NetworkFolder=\\FileServer\Data\Computer_Reports\SusClientId
set LogFileName=C:\Windows\SusClientId.txt
set MailServer=mail.company.lv
set MailFrom=%ComputerName%@Company.local
set RcptTo=ITSupport@Company.lv

set SusClientId=None
if not exist %NetworkFolder% goto End
if exist «%NetworkFolder%\Computer_%ComputerName%.txt» goto End
echo Checking WSUS Client ID on %ComputerName% at %date% %time% > «%LogFilename%»
for /f «tokens=2,*» %%a in (‘reg query HKLM\Software\Microsoft\Windows\Currentversion\WindowsUpdate /v SusClientId 2^>NUL ^| findstr SusClientId’) do set SusClientId=%%b
echo Current ID = %SusClientId% >> «%LogFilename%»
if not exist «%NetworkFolder%\ID_%SusClientId%.txt» goto Update

:ResetID
reg delete HKLM\Software\Microsoft\Windows\Currentversion\WindowsUpdate /f /v SusClientId
reg delete HKLM\Software\Microsoft\Windows\Currentversion\WindowsUpdate /f /v SusClientIdValidation
net stop WUAUServ
ping localhost
net start WUAUServ
ping localhost
wuauclt /resetauthorization /detectnow

for /f «tokens=2,*» %%a in (‘reg query HKLM\Software\Microsoft\Windows\Currentversion\WindowsUpdate /v SusClientId 2^>NUL ^| findstr SusClientId’) do set SusClientId=%%b
echo WSUS ID has been updated >> %LogFilename%
echo New ID = %SusClientId% >> %LogFilename%
if exist «%NetworkFolder%\ID_%SusClientId%.txt» goto End
ping localhost
blat.exe %LogFilename% -f %MailFrom% -to %RcptTo% -subject «WSUS Client ID Update Notification» -server %MailServer%

:Update
echo %ComputerName% > «%NetworkFolder%\ID_%SusClientId%.txt»
echo %SusClientId% > «%NetworkFolder%\Computer_%ComputerName%.txt»
:End

 

Как оно работает:

  1. Отрабатывая впервые, скрипт сохраняет в сетевой папке %NetworkFolder% два файла: %ComputerName%.txt и ID_%SusClientId%.txt. Ну вот так мне захотелось.
  2. В дальнейшем, если файл с именем компьютера уже есть, скрипт просто заканчивает свою работу. Это означает, что он уже отстрелялся ранее.
  3. Если же обнаруживается, что файла с именем компьютера нет, а файл с идентификатором есть, выходит, что этот ID уже занят кем-то другим. В этом случае скрипт уничтожает свой текущий SusClientId и генерирует его заново. Новый идентификатор высылается на заданный почтовый адрес для того, чтобы отметить сам факт его успешной замены.

Заметил, что при первой зачистке существует вероятность генерации нового идентификатора, идентичного предыдущему. С остальным, думаю, разберётесь сами.

Реклама

8 Responses to Массовая замена WSUS ID на клонированных машинах

  1. Добрый день. Столкнулся с указанной проблемой, попробовал Ваш метод. Для начала решил просто на одной машине выполнить resetId. Скрипт отработал, но теперь попытка обновления выдает ошибку 80072EE2 — как я понял, таймаут соединения. Решается проблема накатываением фикса от майкрософта «Проверка готовности к обновлению», но если я в сети накачу такой скрипт, то массово получу необходимость установки этого фикса. Может что-то еще нужно сделать, чтобы решить проблему с SID?

  2. Uzver says:

    Добрый день!
    решил использовать в работе, но что то пошло не так.
    есть два вопроса:
    1. зачем нужен данный параметр set LogFileName=C:\Windows\SusClientId.txt
    2. скрип останавливается на этой строчке if not exist %NetworkFolder% goto End сетевая папка пуста.

    • 1. Файл журнала нужен, чтобы как-то отслеживать исполненные шаги батника. И решать проблемы, понимая, где он запнулся.
      2. Убедитесь, что сетевой путь не содержит пробела или возьмите %NetworkFolder% в кавычки.

      • Uzver says:

        я же правильно понимаю что это *.bat а не *.vbs?

        так же возникает ошибка в tokens=2,* Непредвиденное появление: 2

      • Ну конечно bat, тут vbs даже близко нет.
        Надо выполнить отдельно reg query и смотреть, что возвращается, почему tokens не может вырезать нужный параметр.

  3. Uzver says:

    запрос reg query HKLM\Software\Microsoft\Windows\Currentversion\WindowsUpdate /v SusClientId 2^>NUL ^| findstr SusClientId возвращает:
    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Currentversion\WindowsUpdate
    SusClientId REG_SZ 86cee789-3f80-4bbc-892d-1152a45915db
    причем если написать
    for /f «tokens=2,*» %%a in («reg query HKLM\Software\Microsoft\Windows\Currentversion\WindowsUpdate /v SusClientId 2>NUL | findstr SusClientId») do set SusClientId=%%b
    То скрипт отрабатывает, но в файл SusClientId.txt заноситься адрес ветки реестра, а не значение.
    и почему не создаются файлы на шаре. хотя запрос выполняю с правами домен админа.

  4. Uzver says:

    Все поехало. Вот рабочий скрипт:

    set SusClientId=None
    if not exist %NetworkFolder% goto End
    if exist %NetworkFolder%\%ComputerName%.txt goto End
    echo Checking WSUS Client ID on %ComputerName% at %date% %time% > %LogFileName%
    for /f «tokens=3» %%i in (‘reg query HKLM\Software\Microsoft\Windows\Currentversion\WindowsUpdate /v SusClientId 2^>NUL ^| findstr SusClientId’) do set SusClientId=%%i
    echo Current ID = %SusClientId% >> %LogFilename%
    if not exist %NetworkFolder%\ID_%SusClientId%.txt goto Update

    :ResetID
    reg delete HKLM\Software\Microsoft\Windows\Currentversion\WindowsUpdate /f /v SusClientId
    reg delete HKLM\Software\Microsoft\Windows\Currentversion\WindowsUpdate /f /v SusClientIdValidation
    net stop WUAUServ
    ping localhost
    net start WUAUServ
    ping localhost
    wuauclt /resetauthorization /detectnow

    for /f «tokens=3» %%i in (‘reg query HKLM\Software\Microsoft\Windows\Currentversion\WindowsUpdate /v SusClientId 2^>NUL ^| findstr SusClientId’) do set SusClientId=%%i
    echo WSUS ID has been updated >> %LogFilename%
    echo New ID = %SusClientId% >> %LogFilename%
    if exist %NetworkFolder%\ID_%SusClientId%.txt goto End
    ping localhost

    :Update
    echo %ComputerName% >%NetworkFolder%\ID_%SusClientId%.txt
    echo %SusClientId% >%NetworkFolder%\%ComputerName%.txt
    :End

    В нем оставил только то что мне надо.
    Большое спасибо за скрипт)

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s

%d такие блоггеры, как: