我正在编写一个类似于VNC的远程桌面软件,并希望通过利用UIAccess权限和安全策略提供的功能来捕获UAC提示。
理论:
根据下面给定的MSDN博客,您需要将"安全设置\本地策略\安全选项\允许UIAccess应用程序在不使用安全桌面的情况下提示提升"属性设置为"已启用",以便允许具有"UIAccess"权限的应用程序在用户交互桌面而不是安全桌面上显示"UAC提示"。
https://blogs.msdn.microsoft.com/cjacks/2009/01/08/helpdesk-elevation-on-windows-vista-and-windows-7/
https://blogs.msdn.microsoft.com/cjacks/2009/10/15/using-the-uiaccess-attribute-of-requestedexecutionlevel-to-improve-applications-providing-remote-control-of-the-desktop/
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权限。
可能出了什么问题?
uiAccess
功能非常危险。正因为如此,Windows只有在以下情况下才会兑现:
- 该应用程序经过数字签名,并且
- 位于受信任的位置之一,例如C:\Program Files