web-dev-qa-db-ja.com

リモートサーバーにインストールされるのを待っている更新の数を確認するにはどうすればよいですか?

Windows Server(2003、2008)がMicrosoft Windows Updateをダウンロードし、ユーザーが「更新プログラムをインストールしてサーバーを再起動する」ことを確認するのを待っているかどうかを確認する方法はありますか?

WSUSとSSCMを使用して更新プログラムを収集および公開し、サーバーの大部分は日曜日の朝に自動インストールされます。ほとんどの場合、開発サーバーとテストサーバーです。

重要な本番サーバーは手動でのみインストールするようにセットアップしましたが、場合によっては、しばらくの間手動で再起動されないサーバーもあります(人間は忘れます!)

更新が保留されている場所をカウントまたは検出するために使用できるメソッド(PowerShellスクリプト、WMIクエリ、魔法のコマンド)があれば、それは素晴らしいことです。

1
Guy

これが私が書いたスクリプトです。それはあなたに言うでしょう:

  • インストールを待機しているパッチの数
  • パッチの再起動が必要な場合
  • サーバーが現在、パッチを有効にするための再起動を待機している場合

使用例:C:\> cscript ServerPendingUpdates.vbs myserver01 myserver02

Connecting to myserver01 to check software update status...
myserver01 has 2 updates pending installation
myserver01 WILL need to be rebooted to complete the installation of these updates.
myserver01 is waiting for a REBOOT to complete a previous installation.

<snip>

脚本:

'#
'# ServerPendingUpdates.vbs
'#
'# Usage: cscript ServerPendingUpdates.vbs {servername} {servername} {servername} {servername}
'#    If no {servername} specified then 'localhost' assumed
'#
'# To do: Error handling
'#
Option Explicit
Dim strServer        : strServer         =  GetArgValue(0,"localhost")


'#
'# Loop through the input parameters for each server
'#
Dim i
For i = 0 To WScript.Arguments.Count - 1
    CheckServerUpdateStatus GetArgValue(i,"localhost") 'strServer
Next

WScript.Quit(0)

Function CheckServerUpdateStatus( ByVal strServer )

    WScript.Echo vbCRLF & "Connecting to " & strServer & " to check software update status..."

    Dim blnRebootRequired    : blnRebootRequired     = False
    Dim blnRebootPending    : blnRebootPending     = False
    Dim objSession        : Set objSession    = CreateObject("Microsoft.Update.Session", strServer)
    Dim objUpdateSearcher     : Set objUpdateSearcher    = objSession.CreateUpdateSearcher
    Dim objSearchResult    : Set objSearchResult     = objUpdateSearcher.Search(" IsAssigned=1 and IsHidden=0 and Type='Software'")

    '#
    '#
    '#
    Dim i, objUpdate
    Dim intPendingInstalls    : intPendingInstalls     = 0

    For i = 0 To objSearchResult.Updates.Count-1
        Set objUpdate = objSearchResult.Updates.Item(I) 

        If objUpdate.IsInstalled Then
            If objUpdate.RebootRequired Then
                blnRebootPending     = True
            End If
        Else
            intPendingInstalls    = intPendingInstalls + 1
            'If objUpdate.RebootRequired Then    '### This property is FALSE before installation and only set to TRUE after installation to indicate that this patch forced a reboot.
            If objUpdate.InstallationBehavior.RebootBehavior <> 0 Then
                '# http://msdn.Microsoft.com/en-us/library/aa386064%28v=VS.85%29.aspx
                '# InstallationBehavior.RebootBehavior = 0    Never reboot
                '# InstallationBehavior.RebootBehavior = 1    Must reboot
                '# InstallationBehavior.RebootBehavior = 2    Can request reboot
                blnRebootRequired     = True
            End If

        End If
    Next

    WScript.Echo strServer & " has " & intPendingInstalls & " updates pending installation"

    If blnRebootRequired Then
        WScript.Echo strServer & " WILL need to be rebooted to complete the installation of these updates."
    Else
        WScript.Echo strServer & " WILL NOT require a reboot to install these updates."
    End If


    '#
    '#
    '#
    If blnRebootPending Then
        WScript.Echo strServer & " is waiting for a REBOOT to complete a previous installation."
    End If 
End Function



'#
'#
'#
Function GetArgValue( intArgItem, strDefault )
    If WScript.Arguments.Count > intArgItem Then
        GetArgValue = WScript.Arguments.Item(intArgItem)
    Else
        GetArgValue = strDefault
    End If
End Function
5
Guy

wuinstall を使用できます。保留中の更新があるかどうかを確認するための/ searchスイッチがあります。 psexecを使用してリモートで実行できます。

別のオプションは、%windir%\ windowsupdate.logを解析して、次のようなものを探すことです。#警告:インストールの呼び出しが完了しました。再起動が必要です=はい、エラー= 0x00000000

2
natxo asenjo

私は、Rob Dunnと寄稿者によって作成された pdateHf.vbs スクリプトを使用します。レポート対象のホストでローカルに実行されるため、すべてのマシンにインストールしています。 MSIパッケージを作成し、GPO経由でプッシュしました。

レポートをトリガーするために、OU相当のサーバーでスケジュールされたタスクを作成するPowerShellスクリプトのコレクションがあります。各マシンは、UpdateHF.vbsをローカルで実行し、結果を電子メールで送信するようにスケジュールされています。次に、並べ替えルールを使用して、レポート内の特徴的なテキストの検索に基づいて、結果の電子メールを色分けします。

UpdateHF.vbsは、基本的にMicrosoftが公開している自動更新APIのラッパーであるため、少し掘り下げてみると、ブール値の再起動ステータスフラグだけが必要な場合は、スクリプトのどのビットが「再起動保留中」チェックを処理するかがわかります。

これが私のシステムのコアです。Powershellはschtasks.exeの呼び出しで変数を入力します。 (パスワードに複雑な文字が含まれている場合は、バッククォートでエスケープする必要があることに注意してください。)

schtasks.exe /create /F /S $TargetHost /tn Patch /sc once /st $TargetTime /sd $StartDate /ru User /rp Password /tr "$WinPath\system32\cscript.exe $WinPath\UpdateHF.vbs $UpdateArgs"
2
AndyN

リモートボックスの管理者として、MMCを開き、イベントビューアスナップインを追加します。[別のコンピュータ]を選択します(デフォルトの[ローカルコンピュータ]ではなく)。次に、ターゲットコンピュータ名を入力します。イベントタイプでフィルタリングして、必要なものだけを表示します。これは「Windows Updateエージェント」と呼ばれ、説明は次のように始まります。

「インストールの準備ができました:次の更新プログラムがダウンロードされ、インストールの準備ができています。このコンピューターは現在、これらの更新プログラムを[日付]にインストールするようにスケジュールされています...」

2
gWaldo