私は VNC に似たリモート デスクトップ ソフトウェアを作成しており、UIAccess のアクセス許可とセキュリティ ポリシーによって提供される機能を利用して、UAC プロンプトをキャプチャしたいと考えていました。
仮説:
以下の MSDN ブログに従って、「UIAccess」権限を持つアプリケーションを許可するには、「セキュリティ設定\ローカル ポリシー\セキュリティ オプション\UIAccess アプリケーションがセキュリティで保護されたデスクトップを使用せずに昇格を求めることを許可する」プロパティを「有効」に設定する必要があります。安全なデスクトップではなく、ユーザーのインタラクティブなデスクトップに「UAC プロンプト」が表示されるようにします。
https://blogs.msdn.microsoft.com/asklar/2012/03/14/remote-assistance-and-uac-prompts/
観察: 以下のコードでプログラムを作成しました。
static void Main()
{
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Verb = "runas";
p.Start();
}
次に、以下を app.manifest に追加しました
<requestedExecutionLevel level="asInvoker" uiAccess="true" />
次に、 MSDN フォーラムの指示に従ってアプリケーションに自己署名しました。
次に、プログラムを Program Files (x86) フォルダーのサブフォルダーに手動でコピーしました。
次に、「セキュリティで保護されたデスクトップを使用せずに UIAccess アプリケーションが昇格を要求できるようにする」セキュリティ ポリシーを有効にしました。
(証明書を生成したのと同じシステムで) プログラムを実行すると、UAC プロンプトがユーザーの対話型デスクトップに表示されることを期待していました。ただし、呼び出したアプリケーションが UIAccess 権限を持っていても、「安全なデスクトップ」で実行されています。
何がうまくいかなかったのでしょうか?