none
visual studio でビルドする際の uiAccess="true" について RRS feed

  • 質問

  • お世話になります。

    管理者権限で起動しても UAC のダイアログが表示されずに起動できるプログラムを作りたいのですが、

    uiAccess="true" を設定し、証明書を付与し、かつMicrosoftへの申請が必要になるといくつかの web サイトに記載がありました。

    1. 上記は正しいでしょうか?

    2. 正しいとした場合、Microsoftへの申請方法を教えて頂けないでしょうか。

    よろしくお願いします。

    • 移動 チャブーンMVP 2016年8月17日 2:06 Windows Server 2012からスレッド移動
    2016年8月15日 23:41

回答

  • どのようなシナリオでフックを仕掛けようとしているか分からないのですが、

    目的の管理者権限のプロセスにフックが行えたということは、フックプロシージャは管理者権限で呼び出されるはずですので、そこでOpenProcess等を行う処理(あるいはOpenProcess等を行う待機プロセスを起動)などをすれば目的の動作(DLL Injection)を行うことができるのではと思います。

    #フックプロシージャで時間のかかる処理は避けたほうがよいです。

    追記:
    上記のようにどうにか工夫すればなんとかできるとは思いますが、将来使えなく可能性もゼロではないですし個人的にはおすすめはしません。

    • 編集済み kenjinoteMVP 2016年8月19日 4:04
    • 回答としてマーク supao 2016年8月21日 1:29
    2016年8月19日 2:37
  • ならないでしょう。

    そんなことができてしまうと、管理者権限のプロセスから情報を盗み取ったり、書き換えて不正な動きをさせたりといろんなことができてしまうので、UAC の意味がないためです。

    2016年8月18日 21:31
    モデレータ
  • 同意見で、質問者さんの目的とされているプログラムを動作させるには、対象PCのUACを無効化すべきと思います。
    • 回答としてマーク supao 2016年8月21日 1:29
    2016年8月19日 2:41

すべての返信

  • こんにちは。

    こちらのスレッドはインフラとしてのWindows Server 2012 に関する内容のディスカッションの場となりますので、お手数ですがMSDN フォーラムのWindows クライアント開発 あたりでお聞きになると回答が得られる可能性が高いと思います。

    ※わたくしに管理者権限がないので、スレッドの移動等はできないのでコメントのみで失礼いたします。


    コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。

    2016年8月17日 1:51
  • チャブーンです。

    miyamamさん、コメントありがとうございます。

    確かにおっしゃる通り、MSDN フォーラムのWindows クライアント開発の方が、適切な回答が得られるケースかと思います。
    該当フォーラムに移動させていただきました。

    supaoさん、申し訳ありませんがご了承願います。

    なお、質問者さんには、移動後スレッドに返信がありましたらご確認いただき、最終的に回答が得られましたら、その回答に対して「回答としてマーク」していただくよう、あわせてお願いいたします。


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



    2016年8月17日 2:05
  • 管理者権限で起動しても UAC のダイアログが表示されずに起動できるプログラムを作りたいのですが、

    uiAccess="true" を設定し、証明書を付与し、かつMicrosoftへの申請が必要になるといくつかの web サイトに記載がありました。

    出典を提示してください。例えばレジストリエディタ(regedit.exe)でもUACダイアログが表示されるのに、外部で作成されたアプリケーションに対してUACダイアログのバイパスを認めるとは思えないのですが…。

    例えば、管理者権限で動作するサービスのインストールを行い、UIアプリケーションからサービスへ操作を指示するという構造を取る、とかではないですか?

    2016年8月17日 2:23
  • uiAccess="true"は、署名されていて、安全な場所(windowsフォルダとかProgram Files以下)に置かれていれば発動します。
    なお、その効果は、「Administratorsユーザで起動すると、UACなしでも、昇格しているウインドウとメッセージのやりとりができる」であって、「昇格の効果が得られるとか、管理者権限が得られる」というものではありません。

    jzkey

    2016年8月17日 2:35
  • > Microsoftへの申請

    恐らく、申請の必要があるのは、「Windowsソフトウェアロゴを取得する」為なのだと思います。
    通常、マニフェストで「uiAccess="true"」としているとロゴのテストで不合格になります。

    http://download.microsoft.com/download/a/4/c/a4c003f7-76be-444b-a3b7-4e74b7d5767f/WindowsVistaSoftwareLogoSpec10J.doc

    具体的な申請の方法は、見つかりませんでしたが、上記の資料には

    「4. 他のウィンドウの UI からの入力が必要なアプリケーションの場合は、このテスト ケースをクリアするには、アプリケーションとの関係に関わらず、“uiAccess” 属性を “true” に設定し、マイクロソフトに権利放棄証書を申請する必要があります」

    という記述がありました。

    jzkeyさんもおっしゃっていますが、管理者権限が得られるわけではないイメージです。
    私の経験では例えば、Windows8 のスタート画面上に独自のウィンドウを表示したりするときに必要になったと思います。

    2016年8月17日 2:53
  • みなさま

    回答ありがとうございます。
    「uiAccess="true"」 としても管理者権限が得られないこと、承知いたしました。

    なんとか「ダイアログを表示せずに管理者権限を得た状態で起動できるプログラム」を作りたいのですが
    どなたかご存知ありませんでしょうか。

    ※操作情報を取得するため、SetWindowsHookEx を用いてあるアプリケーションの動作を
     把握したいのですが、管理者権限で起動されてしまうとフックができず、フックアプリケーションも管理者権限で
     起動したいと考えています。

    宜しくお願いいたします。

    2016年8月17日 17:32
  • なんとか「ダイアログを表示せずに管理者権限を得た状態で起動できるプログラム」を作りたいのですが
    どなたかご存知ありませんでしょうか。

    一例はすでに佐祐理さんが書いています。
    「管理者権限で動作するサービスのインストールを行い、UIアプリケーションからサービスへ操作を指示するという構造を取る」
    あとはタスクスケジューラーに登録するとか。

    いずれにせよ、インストール時に得られる管理者権限を利用して、準備しておくという形です。
    インストール時に細工せず、プログラム単体でとこだわるのであれば、方法はないと考えてください。

    2016年8月17日 23:01
    モデレータ
  • 「管理者権限で動作するサービスのインストールを行い、UIアプリケーションからサービスへ操作を指示するという構造を取る」

    あとはタスクスケジューラーに登録するとか。

    起動したアプリでやりたいことからいってサービスは無理そうな気がします。

    タスクスケジューラだったらいけるかな。

    2016年8月18日 0:03
  • 操作情報を取得するため、SetWindowsHookEx を用いてあるアプリケーションの動作を把握したいのですが、管理者権限で起動されてしまうとフックができず、フックアプリケーションも管理者権限で起動したいと考えています。

    上記の目的であれば、フックを仕掛ける側のプログラムに管理者権限は必要なく「uiAccess="true"」でいけるのではないか?と思います。

    私の環境(Win10x64)では、レジストリエディタ(管理者権限)でキーボードの"A"を入力されたときにメッセージボックスを表示するグローバルフックのプログラム(UACは表示されない管理者権限でない)が動きました。

    まとめると管理者権限のプログラムにフックを仕掛けられる条件は下記になります。

    ・マニフェストで「uiAccess="true"」と設定
    ・「信頼されたルート証明機関」に登録されている証明書で検証できるデジタル署名をつける
    ・Program Filesなど管理者で書き込めるフォルダに配置して起動する

    ※Windowsロゴを取得するには別途申請が必要

    参考サイト:
    https://technet.microsoft.com/ja-jp/library/mt634235(v=vs.85).

    http://d.hatena.ne.jp/s-kita/20121228/1356682345

    2016年8月18日 2:00
  • みなさま

    回答頂きありがとうございます。勉強になります。

    kenjinote さんが記載してくださった内容を元に、
    自己証明書を組み込んだ uiaccess=true に設定したアプリケーションをC:\Program Files(x86) へ配置することで、
    目的のアプリケーション(管理者権限で起動しても)に対してフックを仕掛けることができました。
    ありがとうございます。

    ただもう一つ問題がありまして、SetWindowsHookEx とは別に、
     openprocess -> VirtualAllocEx -> WriteProcessMemory -> CreateRemoteThread
    の流れで、上記とは別のコンソールアプリケーションに対してDLLインジェクションを行って
    フックしている箇所もありまして、こちらの処理がうまくいきませんでした。
    (すみませんこちらの処理を見落としていました。。。)

    openprocess に
    PROCESS_QUERY_INFORMATION | PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE
    を渡している箇所で ERROR_ACCESS_DENIED が返ってきてしまうのですが、
    こちらはやはり uiaccess だけではどうにもならないでしょうか。

    何度も恐れ入りますが、よろしくお願いいたします。

    2016年8月18日 16:16
  • ならないでしょう。

    そんなことができてしまうと、管理者権限のプロセスから情報を盗み取ったり、書き換えて不正な動きをさせたりといろんなことができてしまうので、UAC の意味がないためです。

    2016年8月18日 21:31
    モデレータ
  • どのようなシナリオでフックを仕掛けようとしているか分からないのですが、

    目的の管理者権限のプロセスにフックが行えたということは、フックプロシージャは管理者権限で呼び出されるはずですので、そこでOpenProcess等を行う処理(あるいはOpenProcess等を行う待機プロセスを起動)などをすれば目的の動作(DLL Injection)を行うことができるのではと思います。

    #フックプロシージャで時間のかかる処理は避けたほうがよいです。

    追記:
    上記のようにどうにか工夫すればなんとかできるとは思いますが、将来使えなく可能性もゼロではないですし個人的にはおすすめはしません。

    • 編集済み kenjinoteMVP 2016年8月19日 4:04
    • 回答としてマーク supao 2016年8月21日 1:29
    2016年8月19日 2:37
  • 同意見で、質問者さんの目的とされているプログラムを動作させるには、対象PCのUACを無効化すべきと思います。
    • 回答としてマーク supao 2016年8月21日 1:29
    2016年8月19日 2:41
  • みなさま

    ありがとうございます。
    ご指摘の通りUAC無効化するしかないような気がしますので、
    そちらも含めてもう少し整理してみたいと思います。

    ひとまず回答としてマークをさせて頂きます。
    また何かありましたらご相談させてください。

    ありがとうございました。

    2016年8月21日 1:28