如何在运行远程桌面应用程序时访问UAC提示符?

时间:2013-09-16 10:54:16

标签: java windows operating-system uac

我用java开发了我的远程屏幕共享软件。它运行正常,但是当使用UAC时,屏幕上会出现允许/禁止提示,但远程屏幕无法看到它。所以每次用户必须手动允许它。我想知道如何摆脱这个问题?请帮忙

1 个答案:

答案 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>