2

У меня есть сценарий powershell, который используется отделом ИТ-поддержки для удаленной установки программного обеспечения на рабочие станции. Сценарий поддерживает установку нескольких продуктов (один за другим) и, следовательно, потенциально может занять много времени для запуска.

Вчера технический специалист использовал сценарий для удаленной установки нескольких программных продуктов на компьютере, который был отключен на несколько дней.

У нас есть объект групповой политики Windows Update, предназначенный для всех наших рабочих станций, он настроен на установку обновлений в 21:00 каждую среду. Если рабочая станция пропустит эту запланированную дату установки, обновления будут установлены через 60 минут после следующего включения машины.

Пока технический специалист устанавливал программное обеспечение на удаленную рабочую станцию, началось перепланирование Центра обновления Windows. Поэтому его установка и обновления Windows теперь выполнялись одновременно. Это вызвало сбой устанавливаемого им продукта (SQL Server Management Studio).

Я хотел бы изменить свой скрипт, чтобы проверить, устанавливаются ли обновления Windows. Если да, то предупредите техника и прервите сценарий. Если нет, то остановите и отключите службу обновления Windows (wuauserv), это предотвратит возможность ее срабатывания во время использования сценария, затем запустите и повторно включите службу, когда сценарий достигнет конца.

Я не могу найти надежный способ проверить, установлены ли обновления Windows.

Любые предложения приветствуются; Я счастлив использовать объект, инструмент командной строки, WMI, читать реестр и т.д ...

ОБНОВЛЕНИЕ 1. 04.06.13: То, на что я надеялся, - это какой-то способ запроса статуса службы Центра обновления Windows. Если в настоящее время устанавливаются обновления, я предпочел бы учитывать тот факт, что обновления устанавливаются, и посоветовать техническому специалисту вернуться позже. В настоящее время я провожу некоторые тесты, чтобы определить эффект остановки службы wuauserv в следующих сценариях:

  1. Остановите службу до установки обновлений.
  2. Остановите службу во время установки обновлений.

ОБНОВЛЕНИЕ 2. 04.06.13: У меня была виртуальная машина Windows 7, которая не была включена в течение нескольких дней, и поэтому я смогла имитировать ситуацию, с которой техник столкнулся на днях. Я смог использовать снимки в своих интересах, чтобы провести ряд различных тестов.

Следует отметить, что я изменил объект групповой политики, отвечающий за наши настройки Центра обновления Windows, сократив время переназначения с 60 минут до 10 минут после включения рабочей станции (чтобы немного упростить тестирование).

ТЕСТ 1) Остановил службу wuauserv до того, как должны были быть установлены обновления.

Обновления должны были быть установлены в 12:40.

Остановил wuauserv удаленно используя powershell. Я следил за WindowsUpdate.log, и появилось следующее:

2013-04-06      12:36:00:287     984    e68     Service *********
2013-04-06      12:36:00:287     984    e68     Service **  END  **  Service: Service exit [Exit code = 0x240001]
2013-04-06      12:36:00:287     984    e68     Service *************

Я ждал до 12.40 на случай, если служба сможет снова запуститься с помощью какой-то магии. Это не так.

Я запустил службу, и в WindowsUpdate.log было записано следующее, подтверждающее, что служба запустилась снова.

2013-04-06    12:42:07:571     984    e70    Misc    ===========  Logging initialized (build: 7.6.7600.256, tz: +0100)  ===========
2013-04-06    12:42:07:571     984    e70    Misc      = Process: C:\Windows\system32\svchost.exe
2013-04-06    12:42:07:571     984    e70    Misc      = Module: c:\windows\system32\wuaueng.dll
2013-04-06    12:42:07:571     984    e70    Service    *************
2013-04-06    12:42:07:571     984    e70    Service    ** START **  Service: Service startup
2013-04-06    12:42:07:571     984    e70    Service    *********

Журнал также подтвердил, что 10-минутный перенос снова подал заявку:

Success    Content Install    Installation Ready: The following updates are downloaded and ready for installation. This computer is currently scheduled to install these updates on 06 April 2013 at 12:52

ТЕСТ 2) Остановил службу wuauserv во время установки обновления

Это выдержка из файла WindowsUpdate.log непосредственно перед тем, как я остановил службу:

2013-04-06      13:25:00:372    1004    4dc     DnldMgr Preparing update for install, updateId = {F13298D7-7EC1-4D33-9A57-A367F54BA4DA}.106.
2013-04-06      13:25:00:372    3472    790     Handler :::::::::::::
2013-04-06      13:25:00:372    3472    790     Handler :: START ::  Handler: CBS Install
2013-04-06      13:25:00:372    3472    790     Handler :::::::::
2013-04-06      13:25:00:372    3472    790     Handler Starting install of CBS update F13298D7-7EC1-4D33-9A57-A367F54BA4DA
2013-04-06      13:25:00:419    3472    790     Handler CBS package identity: Package_for_KB2698365~31bf3856ad364e35~amd64~~6.1.1.2
2013-04-06      13:25:00:434    3472    790     Handler Installing self-contained with source=C:\Windows\SoftwareDistribution\Download\8fff2597df465a2957121c20dbd4bcec\windows6.1-kb2698365-x64.cab, workingdir=C:\Windows\SoftwareDistribution\Download\8fff2597df465a2957121c20dbd4bcec\inst

Вот что было записано, когда я остановил службу:

2013-04-06      13:25:19:957    3472    3e4     Handler CUHCbsHandler::Cancel called with fReleaseThreadNow=0
2013-04-06      13:25:19:957    1004    ed0     AU      ###########  AU: Uninitializing Automatic Updates  ###########
2013-04-06      13:25:19:973    3472    3e4     Handler CUHCbsHandler::Cancel called with fReleaseThreadNow=1
2013-04-06      13:25:19:973    3472    790     Handler WARNING: CBS handler has been told to exit immediately.
2013-04-06      13:25:19:973    3472    790     Handler FATAL: Completed install of CBS update with type=2, requiresReboot=0, installerError=0, hr=0x80242008
2013-04-06      13:25:19:973    3472    790     Handler :::::::::
2013-04-06      13:25:19:973    3472    790     Handler ::  END  ::  Handler: CBS Install
2013-04-06      13:25:19:973    3472    790     Handler :::::::::::::
2013-04-06      13:25:19:988    1004    4dc     Agent     * WARNING: Exit code = 0x8024000B
2013-04-06      13:25:19:988    1004    4dc     Agent   *********
2013-04-06      13:25:19:988    1004    4dc     Agent   **  END  **  Agent: Installing updates [CallerId = AutomaticUpdates]
2013-04-06      13:25:19:988    1004    4dc     Agent   *************
2013-04-06      13:25:19:988    1004    4dc     Agent   WARNING: WU client failed installing updates with error 0x8024000b
2013-04-06      13:25:20:004    1004    ed0     Report  REPORT EVENT: {72199C19-359E-4D78-A075-4EAA44C368D9}    2013-04-06 13:25:19:973+0100  1186     101     {D5FD720E-0F2C-4363-AA87-6AD4A6D11B0E}  106     8024000b        AutomaticUpdates        Success Content Install User cancelled the installation.
2013-04-06      13:25:20:035    1004    ed0     Report  CWERReporter::HandleEvents - WER report upload completed with status 0x8
2013-04-06      13:25:20:035    1004    ed0     Report  WER Report sent: 7.6.7600.256 0x8024000b D5FD720E-0F2C-4363-AA87-6AD4A6D11B0E Install 101 Managed
2013-04-06      13:25:20:035    1004    ed0     Report  CWERReporter finishing event handling. (00000000)
2013-04-06      13:25:20:160    1004    ed0     Service *********
2013-04-06      13:25:20:160    1004    ed0     Service **  END  **  Service: Service exit [Exit code = 0x240001]
2013-04-06      13:25:20:160    1004    ed0     Service *************

Как вы можете видеть, он документирует тот факт, что обновление, которое было установлено в данный момент, было отменено.

Я только надеюсь, что установка, которая имела место, была отменена изящным способом? Но я не знаю, действительно знаю ответ на этот вопрос ... Поскольку большинство обновлений Windiws используют MSI, я надеюсь, что они используют свои возможности для отката изменений файлов и реестра и, таким образом, оставляют рабочую станцию в стабильном состоянии.

3 ответа3

1

чистая остановка wuauserv

не имеет значения, если он запущен, он не будет после завершения этой команды.

Когда ваш сценарий завершится

чистый старт wuauserv

1

Я бы не советовал убивать эти процессы во время установки, поскольку вы и AthomSfere разобрались. Тем не менее, видя, что два основных имени для установки в Windows, которые нужно искать - это msiexec.exe и setup.exe вы можете найти их в своем скрипте powershell, и если эти процессы выполняются, создайте цикл, в котором скрипт спит, пока оба те закрыты. Что-то вроде (псевдокод):

while($(get-process -like msiexec.exe).count -gt 1 -or $(get-process -like setup.exe).count -gt 1){
    sleep 300
}

Я лишь частично рекомендую это решение, потому что существует вероятность того, что для установленных обновлений может потребоваться перезагрузка, и если они это сделают, а программное обеспечение, установленное вашим сценарием, не будет установлено, если ожидается перезагрузка, то это идеальный шторм, чтобы он все равно не сработал ,

В идеале, если бы у вас была достаточно большая инфраструктура, чтобы использовать что-то вроде sccm для развертывания программного обеспечения и обновлений Windows, то это именно то, что вам нужно, и это в конечном итоге предотвратит эти конфликты (по крайней мере, из моего опыта, программное обеспечение и обновления, установленные из sccm, не конфликтуют, они устанавливаются последовательно, а не одновременно).

1

Сейчас я не на доменном компьютере, чтобы проверить имена, но способ, которым я обработал это:

Ищите запущенные процессы:

  1. msiexec.exe
  2. Setup.exe
  3. Процесс SCCM - я забыл точное имя, убей его.
  4. СМС процесс - Имя тоже забыто, убей его

Я проверяю первые два запуска (и еще один, который является CompanyNameSetup.exe), чтобы увидеть, есть ли текущие установки. Если нет, то убейте процессы SCCM и SMS, чтобы никакие новые установки не могли быть перенесены.

Выполните установку, а затем либо перезагрузите, либо перезапустите процессы / службы SCCM и SMS.

После комментариев ниже: я думаю, что это будет маршрут в Псуедо:

while (msiexec.exe isRunning OR Setup.EXE isRunning)
{wait for completion}
net stop wuauserv  #Prevent installs
taskkill /im Wuauclt.exe /f  #Kill an empty Wuauclt.exe

Затем вы можете вызывать ваши скрипты, после того, как ваши установки завершены, все, что вам нужно сделать, это вызвать

net start wuauserv  #Start WSUS service

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