从桌面应用程序访问OSK(屏幕键盘)句柄,无需管理员权限

时间:2015-02-11 12:36:46

标签: windows winapi privileges kiosk-mode

我有一个桌面delphi应用程序,在Windows 7和8上没有管理员权限运行。此应用程序需要发送(SendInput)鼠标事件(单击并移动)到另一个正在运行的应用程序。这个应用程序就像一个远程wifi笔的驱动程序,控制鼠标在桌面上。当焦点超过OSK(在屏幕键盘上)时,按下左键的鼠标移动不起作用,osk窗口不移动,所有其他应用程序在接收这些mouve事件时移动。我很容易得到OSK的处理。 当我使用管理员权限(UAC)运行我的应用程序时,一切正常,当应用程序发送mouve时,OSK会移动。 我认为这个问题与UAC有关。我找到了绕过UAC的方法http://www.thewindowsclub.com/create-elevated-shortcut-run-programs-bypass-uac,但在某些环境中并不是一个好的意识形态。 有没有办法在没有地下方式的情况下绕过UAC?或者我如何强制OSK响应我发送给他的所有鼠标事件。


1 个答案:

答案 0 :(得分:4)

以下是嵌入在Osk.exe中的清单的片段:

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  <security>
    <requestedPrivileges>
      <requestedExecutionLevel level="asInvoker" uiAccess="true"/>
    </requestedPrivileges>
  </security>
</trustInfo>

注意它要求的level asInvoker 要求提升UAC,只有 requireAdministrator 。换句话说,它以启动程序具有的任何特权运行。你可以告诉你,当你启动Osk.exe时,你不会得到同意提示

这里重要的是uiAccess。将其设置为 true ,程序将绕过UIPI。 UAC的不太知名的双胞胎,用户界面权限隔离通过禁止另一个进程将键击和鼠标点击进入由提升的应用程序拥有的窗口来防止粉碎攻击。这样的过程仍然以高完整性模式运行,这就是为什么你不能自己进入Osk的原因,但是没有启用使UAC升级的app变得危险的特权。

这并不罕见,大多数使用UI自动化或提供辅助功能的程序都需要能够执行此操作。像Osk.exe一样,它需要能够将键击戳到任何应用程序中。显然你也想做什么。

获取uiAccess不要求用户同意UAC提升等提示。操作系统必须信任&#34;您。涵盖在this MSDN article,&#34; UI自动化应用程序的UIAccess&#34;部分。我在这里总结一下:

  • 设置uiAccess =&#34; true&#34;在应用程序清单中
  • 您的可执行文件必须包含有效的数字证书,即您从Verisign等供应商那里购买的证书。
  • 您的可执行文件必须存储在c:\ program files或c:\ windows的子目录中具有写访问被拒绝的目录中。