Quantcast
Channel: OSAKANA TAROのメモ帳
Viewing all articles
Browse latest Browse all 816

PowerShellによるWindows Updateが0x80240023で失敗する(EULAの同意問題)

$
0
0

PowerShellを使って、Windows Updateを行うスクリプトを作成中。

実物はいろんな細かい細工をしているので、似たようなものを作成すると下記のようなものとなる。

$UpdateCollection = New-Object -ComObject Microsoft.Update.UpdateColl
$Session = New-Object -ComObject Microsoft.Update.Session
$Searcher = New-Object -ComObject Microsoft.Update.Searcher
$Result = $Searcher.Search("IsInstalled=0 and Type='Software'")
foreach( $Update in $Result.Updates){
    if($Update.AutoSelectOnWebSites -eq $true){
        $UpdateCollection.Add($Update) | Out-Null
    }
}

$Downloader = $Session.CreateUpdateDownloader()
$Downloader.Updates = $UpdateCollection
$DownloadResult = $Downloader.Download()

$Installer = New-Object -ComObject Microsoft.Update.Installer
$Installer.Updates = $UpdateCollection
$InstallerResult = $Installer.Install()

これをWindows7環境で実験を行った。

まず、最初は下記のエラーが出力された。

"0" 個の引数を指定して "Download" を呼び出し中に例外が発生しました: "HRESULT からの例外: 0x80240044"

これは、スクリプトを管理者権限を持たずに実行していたためで、管理者権限を与えることで回避できた。

スクリプトを実行し再起動、ということを何回か行った後、最後の1つになったところで、以下のエラーが出力された。

"0" 個の引数を指定して "Install" を呼び出し中に例外が発生しました: "HRESULT からの例外: 0x80240023"

この「0x80240023」というものは「WU_E_EULAS_DECLINED」というエラー。

適用に失敗したものは「悪意のあるソフトウェアの削除ツール x64 – 2017 年 3月 (KB890830)」

そうです。
手動で適用しようとするとライセンスの同意画面が出てくるやつです。

で・・・探してたら「Windows Update PowerShell Module」というPowerShellでWindows Updateを行うためのモジュールが・・・
ヒントを探してみるとありました。

「$Update.EulaAccepted」が0だったら「$Update.AcceptEula() 」を実行、と

というわけで、修正したものが下記になります。

$UpdateCollection = New-Object -ComObject Microsoft.Update.UpdateColl
$Session = New-Object -ComObject Microsoft.Update.Session
$Searcher = New-Object -ComObject Microsoft.Update.Searcher
$Result = $Searcher.Search("IsInstalled=0 and Type='Software'")
foreach( $Update in $Result.Updates){
    if($Update.AutoSelectOnWebSites -eq $true){
        if($Update.EulaAccepted -eq 0){
            $Update.AcceptEula()
        }
        $UpdateCollection.Add($Update) | Out-Null
    }
}

$Downloader = $Session.CreateUpdateDownloader()
$Downloader.Updates = $UpdateCollection
$DownloadResult = $Downloader.Download()

$Installer = New-Object -ComObject Microsoft.Update.Installer
$Installer.Updates = $UpdateCollection
$InstallerResult = $Installer.Install()

Viewing all articles
Browse latest Browse all 816

Trending Articles