Проблема: после создания клона виртуальная машина не скачивает обновления со WSUS сервера.
Решение:
Причина весьма проста — после первого же визита на 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=This email address is being protected from spambots. You need JavaScript enabled to view it. 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 /detectnowfor /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
Как оно работает:
- Отрабатывая впервые, скрипт сохраняет в сетевой папке %NetworkFolder% два файла: %ComputerName%.txt и ID_%SusClientId%.txt. Ну вот так мне захотелось.
- В дальнейшем, если файл с именем компьютера уже есть, скрипт просто заканчивает свою работу. Это означает, что он уже отстрелялся ранее.
- Если же обнаруживается, что файла с именем компьютера нет, а файл с идентификатором есть, выходит, что этот ID уже занят кем-то другим. В этом случае скрипт уничтожает свой текущий SusClientId и генерирует его заново. Новый идентификатор высылается на заданный почтовый адрес для того, чтобы отметить сам факт его успешной замены.