質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.04%

  • Windows Server

    299questions

    Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

  • PowerShell

    259questions

    Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

winsowsUpdateのpowershellスクリプトについて

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 148

momiji214

score 1

前提・実現したいこと

windowsSever2012R2のwinsowsUpdateスクリプトについて

社内サーバをwindowsserver2012R2に変更しました。
しばらく経過観察していましたが、どうも自動でwindowsUpdateが行われていないようです。
調べたところ、時間指定してのwindowsUpdateはできなく、推奨設定にするとwindowsUpdateが配信されるたびに
勝手にアップデート・再起動されてしまうことが分かりました。
社内で使用しているものなので、突然リブートがかかってしまうのは困るということで、

  1. windowsUpdateを見つけてインストール・ダウンロードするスクリプトをpowershellで組んで
  2. batファイルで動かし
  3. (2を)タスクスケジューラから時間指定で起動させる

手順を行いたいと考えています。

先人が作ったサンプルを拾ったのですが、powershellの経験が皆無のため調べながら改変しています。
しかし、内容が分からない部分があるので解決したいです。
分からない部分のほかに、改変したものにコメントもつけているので、間違った解釈をしているものがあれば指摘してくれたら助かります。

該当のソースコード

# 例外キャッチのデフォルト設定(ないと例外キャッチしてくれない)
$ErrorActionPreference = "Stop"

# 引数のメッセージを時刻と一緒にログに書き込むfunction
function write_log($Message)
{
    $date = (Get-Date).ToString("yyyyMMdd_HHmmss")
    $output = $date + " " + $Message
    $output | Out-File <# ログのパス #> -Append -Encoding utf8
}

try{
    write_log("Check updates Start")
# アップデートのダウンロード(開始)
    $updateSession = new-object -com "Microsoft.Update.Session"       # MicrosoftUpdateSessionオブジェクトのインスタンス化(new-object)
    $keyWord = "IsInstalled=0 and Type='Software' and BrowseOnly = 0" # 検索キーワード
    $updates = $updateSession.CreateupdateSearcher().Search($keyWord).Updates # アップデートセッションから検索キーワードに合致しているものを探し出す
    $downloader = $updateSession.CreateUpdateDownloader()             # アップデートセッションからダウンローダーを取得(変数化)      
    $downloader.Updates = $Updates      # updateSearcher().Search($keyWord)から引っ張ったアップデートをダウンロード?(ここでダウンロードしているの?)
    # 変数.Updatesの挙動が分からない・・・

    write_log("Check updates End")
# アップデートのダウンロード(終了)

    # アップデートが見つかった時の処理(なかった場合はリブートかけて終了)
    if ($downloader.Updates.Count -ne "0") {

       # 利用できるアップデートのインストール
       write_log("Downloading " + $($downloader.Updates.count) + " updates")
       $resultcode= @{0="Not Started"; 1="In Progress"; 2="Succeeded"; 3="Succeeded With Errors"; 4="Failed" ; 5="Aborted" } # ステータスのハッシュ
       $Result= $downloader.Download()  # ダウンロード2回目?

        # アップデートできる状態なら行う?(Hresultとは・・・)
        if (($Result.Hresult -eq 0) -and (($result.resultCode -eq 2) -or ($result.resultCode -eq 3)) ) { 
            $updatesToInstall = New-object -com "Microsoft.Update.UpdateColl" # UpdateCollのインスタンス化
            foreach ($Update in $Updates | where {$_.isdownloaded} ){
                $updatesToInstall.Add($Update) | out-null # アップデートファイルの追加?$updatesToInstallってインスタンスの変数じゃないの?
                write_log($Update.Title)
            }

            $installer = $updateSession.CreateUpdateInstaller() # インストーラの宣言        
            $installer.Updates = $updatesToInstall
            write_log("Update Install Start")
            $installationResult = $installer.Install() # アップデートのインストール
            write_log("Update Install End")

            # リブート
            if ($autoRestart -and $installationResult.rebootRequired) { 
                write_log("Status is Reboot Required. Reboot Start")
                Restart-Computer -Force # -Forceオプションで強制リブート
                Exit
            } # リブートif/
        } # if/
    } # if/
} # try/

# 例外発生時、ログにエラー発生の旨を吐く
catch{
    write_log("Windows Update Error")
}

特にわからない部分

1.$downloader.Updates = $Updatesの部分など、変数宣言時の「変数.Updates」の挙動
2.($Result.Hresult -eq 0) の「変数名.Hresult」の挙動
3.$updatesToInstall = New-object -com "Microsoft.Update.UpdateColl"でcomオブジェクトが入った変数に
$updatesToInstall.Add($Update)で配列のように別のオブジェクトを追加している理由

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Windows Server

    299questions

    Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

  • PowerShell

    259questions

    Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。