Windows Updateをコマンドでコントロールする　Win10 Home対応

#はじめに
Windows 10になってWindows Updateのコントロールがやりにくくなっています。自動化させているプラグラムや長時間動作させ続ける必要のある時に勝手に再起動がかかる事と面倒です。
また、手動でUpdateを実行するにもGUIで行っていたのでは、自動化させる場合にもあまりよくありません。
今回の記事は、意図した時のみ、Windows Updateを実行させる方法です。
後、今回の方法では再起動が必要なくても、windows updateの実行で再起動を前提としています。（少しの改造＆スクリプトを追加すれば対応可能と思います。）
またPCの日付をずらす等の方法も考えられますが認証が通らなくなる等のトラブルがあるようなので今回は行っていません。

**注意1**
この方法は、Windows Updateを止めてしまうので、リスクが大きくなる事を十分に理解して下さい。
**注意2**
まだ検証が不十分な為、使用にあたっては細心の注意が必要です！

#1.今回の仕組み
コマンドラインからのUpdateは以下を参考にしています。
[Windows Update PowerShell Module](https://gallery.technet.microsoft.com/scriptcenter/2d191bcd-3308-4edd-9de2-88dff796b0bc#content)
自動化の為に、通常使用時にWindows　Updateサービスを止めておいて必要な時のみサービスを再開させます。但しサービスの中止再開には管理者の権利が必要で、更にWindows Updateでは数回、再起動がかかる場合もあるため、ここらへんを自動化しないといけないので少し工夫しています。

#2.準備(環境編）
・powershell関連
今回はpowershellを使うので準備が必要です。powershellは既にWindows10に入っていますが、デフォルトだとスクリプトを指定して実行出来ないので以下を参考にして実行セキュリティポリシーを変更してください。
[WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する](http://www.atmarkit.co.jp/ait/articles/0805/16/news139.html)

・休止関連
　これは今回とは直接関係ないですが、自動で休止や復帰を使う場合、以下を設定しておかないとwindows updateサービスを無効にしただけでは復帰してしまう為、以下を参考にして自動メンテナンスの設定をしてください。
(スケジュールされたメンテナンスによるコンピューターのスリープ解除を許可するのチェックを外して、影響のなさそうな時間帯にする）
[Windows 10で自動メンテナンスの設定を変更する方法](
https://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=017959)

#3.準備（スクリプト編）
スクリプトを幾つか用意しますが、スクリプトは全てC:\wusa 以下にある事を前提にしています。（別の所が良い方は適宜修正して下さい）
まず、下記からPSWindowsUpdate.zipをDLしてきてからc:\wusa\PSWindowsUpdate\ 以下に展開して下さい。
[Windows Update PowerShell Module](https://gallery.technet.microsoft.com/scriptcenter/2d191bcd-3308-4edd-9de2-88dff796b0bc#content)
(2016年8月13日V1.5.1)

その他用意するスクリプト
　C:\wusa　以下に下記スクリプト4つを作成して置いて下さい。

```WUpStart.bat
powershell C:\wusa\WindowsUStart.ps1
```

```WindowsUStart.ps1
sc.exe config wuauserv start= disabled
sc.exe stop wuauserv
1 | Out-File c:\wusa\check.txt -encoding UTF8
Restart-Computer -Force
```

```update.bat
cd C:\wusa
powershell C:\wusa\update.ps1
```

```update.ps1

#チェック用ファイルのチェック
if(-not(Test-Path c:\wusa\check.txt)){
    0 | Out-File c:\wusa\check.txt -encoding UTF8
    exit 0
}
$count = [int](Get-Content c:\wusa\check.txt -encoding UTF8)
if($count -eq 0){
    exit 0
}
if($count -gt 4){
    exit 0
}

$count + 1| Out-File c:\wusa\check.txt -encoding UTF8

Import-Module .\PSWindowsUpdate\PSWindowsUpdate
#取り敢えずWindowsUpdateサービスの起動
sc.exe config wuauserv start= auto

#Defenderの定義のUpDate
&"C:\Program Files\Windows Defender\MpCmdRun.exe" -SignatureUpdate

#WindowsUpdate相当実行
$ret = " "
$rcount = 0
while($ret -ne $null){
    $ret = Get-WUInstall -MicrosoftUpdate -IgnoreUserInput -AcceptAll -AutoReboot -Verbose
    $rcount = $rcount + 1
    #Write-Host "Windows Update Count: $rcount"
    if($rcount -gt 4){
        break
    }
}
#WindowsUpdateサービスを無効にして停止する。
sc.exe config wuauserv start= disabled
sc.exe stop wuauserv

#再起動していなければ、チェックファイルに0を書き込み終了を示す
0 | Out-File c:\wusa\check.txt -encoding UTF8
#Read-Host "続けるにはENTERキーを押して下さい"
exit 0
```

#4.設定編
3.で作成したスクリプトのupdate.batをタスクスケジューラに設定します。
この時、全般で、最上位の特権で実行する。トリガーを任意のユーザーのログオン時、操作で選ぶスクリプトをC:\wusa\update.bat　で設定して下さい。他は、下記設定でOKだと思います。’
[Windows10 - 管理者権限が必要なアプリを自動起動（スタートアップ）](http://pc-karuma.net/windows-10-task-schedule-without-uac-prompt/)
タスクスケジューラの最上位権限で実行するので、UACをいじらなくても確認ウインドウは表示されずに実行されます。

#5.実行
3.で作成したWUpStart.batを管理者権限で実行して下さい。
必ず強制再起動するので、保存が必要なものは保存して下さい。
一度実行すればWindows　Updateサービスは止まります。

また自動化したい場合は、タスクスケジューラにこのスクリプトを設定（4.と同じように最上位の特権で実行で設定すれば、Windows10でも自分で決めた時間でのみ実行されます。

#6.その他
今回のスクリプトで連続再起動回数の上限を設定しています。
上限（今のスクリプトだと4回）以降はWindows　Updateが実行されないようにしています。
上限以上再起動したかどうかは下記ファイルの中身を見て下さい。
Z:\M\wusa\check.txt
上限に達していなければ0で、上限に達していれば5となります。
それ以外であれば、どこかで異常終了している可能性があります。
また実行中のコマンドターミナルは処理終了で自動で閉じます。

Get-WUInstallのオプション設定によってWindowsUpdateでUpdateするものを選定出来るようです。詳細はファイルC:\wusa\PSWindowsUpdate\Get-WUInstall.ps1 を参照して下さい。