トップ回答者
visual studio でビルドする際の uiAccess="true" について

質問
回答
-
どのようなシナリオでフックを仕掛けようとしているか分からないのですが、
目的の管理者権限のプロセスにフックが行えたということは、フックプロシージャは管理者権限で呼び出されるはずですので、そこでOpenProcess等を行う処理(あるいはOpenProcess等を行う待機プロセスを起動)などをすれば目的の動作(DLL Injection)を行うことができるのではと思います。
#フックプロシージャで時間のかかる処理は避けたほうがよいです。
追記:
上記のようにどうにか工夫すればなんとかできるとは思いますが、将来使えなく可能性もゼロではないですし個人的にはおすすめはしません。- 編集済み kenjinoteMVP 2016年8月19日 4:04
- 回答としてマーク supao 2016年8月21日 1:29
すべての返信
-
こんにちは。
こちらのスレッドはインフラとしてのWindows Server 2012 に関する内容のディスカッションの場となりますので、お手数ですがMSDN フォーラムのWindows クライアント開発 あたりでお聞きになると回答が得られる可能性が高いと思います。
※わたくしに管理者権限がないので、スレッドの移動等はできないのでコメントのみで失礼いたします。
コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。
-
チャブーンです。
miyamamさん、コメントありがとうございます。
確かにおっしゃる通り、MSDN フォーラムのWindows クライアント開発の方が、適切な回答が得られるケースかと思います。
該当フォーラムに移動させていただきました。supaoさん、申し訳ありませんがご了承願います。
なお、質問者さんには、移動後スレッドに返信がありましたらご確認いただき、最終的に回答が得られましたら、その回答に対して「回答としてマーク」していただくよう、あわせてお願いいたします。
フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。
- 編集済み チャブーンMVP 2016年8月17日 2:07
-
管理者権限で起動しても UAC のダイアログが表示されずに起動できるプログラムを作りたいのですが、
uiAccess="true" を設定し、証明書を付与し、かつMicrosoftへの申請が必要になるといくつかの web サイトに記載がありました。
出典を提示してください。例えばレジストリエディタ(regedit.exe)でもUACダイアログが表示されるのに、外部で作成されたアプリケーションに対してUACダイアログのバイパスを認めるとは思えないのですが…。
例えば、管理者権限で動作するサービスのインストールを行い、UIアプリケーションからサービスへ操作を指示するという構造を取る、とかではないですか?
-
> 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 のスタート画面上に独自のウィンドウを表示したりするときに必要になったと思います。 -
-
操作情報を取得するため、SetWindowsHookEx を用いてあるアプリケーションの動作を把握したいのですが、管理者権限で起動されてしまうとフックができず、フックアプリケーションも管理者権限で起動したいと考えています。
上記の目的であれば、フックを仕掛ける側のプログラムに管理者権限は必要なく「uiAccess="true"」でいけるのではないか?と思います。
私の環境(Win10x64)では、レジストリエディタ(管理者権限)でキーボードの"A"を入力されたときにメッセージボックスを表示するグローバルフックのプログラム(UACは表示されない管理者権限でない)が動きました。
まとめると管理者権限のプログラムにフックを仕掛けられる条件は下記になります。
・マニフェストで「uiAccess="true"」と設定
・「信頼されたルート証明機関」に登録されている証明書で検証できるデジタル署名をつける
・Program Filesなど管理者で書き込めるフォルダに配置して起動する※Windowsロゴを取得するには別途申請が必要
参考サイト:
https://technet.microsoft.com/ja-jp/library/mt634235(v=vs.85).- 編集済み kenjinoteMVP 2016年8月18日 4:30
-
みなさま
回答頂きありがとうございます。勉強になります。
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 だけではどうにもならないでしょうか。何度も恐れ入りますが、よろしくお願いいたします。
-
どのようなシナリオでフックを仕掛けようとしているか分からないのですが、
目的の管理者権限のプロセスにフックが行えたということは、フックプロシージャは管理者権限で呼び出されるはずですので、そこでOpenProcess等を行う処理(あるいはOpenProcess等を行う待機プロセスを起動)などをすれば目的の動作(DLL Injection)を行うことができるのではと思います。
#フックプロシージャで時間のかかる処理は避けたほうがよいです。
追記:
上記のようにどうにか工夫すればなんとかできるとは思いますが、将来使えなく可能性もゼロではないですし個人的にはおすすめはしません。- 編集済み kenjinoteMVP 2016年8月19日 4:04
- 回答としてマーク supao 2016年8月21日 1:29