Windows Updateをpower shellで自動化!サーバーの夜間バックアップ後に再起動も実行。

少しIT技術的なお話。

Windows server向けの更新プログラム適用(Windows Update)ってタイミング迷いませんか?

なぜなら再起動という魔物がいるから。

本番環境でシステムがバリバリ動いてる中再起動なってやった日にゃクレームの嵐でしょう。

そんなバカはいないと思いますがw

大体夜間にやるケースが多いと思いますが、未だに正常に立ち上がってくるか見守る企業もあります。

ありえねぇ。。。

バックアップのタイミングと被って不具合が起こるケースもあったらしい。。。

あんまり見たことないですが、とりあえず、、、

「バックアップ後にWindows Updateを実行」するシェルを作ってみましょう。

Power Shellとタスクマネージャーを使って自動化

JP1とか導入してる企業だったら夜間バッチ動かして再起動とかやってるんですかね?

今回はそんなお高いものないパターンなので、自前で作ります。

まずは事前準備ですね。

1.technetからモジュールをダウンロード

まずはこちらからモジュールをダウンロードします。

https://gallery.technet.microsoft.com/scriptcenter/2d191bcd-3308-4edd-9de2-88dff796b0bc#content

PSWindowsUpdate というモジュール一式を手に入れます。

これが無いとそもそもpower shellで自動化不可能でした(というか私には無理でしたw)

2.ダウンロードしたモジュールを所定の位置に格納

解凍したPSWindowsUpdateのフォルダを以下に格納します。

C:\Windows\system32\WindowsPowerShell\v1.0\Modules\

Modulesというフォルダに入れればOKです。

3.「ファイル名を指定して実行」でpowershellと入力。以下のコマンドを2回実行

powershellを起動し以下のコマンドを実行してください。

Import-Module PSWindowsupdate

Import-Module PSWindowsupdate

なぜ同じのを2行書いているかというと、

1回目がなぜか失敗します(モジュールをインポートできない)

2回目は成功するので、何も考えず同じコマンドを2回実行しましょう。

Sponsored Links

4.動作確認

引き続きpowershellで以下のコマンドを実行してください。

Get-Command -Module PSWindowsupdate

コマンドがずらずらと出てきたら成功です。

何も出てこなければインポート出来ていないので、一度powershellを閉じて「管理者として実行」で4の手順から試してみて下さい。

5.windows updateを実行

あとは実行あるのみ!

Get-WUInstall -AcceptAll -AutoReboot

上記コマンドで実行できます(事前に更新プログラムをダウンロードしておきましょう)

-AutoRebootが書いてあるので、インストール後の再起動も勝手にやってくれます。

あとはタスクスケジューラーを使う!

ここまで出来ればあとは簡単。

先に作ったpowershellはps1ファイルとして保存しておきましょう。

そのファイルをタスクスケジューラーで実行します。

前提条件としてバックアップ後にアップデートを実行するので、イベントビューアに出てくるIDでフックすれば良いわけです!

アプリケーションログにバックアップが完了していればログがあるはず(もし無ければアプリケーションの設定でイベントビューアにログを残す設定があると思います。)

タスクスケジューラーを開いて新規でタスクを作り、トリガータブを選択します。

「タスクの開始」の箇所を「イベント時」にして該当のイベントを選択しましょう。

するとそのイベント発生時(今回はバックアップ後)にpowershellが動きます。

そしてタスクスケジューラーでpowershellを動かす注意点がもう一つ。

「操作」タブで動かすプログラムを選択するわけですが、以下のように設定しないとpower shellは動いてくれません。

プログラム/スクリプト

 %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe

引数の設定

-Command “<.ps1ファイルのパス> “

開始

<このスクリプトが実行されるときのカレントフォルダー名>

良く分からないですよねw

例を上げましょう。

プログラム/スクリプト

これは変えなくてOK。コピペです。

 %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe

引数の設定

-Command “.\test.ps1”

「-Command 」は固定で、「””」ダブルクォーテーションも必須。

test.ps1は動かすプログラム。

「.\」これも必須ですが、何かは次に書きます。

開始

<このスクリプトが実行されるときのカレントフォルダー名>

例で書くと「test.ps1」が格納されているフォルダ名です。

C:\user\desktop というフォルダにあるなら「開始」には、C:\user\desktopと入力すればOK。

そして引数の設定にある「.\」は「C:\user\desktop」とイコールです。

「C:\user\desktop」を略して「.\」としている訳ですね。

タスクスケジューラーの設定はこんな感じです。

これでバックアップ後にWindows Updateが出来る!

ここまでの設定で「バックアップのイベントが起こるとWindows Updateが実施」というジョブを作ることが出来ました。

シャットダウンや起動後にメールを送れるプログラムも組めばより完璧になります。

弱点としてはイベントログのIDが変わってしまうとプログラムが動かないという点。

タスクスケジューラーを追加して賄えばよいと思いますが、あまり美しくないですねw

メール自動送信のpowershellや弱点を補ったパワーアップ版はまた次回。

server運用している方は是非参考にしてみて下さい。

Sponsored Links