ニコニコチャンネルメニュー

ブロマガ - ニコニコチャンネル

さぴまが

Windows10のWindowsUpdate後の自動再起動をbatで完全に阻止する話

2016/10/08 12:20 投稿

コメント:3

  • タグ:
  • 登録タグはありません
  • タグ:
  • 登録タグはありません
以前きたWindows10のAnniversaryUpdateで、「再起動するように通知する」という設定項目が消えました


そのため、WindowsUpdateした後は特にPCを使っていなければ勝手に再起動されます。
エクセルやらで未保存のデータがあろうが、動画エンコしてようが、とりあえずPCを使ってなければ再起動されます。
多分マウスとかキーボード入力を見て判断してる感じ・・・?です。10分以上触ってないとかそんな感じで。
(最悪動画見てるだけで再起動させられそう)

じゃあゲーム中などにご飯食べたり、トイレ行ったりしたら勝手に再起動されるかもしらんの?ってわけですが、一応回避方法が用意されています。それがアクティブ時間です。


ここでアクティブ時間を設定できます。そこに設定された時間は、たとえPCを放置していても「再起動する?」という通知が来るだけとなります。
じゃあこれを0時~0時にすれば大丈夫やんw かと思いきや
これ、最大12時間しか設定できません。
強制再起動を回避できるのは24時間中12時間だけです。厳選して設定しましょう!!

なんてやってられるか!!!!

と、ここで思うわけです。数時間ごとにこのアクティブ時間を変更してしまえば常にアクティブ時間になるのでは・・・?
ということで試してみましょう。

・アクティブ時間が保存されてる場所を探す
こういうのは大抵レジストリにあるだろw ってことでアクティブ時間を探してみます。
英語名だとActive Hourというらしいので、それで検索を掛けてみるとありました。



場所は「HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/Update/UX/Settings」になります。
とりあえずレジストリエディタ側から値を変更。その後に設定の方を覗くと・・・変わってる!!!
つまりここの値をbatなどで変更してあげれば良さそうです。

・batで現在時刻から適切なアクティブ時間を書き込む
流れとしては
1. 現在時刻を取得する
2. ±5などでアクティブ時間の開始、終了時間を出す
3. レジストリの値を更新する
これでなんとかなりそうです。
ということでそれが下のものになります。メモ帳にコピペで動かせるはず。
--------
@echo off
set NOW_HH=%TIME:~0,2%

set /a START_TIME=NOW_HH-5
set /a END_TIME=NOW_HH+5

if %START_TIME% lss 0 (
set /a START_TIME=%START_TIME%+24
)
if %END_TIME% gtr 24 (
set /a END_TIME=%END_TIME%-24
)

reg add "HKLM\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" /v ActiveHoursStart /d %START_TIME% /t REG_DWORD /f
reg add "HKLM\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" /v ActiveHoursEnd /d %END_TIME% /t REG_DWORD /f
--------
処理内容としては、
1. set NOW_HHに現在の時間を取得(12:34:56.78の形になってる)して、時間部分を抜き出して保存
2. set /a START_TIME, END_TIMEで時間±5を保存
時間によっては開始が-3とか、終了が26とかになるので、24h表記になるようにします(この場合は開始21、終了2)
21時~3時という指定もできるので、このやり方で大丈夫です。
3. reg addで各値をレジストリに書き込みます。

あとはこれをタスクスケジューラーで定期実行させれば良いですが、このままだと一瞬コマンドプロンプトの黒い画面が表示されるので、表示させないようにします。
よくあるのはVBSを使って、VBS内で実行させる方法なので、そちらを採用します。

--------
Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c ""C:\nantoka\aa\change_active_time.bat""", vbhide
--------

batと同じく、これをメモ帳に貼り付けて保存。拡張子を *.vbs に変更します。
"cmd /c ""*.bat""" の部分は、batファイルのフルパスを入れてください。
あと、パスにスペースが入るかもなので、"cmd /c ""C:\nantka\aa\wu.bat"""と、batのパス部分だけ2つの「"」で囲っています。(文字列内に「"」を入れるため)
batを実行すると、一瞬黒い画面が出ますが、vbsの方では黒い画面が出ません。

・タスクスケジューラーで定期実行
保存したら、コントロールパネル→管理ツール→タスクスケジューラー を起動します。
操作→基本タスクの作成 でタスクを作成します。
トリガーは一応ログオン時(PC起動時)で作成します。起動時に一応設定しておきたいし。
操作は「プログラムの開始」になります。
参照から、さっきのvbsを選択します。
タスク作成後、そのタスクのプロパティを開くとトリガーを追加できます。
そこに毎日○時で登録します。



ぼくは○時1秒に実行されるようにしましたが、0秒でも問題ないと思います。
±5時間でbatを動かすので、まぁ4時間ごとぐらいでいいんじゃないかなと。

これでタスクが作成できました。
タスクのとこを右クリすると、「実行する」という項目が出てくるので、アクティブ時間を適当な時間に設定してから実行してみましょう。
無事現在時刻±5の時間が設定されたら勝利です。
終わり。


本来ならこんな面倒なことをしなくても、ちゃんと設定できるべきな気がするよね。
まぁセキュリティうんぬん考えたらこうなったんだろうけども・・・
よく寝てる間に放置してPC動かしてたりするので、勝手に再起動されたら困るんだよね。
別にWindowsUpdateをしたくないわけじゃないけど、再起動タイミングは自分でいじらせてくれ。って感じです。
まだこれを動かして間もないですが、以前再起動が要求されるWindowsUpdateを入れてから寝ましたが、再起動されることはありませんでした。
安定稼働するかは保証しませんが、今のところぼくは大丈夫です!!!
ではでは。

コメント

cray
No.1 (2016/12/17 03:23)
参考にさせていただきました
ただ、最後のプロパティでトリガーを追加した際に"1つ以上の指定された引数が有効ではありません"と表示されて設定した項目が反映されません。なぜだかご存じないでしょうか?
さぴるす。 (著者)
No.2 (2016/12/17 13:04)
>>1
その現象になったことがないのでわからないですが、調べた限りだと「全般タブ」の下の方にあるセキュリティオプションが悪さをしているようです。
参考までに私の設定を載せておきます。
タスクの実行時に使うユーザーアカウントはメインのアカウント(管理者権限所持)にしています。
その下は「ユーザーがログオンしているときのみ実行する」の方を選択しています。
「最上位の特権で実行する」にはチェックを入れていません。

調べた際に見たサイトをいくつか載せておきます。
・「1つ以上の指定された引数が有効ではありません」というエラー
http://sookibizviz.blog81.fc2.com/blog-entry-1412.html
・Windows/タスクスケジューラでパスワードがないと
http://mw211.com/devlog/?date=20131021

2つ目の「Windows/タスクスケジューラでパスワードがないと」がわかりやすかと思いますので、こちらを参考にタスクスケジューラーを登録して頂ければ問題ないかと思います!!!
anvil
No.3 (2017/01/09 08:26)
今日はありがとうございます
劇的な改善が見られました
コメントを書き込むにはログインしてください。

いまブロマガで人気の記事