none
UAC有効下における RunAsInvoker レジストリについて RRS feed

  • 質問

  • Windows 10 をドメインに参加させ、テスト運用をしております。
    8.1までは UACの設定をもっとも厳しい状態(VISTAのUAC有効相当)にして、アプリケーション、Windows のバイナリ いずれも HKLM や システムフォルダにアクセスするもの、昇格の署名のあるもの(盾マーク入)に関しては、必ず昇格の動作をするようにしていていました。

    しかしながら、一般ユーザーにおいて昇格させずに実行させたい場合には

    reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "%windir%\System32\CompMgmtLauncher.exe" /t REG_SZ /d "RunAsInvoker" /f


    などとしておけば、昇格のプロンプトを表示させず、コンピューターの管理を起動できました。
    もちろんマシンレベルの設定変更などはできませんが、設定を確認することはできます。

    Windows 10 において同様にレジストリを追加したところ、どうしても昇格動作となり、管理者のパスワード入力が求められます。
    10 になってから、UACの仕様がかわったのでしょうか?

    実際には管理者権限が必要ないのに、盾マークがあるバイナリなどがあり、無意味に昇格させる必要はないため、RunAsInvoker な状態で実行したいのですが、10では RnaAsAdmin な状態になってしまい、今のところ、上記レジストリ設定でも回避することができません。
    UACそのものを無効にし、2000やXP のような状態にすれば、一般ユーザーはその権限の範囲内でバイナリを実行することができるのかもしれませんが、管理者がサインインしている状態でのミスオペレーションを防止する意味でも UACそのものを無効にするべきではないと思います。

    上記レジストリを機能させる方法はあるのでしょうか?


    2015年9月5日 5:59

回答

  • その後いろいろ、試してみましたが、
    setx __COMPAT_LAYER "RunAsInvoker" を実行して、昇格プロンプトを出させないことができました。
    ただし、特定のバイナリに対して昇格プロンプトを出さないということはできず、すべてのバイナリを標準ユーザーとして実行する設定になります。
    通常のユーザーは Users 権限しかありませんので、これはこれでよいのですが、レジストリに設定したはずの環境変数 __COMPAT_LAYER が サインアウトすると効かなくなるようです。レジストリ上もちゃんと残っていますし、システムのプロパティの環境変数で見ても値が設定された状態です。
    しかし、設定していないのと同じような動作となるため、再度 setx __COMPAT_LAYER "RunAsInvoker" を実行しないといけませんでした。

    ログオフスクリプトで
      On Error Resume Next 
      objShell.RegDelete _
      "HKCU\Environment\__COMPAT_LAYER"
     On Error GoTo 0
    を実行して削除し、ログオンスクリプトで
    setx __COMPAT_LAYER "RunAsInvoker" を実行するとほぼ希望通りの動作にすることができました。

    海外サイトでもまだ、情報が上がってないようですが、Vista - 8.1 とは挙動が違うのは確かです。
    ビルドアップによって修正されるかな?
    結果報告でありました。

    2015年9月7日 7:08
  • チャブーンです。

    フィードバックありがとうございます。

    この件ですが、インターネット上に直接の情報はないようですが、実機で簡単に試したところ、再現したようです。

    Process Monitorで動作時の挙動を確認したところ、(該当exeの起動後に)該当レジストリの値"HKU\<SID>\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\C:\Windows\System32\CompMgmtLauncher.exe"をクエリした際の結果が"BUFFER OVERFLOW"になっていました。

    このことから、この値の呼び出しが正常にできなくて動作しない=不具合、の可能性があるように思います。こういったケースはWindows 10からフィードバックいただければ、MS開発者側で把握はしてもらえそうです。

    追記:HKU\<SID>\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layersキーのアクセス許可ですが、Windows8.1と内容は変わっていませんでしたが、継承なしの状態に変わっていました。念のためWindows8.1と同様の継承に再設定しましたが、やはり問題は改善しませんでした。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


    2015年9月9日 5:22

すべての返信

  • その後いろいろ、試してみましたが、
    setx __COMPAT_LAYER "RunAsInvoker" を実行して、昇格プロンプトを出させないことができました。
    ただし、特定のバイナリに対して昇格プロンプトを出さないということはできず、すべてのバイナリを標準ユーザーとして実行する設定になります。
    通常のユーザーは Users 権限しかありませんので、これはこれでよいのですが、レジストリに設定したはずの環境変数 __COMPAT_LAYER が サインアウトすると効かなくなるようです。レジストリ上もちゃんと残っていますし、システムのプロパティの環境変数で見ても値が設定された状態です。
    しかし、設定していないのと同じような動作となるため、再度 setx __COMPAT_LAYER "RunAsInvoker" を実行しないといけませんでした。

    ログオフスクリプトで
      On Error Resume Next 
      objShell.RegDelete _
      "HKCU\Environment\__COMPAT_LAYER"
     On Error GoTo 0
    を実行して削除し、ログオンスクリプトで
    setx __COMPAT_LAYER "RunAsInvoker" を実行するとほぼ希望通りの動作にすることができました。

    海外サイトでもまだ、情報が上がってないようですが、Vista - 8.1 とは挙動が違うのは確かです。
    ビルドアップによって修正されるかな?
    結果報告でありました。

    2015年9月7日 7:08
  • チャブーンです。

    フィードバックありがとうございます。

    この件ですが、インターネット上に直接の情報はないようですが、実機で簡単に試したところ、再現したようです。

    Process Monitorで動作時の挙動を確認したところ、(該当exeの起動後に)該当レジストリの値"HKU\<SID>\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\C:\Windows\System32\CompMgmtLauncher.exe"をクエリした際の結果が"BUFFER OVERFLOW"になっていました。

    このことから、この値の呼び出しが正常にできなくて動作しない=不具合、の可能性があるように思います。こういったケースはWindows 10からフィードバックいただければ、MS開発者側で把握はしてもらえそうです。

    追記:HKU\<SID>\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layersキーのアクセス許可ですが、Windows8.1と内容は変わっていませんでしたが、継承なしの状態に変わっていました。念のためWindows8.1と同様の継承に再設定しましたが、やはり問題は改善しませんでした。


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。


    2015年9月9日 5:22