是否可以使用java.awt.Robot单击Windows UAC对话框?

时间:2014-09-22 19:47:37

标签: java windows-7 uac awtrobot

我正在使用Windows 7上的java.awt.Robot处理Java中的自定义远程桌面。除了以管理员身份运行命令提示符之外,它还有效。将显示UAC对话框,但是使用mousePress() / mouseRelease()的“是”按钮不接受按钮点击,也不会使用keyPress() / keyRelease()进行按键操作。该应用程序通过启动器中的launch4j启动器启动而不是环绕模式。

到目前为止我做过的事情

为UAC禁用安全桌面。这允许应用程序的屏幕抓取器部分至少“看到”提示

关注Security Considerations for Assistive Technologies - 这允许远程桌面在启动后与命令提示符进行交互,但不允许按“是”按钮。

  • 为launch4j添加了一个清单,指定了uiaccess = true
  • 使用signtool.exe使用makecert.exe生成的自签名证书签名.exe
  • 已安装的证书为“受信任的根证书”
  • 已验证.exe通过右键单击属性,数字签名
  • 标记为可信任
  • 确保.exe位于受信任位置,在这种情况下为c:\ Program Files(x86)\。
  • 尝试将部分应用作为管理员的服务运行 - 但是我无法获得以管理员身份运行并允许访问桌面的Windows服务 - 似乎只有LocalSystem可以这样做...?

问题

  • 这最终可能吗?
  • javaw.exe是launch4j包装器的子进程吗?我已经阅读了Windows Integrity Mechanism Design但是我不知道这种效果如何launch4j。

Launch4j清单文件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
            <requestedExecutionLevel level="asInvoker" uiAccess="true" />
        </requestedPrivileges>
    </security>
    </trustInfo>
</assembly>

1 个答案:

答案 0 :(得分:2)

简短回答,是的。

了解问题

  • 可执行清单中的uiAccess标志似乎仅适用于该exe而不是任何子执行,即如果foo-launcher.exe启用uiAccess并启动javaw.exe并不意味着javaw.exe已启用uiAccess。
  • 当我以管理员身份运行foo-launcher.exe时,我看到正常工作的唯一原因是foo-launcher.exe也以管理员身份启动javaw.exe,这使得它足够完整,不需要uiAccess检查。
  • javaw.exe有自己的内部清单,其中包含uiAccess true
  • 内部清单优先于外部 - 请参阅UAC: Manifest file is ignored
  • 存在一个注册表项,用于切换首选内部优先于外部清单的行为 - 见How to prevent embedded manifest from being used?
  • Launch4j生成的可执行文件使用CreateProcess,这意味着在没有清单数据的情况下启动可执行文件,显然应该使用ShellExecuteEx - 参见How can I run a child process that requires elevation and wait?

解决问题

  • 从javaw.exe中提取内部清单,并将其放在文件名为javaw.exe.manifest的同一目录中 - 这可以手动完成,因为它是纯文本 - 我使用的是notepad ++。如果您需要自动化,则存在各种第三方工具。
  • 将清单编辑为uiAccess =“true”
  • 应用注册表修复程序 注册表修复

    [HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows \ CurrentVersion \ SideBySide] “PreferExternalManifest”= DWORD:00000001

  • 触摸javaw.exe以更新修改时间戳 - 否则不会更改更改 - 可以使用“copy / b javaw.exe + ,,”参见Windows equivalent of the Linux command 'touch'?

    < / LI>
  • 仔细检查javaw.exe安装在C:\ Program Files,C:\ Program Files(x86)或其他一些受信任位置
  • 仔细检查javaw.exe是否使用可信证书签名。
  • 不要使用launch4j生成的可执行文件 - 它们根本不支持在启用uiAccess的情况下启动javaw.exe,使用快捷方式文件(.lnk)或在ShellExecuteEx上构建的其他方法