2015-02-11 2 views
0

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


ответ

4

Вот надрез манифеста, который встроен в Osk.exe:

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

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

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

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

Получение uiAccess не требует, чтобы пользователь согласился на приглашение, такое как повышение UAC. Операционная система должна «доверять» вам. Хорошо освещен в this MSDN article, раздел «UIAccess for UI automation applications». Я просто резюмировать здесь:

  • Set UIAccess = «истина» в манифест приложения
  • Ваш исполняемый файл должен иметь действительный цифровой сертификат, вид вы покупаете у поставщика, как Verisign.
  • Ваш исполняемый файл должен быть сохранен в каталоге, в котором запрещен доступ на запись, в подкаталоге c: \ program files или c: \ windows.
+0

Обратите внимание, однако, что 'SendInput()' ничего не выталкивает в OSK и наоборот. 'SendInput()' отправляет входные сообщения в ту же очередь, что и аппаратная клавиатура/мышь. К тому времени, когда входные сообщения обрабатываются ОС, любое приложение в данный момент получает их. Таким образом, OSK (или любое другое приложение) не знает или не заботится о том, являются ли щелчки мыши фальшивыми или реальными. Раймонд Чен [хорошее описание об этом в своем блоге] (http://blogs.msdn.com/b/oldnewthing/archive/2014/02/13/10499047.aspx) ... –

+0

..., поэтому ваш объяснение, полезное и информативное, на самом деле не объясняет, почему OSK реагирует на ввод мыши из «SendInput()», только когда приложение Леонардо работает повышенным.Он всегда должен реагировать независимо от того, работает ли приложение с повышенным или нет. UIPI избегает атак из сообщений, отправляемых непосредственно в окно на разных уровнях целостности. Это не относится к 'SendInput()'. Во всяком случае, когда приложение Leo не работает, оно, скорее всего, работает на уровне целостности, равном OSK, и в любом случае не будет блокироваться UIPI, если OSK не будет работать с повышением. –

+0

Что теперь заставляет меня задаться вопросом, действительно ли OSK запускается в случае Льва. Если да, то МОЖЕТ пояснить, почему он не может контролировать это из-за невыполненного процесса, если это действительно оказалось проблемой UAC/UIPI. –

 Смежные вопросы

  • Нет связанных вопросов^_^