Процесс с правами администратора запускается при входе пользователя - PullRequest
1 голос
/ 03 августа 2010

Я пытаюсь выяснить, как решить проблему получения привилегий.

Приложению требуется доступ к рабочему столу, поэтому оно не может быть выполнено как служба Windows: оно должно создать окно для получения отправленного сообщения.другими процессами, использующими SendMessage (он должен использоваться для ожидания подтверждения сообщения).

Приложение должно запускаться при входе пользователя в систему и управлять сеансом пользователя (управлять приложениями, окнами ...).Одновременно можно управлять только одним пользователем.

То, что я спрашиваю, - это лучшее решение для запроса получения привилегий, поскольку это требуется приложению (выполните процесс, который вызывает SetWindowsHook).

  • Как можно запустить любой процесс при входе пользователя в систему с (более высокими) привилегиями, возможно, без запроса сообщений UAC?Операции настройки могут быть выполнены на этапе установки ...
  • Как можно запустить сервисную службу, запускающую процесс при входе пользователя в систему?Таким образом (установленная) служба может запустить эффективный процесс с любыми привилегиями ...
  • Любое другое решение?*

Какие конкретные действия необходимо предпринять для получения полностью совместимого приложения UAC?(Я имею в виду на этапах сборки и развертывания?

Например, я включаю следующий файл манифеста, используя mt.exe (используя VS2005):

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"     xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-    com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    security>
      <applicationRequestMinimum>
        <defaultAssemblyRequest permissionSetReference="Custom" />
        <PermissionSet class="System.Security.PermissionSet" version="1"     Unrestricted="true" ID="Custom" SameSite="site" />
      </applicationRequestMinimum>
        <requestedPrivileges>
                <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
        </requestedPrivileges>
    </security>
  </trustInfo>
</asmv1:assembly>

Вам это кажется правильным?Нет, потому что это не работает для меня ...

*

На самом деле имеет смысл создать дополнительную учетную запись пользователя (но это также будет работать в доменах Windows) с правами администратора длявыполнить контролируемую среду. Также было бы приемлемо создать рабочий сеанс (новую настольную станцию) без регистрации какого-либо пользователя, но на самом деле я не знаю, возможно ли это.

Ответы [ 3 ]

5 голосов
/ 03 августа 2010

Вы задаете много вопросов внутри одного вопроса. Есть много неясных вопросов (неясных для меня) об архитектуре ваших решений. Мне также совершенно непонятно, зачем вам нужно SetWindowsHook. Поэтому я стараюсь отвечать только на технические части ваших вопросов.

Запуск программы без запроса UAC не является большой проблемой и может быть исключен в отношении манифестов.

Запуск процесса на рабочем столе пользователя из службы, так что процесс запускается не с учетными данными пользователя, сложен, но возможен. Насколько я понимаю, ваш сервис работает под учетной записью SYSTEM. Тогда он имеет привилегию SE_TCB_NAME. Служба запускается в сеансе 0 (см. http://www.microsoft.com/whdc/system/sysinternals/session0changes.mspx). Если логин пользователя, процессы, которые он видит, запускаются в сеансе 1 или выше. В Windows XP первый зарегистрированный пользователь запускает сеанс 0 и только следующий логин (если включено быстрое переключение) используйте сеанс 1 и т. д. Поэтому в любой операционной системе требуется для запуска процесса в другом сеансе . Для этого следует использовать функцию SetTokenInformation с параметром TokenSessionId. Я описал детали в Запуск процесса в сеансе пользователя из службы .

Во всех случаях вы должны отслеживать входы и выходы пользователей из системы и получать идентификатор сеанса пользователя, чтобы можно было запустить процесс в сеансе. Вы можете сделать это по-разному. Одним из самых простых способов является приложение, которое запускается в режиме автозапуска (например, зарегистрировано под HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run). Это приложение связывается с вашим сервисом, и вы получаете олицетворение токена пользователя и идентификатора сеанса. Другим способом является использование ISensLogon2 уведомлений (см. http://msdn.microsoft.com/en-us/library/aa376863.aspx) Службы системных событий (SENS).

Еще одна маленькая проблема. Зависит от учетной записи, используемой для процесса, который вы запускаете на рабочем столе пользователя, может изменить дескриптор безопасности объектов рабочего стола и Windows Station в отношении OpenWindowStation, OpenDesktop и SetUserObjectSecurity (см. http://msdn.microsoft.com/en-us/library/ms681928.aspx, http://msdn.microsoft.com/en-us/library/ms687107.aspx и http://support.microsoft.com/kb/165194)

0 голосов
/ 03 августа 2010

Почему бы не иметь службу Windows, работающую в качестве учетной записи с высокими привилегиями, которая выполняет требуемые действия с высокими привилегиями, а также приложение уровня пользователя, которое выполняет любые пользовательские интерфейсы / интерактивные действия и взаимодействует с серверами Windows с помощью WCF?

0 голосов
/ 03 августа 2010

Услуги освобождены от UAC.Запланированные задачи (которые запускаются при входе пользователя) не являются.Если вам не нужна подсказка UAC, и все же вы хотите работать при входе в систему, вам лучше всего написать и то, и другое.Настройте службу для выполнения привилегированных действий - пишите в Program Files или HKLM или что-то еще.Имейте это автозапуск.Теперь настройте запланированное задание, которое запускается при входе пользователя.Когда он хочет, чтобы привилегированная вещь была сделана, он просит службу сделать это.Как они общаются, зависит от вас и от того, что делает ваше приложение.Если у вас есть база данных, вы можете иметь таблицу, в которой задача пишет запросы.Или вы можете использовать файловую систему.Или вы можете использовать более прямую интеграцию.

Файл манифеста, который вы включили в свой вопрос, сделает ваш exe поднятым.Это вызовет запрос UAC, который, как вы говорите, вам не нужен.

Наконец, вы можете вернуться к тому, почему вам нужно быть повышенным?Нет ли способа переписать эту задачу, чтобы она записывалась в AppData, HKCU или в другую менее защищенную область?Тогда вы можете просто написать задачу и покончить с ней, и вам не придется иметь дело с взаимодействием со службой.

...