ワークステーションにソフトウェアをリモートインストールするためにITサポート部門が使用するPowerShellスクリプトがあります。このスクリプトは、複数の製品のインストールを(次々に)サポートしているため、実行に時間がかかる可能性があります。
昨日、技術者はスクリプトを使用して、数日間電源がオフになっていたマシンに複数のソフトウェア製品をリモートでインストールしました。
すべてのワークステーションを対象としたWindowsUpdate GPOがあり、毎週水曜日の午後9時に更新プログラムをインストールするように構成されています。ワークステーションがこのスケジュールされたインストール日を逃した場合、更新プログラムは60分後にインストールされます。次に、マシンの電源がオンになります。
技術者がリモートワークステーションに対してソフトウェアをインストールしているときに、Windows Updateの再スケジュールが開始されました。したがって、技術者のインストールとWindowsUpdateの両方が同時にインストールされていました。これにより、彼がインストールしていた製品(SQL Server Management Studio)がクラッシュしました。
スクリプトを変更して、WindowsUpdateが現在インストールされているかどうかを確認したいと思います。はいの場合は、技術者に警告し、スクリプトを中止します。いいえの場合は、Windows Updateサービス(wuauserv)を停止して無効にします。これにより、スクリプトの使用中にサービスが開始される可能性がなくなり、スクリプトが最後に達したときにサービスを開始して再度有効にします。
WindowsUpdateが現在インストールされているかどうかを確認するための堅牢な方法が見つかりません。
どんな提案も歓迎します。オブジェクト、コマンドラインツール、WMIを使用したり、レジストリを読み取ったりできてうれしいです...
PDATE 1. 06/04/13:私が望んでいたのは、WindowsUpdateサービスのステータスを照会する何らかの方法です。アップデートが現在インストールされている場合、アップデートがインストールされているという事実を尊重し、技術者に後で戻ってくるようにアドバイスすることをお勧めします。現在、次のシナリオでwuauservサービスを停止した場合の影響を判断するためにいくつかのテストを実施しています。
PDATE 2. 06/04/13: Windows 7 VMが数日間オンになっていないため、模倣することができました。先日、技術者が直面した状況。スナップショットを利用して、さまざまなテストを実施することができました。
GPO Windows Update設定を担当するように変更し、ワークステーションの電源を入れてから再スケジュール時間を60分から10分に短縮したことを指摘しておく必要があります(テストを少し簡単にするため)。
テスト1)アップデートがインストールされる前にwuauservサービスを停止しました。
アップデートは12:40にインストールされる予定でした。
PowerShellを使用してリモートでwuauservを停止します。 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 Updateの大部分はMSIを使用しているため、ファイルとレジストリの変更をロールバックしてワークステーションを安定した状態に保つ機能を使用することを望んでいます。
ネットストップwuauserv
実行されているかどうかは関係ありません。このコマンドが完了した後は関係ありません。
スクリプトが完了したら
ネットスタートwuauserv
あなたとAthomSfereがハッシュアウトしたので、インストールの途中でこれらのプロセスを強制終了することはお勧めしません。ただし、Windowsで検索する主な2つのインストール名が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 Updateはそれが必要であり、最終的にはそれらの競合を防ぎます(少なくとも私の経験のソフトウェアとインストールされた更新から) sccmからは競合しません。同時にではなく、連続してインストールされます)。
私は現在、名前を確認するためにドメインマシンを使用していませんが、これを処理する方法は次のとおりです。
実行中のプロセスを探します。
実行中の最初の2つ(およびもう1つはCompanyNameSetup.exe)をチェックして、現在のインストールがあるかどうかを確認します。そうでない場合は、SCCMおよびSMSプロセスを強制終了して、新しいインストールをプッシュできないようにします。
インストールを実行してから再起動するか、SCCMおよびSMSプロセス/サービスを再起動します。
以下のコメントの後:私はこれがpsuedoのルートになると思います:
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