Translate

2017年8月8日火曜日

Windows Updateが失敗する問題の対処法

 Windowsの機能拡張やセキュリティ更新などシステム管理には必須のWindows Updateですが、ごくまれに更新中に失敗すると何度やっても更新できなくなることがあります。
 これまでのMSP(個別の更新プログラム)なら、Microsoftカタログから更新プログラムをダウンロードしてきて手動で更新したり、DISMを使ってクリーンナップすることで大体問題が解決するのですが、最近良くWindows Updateで見かける「品質ロールアップ」は若干事情が違うようです。

■対処法

 Windowsの更新プログラムは通常MSPファイルが使用されますが、品質ロールアップではMSUファイルが使用されます。
 MSPファイルによる更新の場合は「DISM」を使ってから、再度Windows Updateを実行したり手動で更新プログラムをインストールすることで大体の問題が解決します。
 MSUファイルによる更新の場合は「システム更新準備ツール」を使って解決させます。

■DISMを使う

 更新プログラムがMSPファイルだった場合、DISMを使ってクリーンナップをした後にWindows Updateを再実行します。もしくは、手動で更新プログラムをインストールする方法もあります。
  1. コマンドプロンプトを起動する
  2. 管理者権限を使ってコマンドプロンプトを起動します。
  3. DISMを実行する
  4. DISM.exe /Online /Cleanup-image /Restorehealth
    
  5. SFCを実行する
  6. sfc /scannow
    
  7. 再度Windows Updateを実行
  8. 再度Windows Updateを実行します。もしくは、Microsoft Update カタログから更新プログラムをダウンロードして手動でインストールします。

■システム更新準備ツールを使う

 更新プログラムがMSUファイルだった場合、システム更新準備ツールを使って問題を解決します。
  1. システム更新準備ツールをインストール
  2. システム更新準備ツールをダウンロードしてインストールします。
  3. 更新プログラムのダウンロード
  4. Microsoft Update カタログから問題のある更新プログラム(*.msu)をダウンロードする。
  5. ファイルをコピーする
  6. 「%SYSTEMROOT%\CheckSUR\packages」ディレクトリを作成し、そこに更新プログラムをコピーします。
  7. システム更新準備ツールを実行する
  8. システム更新準備ツールを実行します。

※注意

 ここでの説明はかなり省略している部分があります。例えば、システム更新準備ツールを使った出順の場合、作業1の前に問題のある更新プログラムを特定する作業があります。
 上手くいかない場合は下記の参考資料をご覧ください。

■参考資料


MSPファイルとは

 MSI(Windows Installer)でインストールされたプログラムの一部もしくは全ての設定やファイルを、修正または更新されたものに書き換えるためのパッケージです。通常「修正プログラム」や「更新プログラム」などと呼ばれています。

MSUファイルとは

 簡単に説明すると複数の更新プログラムをひとつのファイルにまとめたもので、Windows Updateスタンドアロン インストーラーというプログラムに関連付けられています。
 詳しくはこちらをご覧ください。

Microsoft Update カタログ

Microsoft Update カタログを使うと、Windows Updateの更新プログラムをダウンロードして手動でインストールする事ができます。更新プログラムには通常「KB○○」という番号が振られていますので、これを使って検索することが出来ます。ちなみにKBは「Knowledge Base」の略です。

2017年8月1日火曜日

PowerShellを使って特定のプログラムがインストールされているPCを調べる

 多数のPCを管理しているとどのPCにどのプログラムがインストールされているか把握しきれなくなってきます。記録を残して管理をしていても、記入漏れが発生したり、ユーザー自身がインストールしていることも・・・。
 そこで今回はPowerShellを使って、特定のプログラムがインストールされているPCからメールを送信する方法について説明します。
 FlashPlayerなんて勝手にインストールされるくせに、アップデートされずセキュリティホールだらけの古いバージョンが放置されるなんて日常茶飯事なので・・・。

PowerShellのスクリプトファイルを作る

 適当なファイル名、例えば「CheckProgram.ps1」などでスクリプトファイルを作成します。

CheckProgram.ps1の内容

Param(
[string]$program
)

$value = (Get-WmiObject -Class Win32_Product | Select-Object Name, Version | Select-String $program)

if ($value -ne $null) {
    $subject = $program + "が検出されました。"
    $computer = $env:COMPUTERNAME
    $encoding = [System.Text.Encoding]::UTF8
    $body = "Computer: " + $computer + "`r`n" + $value

    Send-MailMessage -to "to@example.com" -from "from@example.com" -subject $subject -body $body -encoding $encoding -SmtpServer "mail.example.com"
}
 プログラムの名称に引数「-program」で指定した文字列を含む場合、そのコンピュータ名とプログラム名、バージョンが「to@example.com」にメールが送られるようになります。
 Send-MailMessageの引数「-to」「-from」「-SmtpServer」は適所変更してください。

GPOでタスクスケジュールに登録する

 上で作成したスクリプトをタスクスケジュールで実行させます。トリガーの設定は適当に設定してください。
 新しく操作を追加し、操作には「プログラムの開始」、「プログラム/スクリプト」「引数の追加(オプション)」には下記の内容を設定します。

プログラム/スクリプト

powershell

引数の追加(オプション)

-NoProfile -ExecutionPolicy Bypass "\\example\scripts\CheckProgram.ps1" -program "Flash Player"
"\\example\scripts\CheckProgram.ps1"はスクリプトを保存したフルパスを指定します。
引数「-program」の後ろ("Flash Player")を変えることで別のプログラムの監視も出来ます。