【问题标题】:Is it possible to click on Windows UAC dialog using java.awt.Robot?是否可以使用 java.awt.Robot 单击 Windows UAC 对话框?
【发布时间】:2014-11-16 21:20:17
【问题描述】:

我正在使用 Windows 7 上的 java.awt.Robot 在 Java 中使用自定义远程桌面。除了以管理员身份运行命令提示符之外,它都可以正常工作。将出现 UAC 对话框,但是使用 mousePress()/mouseRelease() 的“是”按钮不接受按钮单击,keyPress()/keyRelease() 的按键也不接受。该应用程序是通过 launch4j 启动器在启动器中启动的,而不是包装模式。

到目前为止我做过的事情

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

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

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

问题

  • 这最终可能吗?
  • 作为 launch4j 包装器的子进程的 javaw.exe 是否会产生影响?我已经阅读了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>

【问题讨论】:

    标签: java windows-7 uac awtrobot


    【解决方案1】:

    简短的回答,是的。

    了解问题

    • 可执行清单中的 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\Microsoft\Windows\CurrentVersion\SideBySide] "PreferExternalManifest"=dword:00000001

    • 触摸 javaw.exe 以更新修改时间戳 - 否则不会获取更改 - 这可以通过“复制 /b javaw.exe +,”来完成,请参阅 Windows equivalent of the Linux command 'touch'?

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

    【讨论】:

      猜你喜欢
      • 2012-10-11
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      相关资源
      最近更新 更多