[PHP]Windows10 PHPバッチファイルの実行権限の問題を解決する

Read More

Windows7からWindows10にアップグレードしたことによって、
PHPバッチファイルの実行において問題が発生するようになった。

その問題発生の流れを簡単に書くと、
1.PHPバッチファイル(Aバッチとする)を実行する
2.Aバッチファイルの中でさらに別のPHPバッチファイル(Bバッチとする)を叩く
3.Bバッチファイルの中でフォルダを作成する
4.Bバッチの実行権限がAdminではない(?)のでフォルダ生成に失敗する

というもの。


なおWindows7の時と同様にUAC(ユーザアカウントの制御)は通知しないに設定していた。
もちろんPCにログインしているアカウントは管理者のAdministrator

自分の考えではこれで 管理者権限で常に実行されるようになる と思い込んでいた。
実際、これで単一のバッチファイルの実行の場合これで問題なく動くようになる。
問題はバッチファイルからバッチファイルを起動してその中でフォルダを作るような場面。

まず管理者と管理者権限はイコールではない
管理者がアプリを起動させてるのに管理者権限がないというのも不思議な話だがここにUACが関わってくる。

UAC設定とは、システムに影響のあるフォルダを触る時に通知をし、
その時その時で承認を求め管理者権限を付与している、というのが正しい理解となる。
これを管理者承認モードという。

UACを「通知をしない」に設定した場合は、あくまでもこの管理者承認の手続きの一部を省略しているだけにすぎない。



--
さてUACを「通知しない」に設定していたにも関わらずバッチの実行権限がないとはどういうことだろう。

実はまだUACが邪魔をしている。


バッチファイルからバッチファイルを起動すると裏では何が起きているか一つずつ追っていく。


まず先述したUACは既に通知しないに設定しているものとする。

この状態でコマンドプロンプトを通常起動すると承認確認が省略されてコマンドプロンプトが起動する。

省略されているのは
「承認確認の通知」→「承認する(手動)」
の部分なので
管理者権限が付与された状態のコマンドプロンプトが起動する。

このコマンドプロンプトからバッチファイルを叩くと全て管理者状態で実行される。

ここまではよい。


次に、叩かれたバッチファイル中で外部のファイルを実行する処理が書いてあった場合、
先ほどの承認確認の省略がうまく処理されなくなる。

コンピュータ的に見た場合、アプリが別のアプリを起動させようとしているため、
UACの「通知する、しない」の設定に関わらず、強制的に管理者状態ではない状態でコマンドが実行される。
つまりこちらは一時的な管理者権限の付与がされていない状態。


そりゃあフォルダ作成なんかしようとしたって失敗する。


これはUACが中途半端に生きているせいなのでUACを完全に無効にしてやればよい。



■レジストリからUACを無効化する
# レジストリ設定を変更するのは自己責任で

regedit.exeを呼び出し以下のパスをたどる。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system
名前: EnableLUA
値: 1 (1: UAC有効、0: UAC無効)

この値を1から0にする。


これで常にUACが無効化された。


バッチファイルからバッチファイルを呼び出しても
UACが邪魔することもなく管理者権限を最初から持っているため処理が途中で止まったりすることがなくなる。



--
WindowsのOSのVerが上がるごとに毎度毎度、仕様は変な具合に変更される。

以前あったものが奥深くに隠されたり、動いていたものが動かなくなったり…
そのたびに情報をネットからかき集めて対応する。

Windows10は最後のOSと発表されているがこんなつまらんことに時間をかけるのは最後にしたいものだ。



-- 2016/06/23 追記
UACを無効にするとEdgeや電卓、フォトが動かなくなった。
「ビルトイン Administrator アカウントを使って、Microsoft Edge を開けません。別のアカウントでサインインしてやり直してください。」
と出る。

うーんこれは電卓が地味に困るなあ。
Edgeも動作テストしたいときもあるかもしれないし…


とりあえず画面にメッセージが出るし、バッチのバッチが動かない方が困るからUACはOffにするけど。
レジストリを書き替えるショートカットを用意して運用するってのもバカらしいなあ。