リモートのWindows PCのシャットダウン方法（shutdown.exe実行時の「アクセスが拒否されました。(5)」を解決する）

# はじめに
対象のOSはUAC（ユーザーアカウント制御）が導入されたWindows Vista以降のWindows。実際に確認したのはWindows 7とWindows 8.1のみ。
ローカルとリモートのPCでのユーザーアカウントを一致させておくとか、正しく指定するとか、シャットダウン権限を持っているとか、ファイアウォール設定とかは全部クリアした上での話。

[キーワード「shutdown "アクセスが拒否されました。(5)"」での検索](https://www.google.co.jp/search?q=shutdown+"アクセスが拒否されました。(5)")からはじめて、分かったこととか最終的にどうしたかとかをまとめておく。

shutdown.exeは"m"オプションでシャットダウン対象のリモートのPCを指定できる。
ただし、UAC（リモートUAC）でリモートからの操作が制限されている場合は次のようにアクセスが拒否されてシャットダウン処理が実行されない。

```
C:\>shutdown -s -f -t 0 -m \\Foo
Foo: アクセスが拒否されました。(5)
```

# リモートのPCをシャットダウンできるようにする方法
## UACを無効（「通知しない」）にする
シャットダウン操作を実行したいリモートのPCのUACを無効（「通知しない」）にする。
当然UACは無効になる。

## ローカルセキュリティポリシーの「ユーザー アカウント制御: 管理者承認モードですべての管理者を実行する」を無効にする
シャットダウン操作を実行したいリモートのPCのローカルセキュリティポリシー「ローカルポリシー」－「セキュリティオプション」－「管理者承認モードですべての管理者を実行する」を無効にする。
設定項目の日本語の意味がいまいち分からないけど、たぶんadministratorsグループのすべてのユーザーについて（「特権の昇格を必要とする操作が試みられた場合はすべて、ユーザーに操作の承認を求めるメッセージを表示」せずに）完全な管理者特権で実行することになるのだと思う[^1]。
とりあえずこの設定をおこなってからadministratorsグループのユーザー（administratorではない）でregedit.exeの起動を試してみたらUACのダイアログが表示されずにレジストリエディタが起動した。
これはadministratorsグループのユーザーについてUACを無効にしていることと同じであるような気がする。

## リモートUACを無効にする("LocalAccountTokenFilterPolicy"=dword:00000001)
シャットダウン操作を実行したいリモートのPCのレジストリキー「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System」に、名前が"LocalAccountTokenFilterPolicy"でDWORD値が"1"の値を追加する。
具体的なregファイルは次の通り。

```reg:disable-remote-uac.reg
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]
"LocalAccountTokenFilterPolicy"=dword:00000001
```

リモートのUACだけが無効になるので通常のUACは設定された通りのまま。

# 調査の流れ
[キーワード「shutdown "アクセスが拒否されました。(5)"」での検索](https://www.google.co.jp/search?q=shutdown+"アクセスが拒否されました。(5)")結果から、 [『shutdownコマンド』で、Windows7をリモートシャットダウンを実行した際に『アクセスが拒否されました（5）』が表示される際の対処法](https://social.technet.microsoft.com/Forums/windows/ja-JP/1bf18c0c-275c-4d53-b530-38760e88636c/) を見つけてリモートUACが原因かもという情報を得た。
それでUACの無効化と「ユーザー アカウント制御: 管理者承認モードですべての管理者を実行する」の無効化を試してみてUACが原因であることが確認できた。
そのあとに[キーワード「"リモートUAC"」での検索](https://www.google.co.jp/search?q="リモートUAC")結果からレジストリの"LocalAccountTokenFilterPolicy"でリモートUACを無効にすることができそうだと知って実際に試してみた[^2]。

# まとめ
安全ではないデスクトップに切り替わらない設定でUACの通知を有効にしている程度（デフォルトよりも一段階下）に意識は低いけどUACを無効にする気はないので「リモートUACを無効にする("LocalAccountTokenFilterPolicy"=dword:00000001)」の方法を実施した。
大多数と思われるUACの設定がデフォルトのままの人は同じ方法がいいと思う。

ここまで進めたあとに[キーワード「LocalAccountTokenFilterPolicy シャットダウン」で検索](https://www.google.co.jp/search?q=LocalAccountTokenFilterPolicy+シャットダウン)してみたところ次のページなどがヒットした。

1. [Windows 8.1 proにて、別端末からシャットダウンや再起動をする方法（Windows8） | ナビさんの日記とか。](http://navi-local.com/article/windows-8-1-pro%E3%81%AB%E3%81%A6%E3%80%81%E5%88%A5%E7%AB%AF%E6%9C%AB%E3%81%8B%E3%82%89%E3%82%B7%E3%83%A3%E3%83%83%E3%83%88%E3%83%80%E3%82%A6%E3%83%B3%E3%82%84%E5%86%8D%E8%B5%B7%E5%8B%95%E3%82%92/)
1. [隅っこのおぼえがきノート WMIにUACで引っかかる場合がある](http://sumikko8note.blog.fc2.com/?mode=m&no=63)

また[Super User](http://superuser.com/)で検索してみた結果は次の通り。

* [Posts containing 'localaccounttokenfilterpolicy shutdown' - Super User](http://superuser.com/search?q=LocalAccountTokenFilterPolicy+shutdown)

ヒット数が少ない。LocalAccountTokenFilterPolicyでリモートUACを無効にするのは好ましくないのか知られていないのか、どっちだ…

# 参考
* [Windows 7 のユーザー アカウント制御に関するベスト プラクティス](https://technet.microsoft.com/ja-jp/library/Ee679793(v=WS.10).aspx)
* [Vista以降は管理共有への接続が制限されている - Eiji James Yoshidaの記録](http://d.hatena.ne.jp/EijiYoshida/20110301/1298996603)

# 注釈
[^1]: ローカルセキュリティポリシーの「ユーザーアカウント制御: ビルトインAdministratorアカウントのための管理者承認モード」の説明を読んでそう思った
[^2]: 参考にしたのは[Windows Vista イメージに UAC のリモートの LocalAccountTokenFilterPolicy のレジストリ設定を変更する方法](https://support.microsoft.com/ja-jp/kb/942817) や [[Windows] 管理共有 (C$, D$など) にビルトイン administrator 以外は接続できない](http://rtaki.sakura.ne.jp/infra/?p=1399) （値が間違っている）など