今回ご紹介するのはWSUS運用であまり実施されていないSUSDBのインデックス再構築を自動化する方法になります。
PowerShellで実行して結果をメール送信するバージョンとバッチバージョンです。
過去に紹介したWSUSクリーンアップと合わせて自動運用をしてみましょう。
過去記事(【PowerShell】WSUSのクリーンアップを定期的に自動実行)
過去記事(【PowerShell】WSUSのクリーンアップを定期的に自動実行2)
過去記事(【PowerShell】WSUSのクリーンアップを定期的に自動実行3)
事前準備
まずはこちらのJapan WSUS Support Team Blogからwsusdbmaintenance-sqlをダウンロードします。
ファイル名は「WsusDBMaintenance.sql」な感じで変更して任意の場所に保存してください。
続いて、
sqlcmdが実行可能なようにsqlcmdをこちらからダウンロードしてインストールします。
たぶんこちらのsqlsysclrtypesも求められるはずなのでこちらもダウンロードしてインストールします。
PoweShell スクリプト
以下のソースを 任意の名前.ps1 で保存します。
# メール送信設定
function SendMail{
$ToADDR = "宛先メールアドレスを指定します。複数の場合は ,(カンマ区切りで。"宛先1","宛先2") "
$FromADDR = "送信者メールアドレスを指定します。"
$SMTP = "SMTPサーバーをIPアドレスかFQDN名で指定します。"
$PortNo = "SMTPサーバーのポート番号を指定します。"
# メール送信処理
Send-MailMessage -To $ToADDR -From $FromADDR -SmtpServer $SMTP -Port $PortNo -Subject "$Subject" -Body $MailBody -Encoding UTF8
}
# SUSDBインデックス再構築処理開始通知
$Subject = "【info】SUSDBインデックス再構築処理-開始-"
$MailBody = "インデックス再構築処理を開始します。"
SendMail
# SUSDBインデックス再構築処理
$result = (sqlcmd.exe -S np:\\.\pipe\MICROSOFT##WID\tsql\query -i C:\Script\WsusDBMaintenance.sql)
if($LASTEXITCODE -eq 0){
$Subject = "【info】SUSDBインデックス再構築処理-結果-"
$MailBody = $result -join "`n"
SendMail
}else{
$Subject = "【err】SUSDBインデックス再構築処-理異常終了-"
$MailBody = "インデックス再構築処理がエラー終了しました。`r`n"
SendMail
}
(注)WsusDBMaintenance.sqlのパスとファイル名はご自身の環境に合わせて変えてください
このPowerShellスクリプトを最上位の権限で実行されるようタスクスケジューラに登録すれば自動化完了です。
バッチファイル
以下のソースを 任意の名前.bat で保存します。
sqlcmd -S np:\\.\pipe\MICROSOFT##WID\tsql\query -i C:\Script\WsusDBMaintenance.sql
(注)WsusDBMaintenance.sqlのパスとファイル名はご自身の環境に合わせて変えてください
PowerShell同様にこれを最上位の権限で実行されるようタスクスケジューラに登録すれば自動化完了です。
メール送信する必要なければこっちで十分!
おわりに
終わってしまえばすごくシンプルなPowerShellですがPowerShellでSQLファイルを実行する方法がわからなくて時間かかりました。
結局PowerShell内でsqlcmdを実行する方法しかわからなくてこうなりましたが
初心者な私にはぴったりのわかりやすいものとなりました。
この問題点としては標準エラー出力がPowerShellで拾えてないのでエラー通知でエラーの内容まではわからないってとこですが
まあエラーってことがわかればいいのでこれ以上複雑にするのはやめました。
また調査するのに膨大な時間がかかりそうだったし(笑)
WSUSのDBにWIDじゃなくてSQL Serverを使っていればスクリプトなんか用意しなくてもSQL Server Management Studioだけでできちゃいますね。