запуск контроля учётных записей поднятый процесс от неинтерактивного сервиса (win32/.net/powershell)

Я использую третью партийную службу Windows, которая справляется с некоторыми задачами автоматизации путем запущения использования скриптов и исполняемых файлов CreateProcessAsUser (). Я сталкиваюсь с проблемами на Windows Server 2008 из-за контроля учётных записей и способа, которым повышение LUA обрабатывается через API.

Услуга работает как LocalSystem и не имеет, "Взаимодействуют С Рабочим столом", включил. Процессы выполняются как пользователи в Группе администраторов, но не учетная запись Администратора (который освобожден от многих ограничений контроля учётных записей). Все настройки по умолчанию контроля учётных записей на месте.

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

Затруднение проблемы, кажется, что единственной (общедоступной) опцией API для запуска поднятого процесса является ShellExecute () с 'runas' глаголом, но насколько я могу сказать, который нельзя назвать от неинтерактивного сервиса, или Вы добираетесь, ошибки как "Эта операция требует интерактивной станции окна".

Единственное обходное решение, которое я нашел, упоминается здесь: http://www.eggheadcafe.com/software/aspnet/29620442/how-to-proper-use-sendinp.aspx

В Vista зарегистрированный способ чиновника поднять процесс только использует API ShellExecute оболочки (Исключая) (не CreateProcess или CreateProcessAsUser). Таким образом, Ваше приложение должно назвать ShellExecute (Исключая) запустить помощника, поднятого для вызова SendInput. Кроме того, из-за Сессии 0 изоляции, сервис может только использовать CreateProcessAsUser, или CreateProcessWithLogonW (не может использовать ShellExecute (Исключая)) указывать интерактивный рабочий стол.

.. Я думаю, что нет никакого прямого способа породить поднятый процесс от сервиса окон. Мы можем только сначала использовать CreateProcessAsUser или CreateProcessWithLogonW для порождения неподнятого процесса в сеанс пользователя (интерактивный рабочий стол). Затем в неподнятом процессе, это может использовать ShellExecute (Исключая) породить поднятый процесс для реальной задачи.

Чтобы сделать это из кода .net/powershell, похоже, что я должен был бы сделать, некоторые разрабатывают материал P/Invoke для вызова CreateProcessAsUser или CreateProcessWithLogonW начиная с.Net System. Диагностика. ProcessStartInfo не имеет эквивалента lpDesktop, который я мог установить на "winsta0\default". И я не ясен на том, если LocalSystem даже имеет права назвать CreateProcessAsUser или CreateProcessWithLogonW.

Я также посмотрел на http://blogs.msdn.com/alejacma/archive/2007/12/20/how-to-call-createprocesswithlogonw-createprocessasuser-in-net.aspx и Процесс. Запустите с различных учетных данных с контролем учётных записей на

На основе всего этого я сделал вывод, что нет никакого простого способа сделать это. Я пропускаю что-то? Это действительно не кажется, что должно быть настолько твердо. Такое чувство, что контроль учётных записей просто никогда не разрабатывался для обработки неинтерактивных вариантов использования.

И если какие-либо люди Microsoft заканчивают тем, что читали это, я заметил, что способ, которым ShellExecute внутренне обрабатывает повышение, путем обращения к Сервису информации приложений (AIS). Почему тем же самым вызовом не является к AIS, доступному через некоторый Win32 или.NET API? http://msdn.microsoft.com/en-us/library/bb756945.aspx

Извините, что работал немного долго. Спасибо за любые идеи.

16
задан Community 23 May 2017 в 12:00
поделиться