我用java开发了我的远程屏幕共享软件。它运行正常,但是当使用UAC时,屏幕上会出现允许/禁止提示,但远程屏幕无法看到它。所以每次用户必须手动允许它。我想知道如何摆脱这个问题?请帮忙
答案 0 :(得分:1)
这正是为应用程序的程序集清单中的uiAccess
属性创建的。
我会偷偷地窃听并引用微软AppCompat Guy的博客:
Using the uiAccess attribute of requestedExecutionLevel to Improve Applications Providing Remote Control of the Desktop
您必须提升申请。当您这样做时,您看不到UAC对话框 - 而是最终用户。即使您决定向用户提供密码(它发生),您也无法控制甚至看到提升的应用程序。
当发生这种情况时,很难成为帮助台。
以下是我在这个问题上看到的3个解决方案:
- 什么都不做。这就是我们的解决方案所做的。每次升降都会失败。
- 安装服务。这就是X公司所做的。它要求用户知道管理员密码,这对我的客户来说是个问题
- 运行提升的应用程序。这就是Y公司所做的。它要求用户知道管理员密码(我的客户的问题),并且也不允许您与任何以系统完整性级别运行的窗口进行交互(所以这是一个不完整的解决方案)
这就是我希望所有人做过的事情:
- 使用uiAccess表示真实
大多数人并不真正理解这是为了什么,而UAC清单通常只是一个复制/粘贴事件。但是,远程桌面开发人员需要注意它,这是值得的。对于任何常规软件,您通常希望远离它 - 这很危险,并且避开重要的安全功能(UIPI)。但如果您正在远程操作桌面,那么它正是您想要的 - 您需要能够看到所有内容!
事实上,这很危险,我们不会允许您在没有对应用程序进行数字签名的情况下进行设置。默认情况下,您还必须将其安装在安全位置(例如Program Files)。您可以将组策略设置为不需要安全位置,但不能选择不需要签名。
然而,一旦设置,它真的很强大。您将能够远程控制所有可能的窗口 - 任何完整性级别。没有更多空白,无响应的屏幕。无论诚信水平如何,一切都会遇到。
对于tl; dr版本,这里是使用uiAccess=true
选项的assemblymanife:
<?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>