Windowsサーバーにどのセキュリティ更新プログラムが適用されてないかを、C#からMBSAを叩いてチェックする

去年の今頃、以下のようなBlogを書きました。
サーバーにどのセキュリティ更新プログラムが適用されてないかを、MBSAとC#でチェックする - メモ的な思考的な


その後、運用していく中で、

  • wsusscn2.cabファイルのダウンロードを忘れて、うまく動作しない
  • コマンドプロンプトでmbsacli.exeを実行した後、自作プログラムを実行する、という手順が面倒

ということに気づいたため、上記の点を改善してみることにしました。

■プログラムの仕様

  • 準備として、自作プログラムと、依存しているdllをmbsacli.exe等があるフォルダへコピー
  • wsusscn2.cabファイルのダウンロード(コマンドライン引数による)
  • プログラムからmbsacli.exeの実行
  • mbsacli.exeから出力されたxmlファイルを、csvファイルに変換

■利用環境

■調べたこと

Microsoft Baseline Security Analyzerの新バージョンがないか

Windows8が出ている現在、新バージョンがないか調べてみたところ、2.3のプレビュー版が登場していました。
(バージョン2.3では、DOS使用時に利用できるコマンドラインオプションが増えているといいなぁ...)
Microsoft Baseline Security Analyzer (MBSA)


プレビュー版の上、手元の環境ではWindows8関連は無かったため、前回同様2.2を利用することにしました。



MBSAで使うwsusscn2.cabファイルのダウンロード先

以下にある質問のうち、「MBSA の完全なインストールを実行しないで、MBSACLI.EXE /HF のみを使用してセキュリティ更新プログラムの確認を行う機能 ("MBSA lite") はどうなったのですか?」の中に、該当のリンクがありました。そのリンクをクリックすると、cab2ファイルのダウンロードが始まります。
MBSA よく寄せられる質問



ファイルのダウンロード

今回は同期的にダウンロードする必要があったので、WebClient.Download()を使いました。

コンソールアプリのコマンドラインオプションの扱い方

「-d」などのスイッチを使いたかったため、標準の機能では不足していました。
いろいろと調べた結果、NuGetにもある「Command Line Parser Library」を使うことにしました。
今回利用したバージョンは、「1.9.71.2 stable」です。


なお、ダウンロードしたzipファイルには3.5向けのdllは存在しなかったため、以下の手順により自分でビルドします。

  1. 「libcmdline-1.9.71.2-stable\CommandLine\src\libcmdline\CommandLine35.csproj」を開く
  2. ソリューションの上で右クリック、構成マネージャーを開く
  3. 構成を「Debug」から「Release」へと変更
  4. ソリューションをビルド
  5. 「libcmdline-1.9.71.2-stable\CommandLine\src\libcmdline\bin\Release\NET35\CommandLine.dll」ができる


あとは、以下のページを参考に、参照設定を行い、実際のコード作成を行いました。

■使い方

以下のモノを同じフォルダに入れておき、コマンドプロンプトで自作exeを叩けば、csvファイルができあがります。

  • 上記で作成したexe
  • CommandLine.dll
  • mbsacli.exe
  • wusscan.dll

■ソース

Githubにアップしました。なお、今のところ、エラーまわりはあまり考えていません。
thinkAmi/MBSAtoCSV · GitHub