我用java开发了我的远程屏幕共享软件。它工作正常,但是当使用 UAC 时,屏幕上会出现允许/禁止提示,但远程屏幕看不到它。所以每次用户都必须手动允许它。我想知道如何摆脱这个问题。
1 回答
这正是uiAccess
创建应用程序程序集清单中的属性的目的。
我会公然地从 Microsoft AppCompat Guy 的博客中窃取和引用:
使用requestedExecutionLevel的uiAccess属性改进提供桌面远程控制的应用程序
您必须提升应用程序。当您这样做时,您不会看到 UAC 对话框——相反,最终用户会看到。即使您决定为用户提供密码(发生这种情况),您也无法控制甚至查看提升的应用程序。
发生这种情况时,很难成为帮助台。
以下是我看到的解决此问题的 3 个解决方案:
- 没做什么。这就是我们的解决方案所做的。每次涉及海拔时,它都会失败。
- 安装服务。X公司就是这么做的。它要求用户知道管理员密码,这对我的客户来说是个问题
- 运行提升的应用程序。Y公司就是这么做的。它要求用户知道管理员密码(我的客户有问题),并且不允许您与在系统完整性级别运行的任何窗口进行交互(因此是一个不完整的解决方案)
这是我希望所有 3 人都完成的事情:
- 带有 uiAccess = true 的清单
大多数人并不真正理解这是为了什么,而 UAC 清单通常只是一个复制/粘贴事件。但是远程桌面开发人员关注它是值得的。对于任何常规软件,您通常都希望远离它——它很危险,并且回避了重要的安全功能 (UIPI)。但是,如果您正在远程处理桌面,这正是您想要的——您需要能够看到所有内容!
事实上,这很危险,我们不允许您在没有对您的应用程序进行数字签名的情况下进行设置。默认情况下,您还必须将其安装在安全位置(例如 Program Files)。您可以将组策略设置为不需要安全位置,但没有不需要签名的选项。
但是,一旦设置,它真的很强大。您将能够远程控制所有可能类型的窗口——任何完整性级别。不再有空白、无响应的屏幕。无论完整性水平如何,一切都会发生。
对于 tl;dr 版本,这里是带有uiAccess=true
选项的程序集清单:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1'
manifestVersion='1.0'>
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="client"
type="win32"
/>
<description>Oh god not Java</description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker"
uiAccess="true"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>