Доступ к дескриптору OSK(на экранной клавиатуре) из настольного приложения без прав администратора

У меня есть приложение Delphi для настольных компьютеров, которое работает без прав администратора в Windows 7 и 8. Это приложение должно отправлять (SendInput) события мыши (щелчок и перемещение) в другие работающие приложения. Это приложение работает как драйвер для удаленного пера Wi-Fi, который управляет мышью на рабочем столе. Когда фокус находится на OSK(на экранной клавиатуре), перемещение мыши при нажатой левой клавише не работает, окна osk не перемещаются, все другие приложения перемещаются при получении этих событий mouve. Я могу получить ручку ОСК. Когда я запускаю свое приложение с правами администратора (UAC), все работает нормально, OSK перемещается, когда приложение отправляет файлы. Я думаю, что эта проблема связана с UAC. Я нашел способ обойти UAC следующим образом: http://www.thewindowsclub.com/create-elevated-shortcut-run-programs-bypass-uac, но в некоторых средах это не очень хорошая идея. Есть способ обойти UAC без подземных путей? Или как я могу заставить OSK отвечать на все события мыши, которые я ему отправляю.


1 ответ

Решение

Вот фрагмент манифеста, встроенного в Osk.exe:

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

Обратите внимание level он запрашивает, поскольку Invoker не запрашивает повышение уровня UAC, а только requireAdministrator. Другими словами, он запускается с любыми привилегиями, которые имеет стартовая программа. Вы можете сказать, что вы не получите запрос согласия при запуске Osk.exe

Что здесь важно uiAccess, При значении true программа обходит UIPI. Менее известная двойка UAC, изоляция привилегий пользовательского интерфейса, защищает от атак типа "разбойник", не позволяя другому процессу нажимать клавиши и щелчки мыши в окне, принадлежащем повышенному приложению. Такой процесс по-прежнему выполняется в режиме высокой целостности, поэтому вы не можете сами поковыряться в Osk, но у него нет включенных привилегий, которые делают приложение с повышенными правами UAC опасным.

Это не является необычным, большинство любой программы, которая использует UI Automation или предоставляет функцию доступности, должна быть в состоянии сделать это. Как и Osk.exe, он должен уметь нажимать клавиши в любом приложении. Понятно, что вы хотите сделать, а также.

Получение uiAccess не требует от пользователя согласия на приглашение, как повышение прав UAC. Операционная система должна "доверять" вам. Хорошо освещено в этой статье MSDN, раздел "UIAccess для приложений автоматизации пользовательского интерфейса". Я просто подведу итог здесь:

  • Установите uiAccess="true" в манифесте приложения
  • Ваш исполняемый файл должен иметь действительный цифровой сертификат, который вы покупаете у такого поставщика, как Verisign.
  • Ваш исполняемый файл должен храниться в каталоге, в котором запрещен доступ на запись, в подкаталоге c:\program files или c:\windows.
Другие вопросы по тегам