2010-08-03 2 views
1

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

Приложение требует доступа к рабочему столу, поэтому оно не может быть выполнено как служба 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> 

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

*

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

+0

какими ОС вы работает на? Я не знаю, возможно ли эскалация до администратора без приглашения UAC (если UAC не отключен) в Vista/Win7. Мне никогда не приходилось работать. – Zippit

+0

Он должен работать на Windows 7, Windows Vista, Windows Server 2003/2008 и Windows XP SP3. Довольно сложная задача! – Luca

ответ

5

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

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

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

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

Еще одна небольшая проблема. В зависимости от учетной записи, используемой для процесса, который при запуске на рабочем столе пользователей в банке требует, чтобы изменить дескриптор безопасности на рабочем столе и объекты станции Windows, с уважением 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

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

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

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

+0

Согласовано. Мои проблемы с UAC (см. Мой комментарий выше) были разрешены путем записи в изолированное хранилище вместо HKLM. – Zippit

+0

На данный момент существует только SetWindowsHook, который требует более высоких привилегий, но я боюсь, что эта конфигурация (которая является системной), она не может быть сохранена в данных пользователя hive/app. Моя идея состояла в том, чтобы начать (используя службу SYSTEM) приложение, которое получает привилегии от обслуживания. Не правильный подход? – Luca

0

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

+0

Я не знаком с WCF и управляю всеми возможными взаимодействиями с UI/Service, может быть громоздким. Было бы неплохо иметь только сервис (поскольку приложение уже является распределенным), но это невозможно. – Luca

+0

Если вы вызываете методы в классе для выполнения действий из пользовательского интерфейса, обертывание этих классов в службе WCF, а затем создание классов прокси для вызова из вашего кода пользовательского интерфейса должно быть относительно простой частью рефакторинга. –

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