C # и .NET 3.5 - Как запустить процесс с использованием разных учетных данных, со скрытым окном и возможностью захвата стандартного кода вывода и выхода? - PullRequest
3 голосов
/ 13 марта 2009

У меня есть служба Windows, разработанная на C # и .NET 3.5 для выполнения различных административных задач во всех трех наших доменах. У меня есть учетная запись администратора в каждом домене, которая имеет необходимые права / разрешения для того, что делает этот сервис.

Для всех взаимодействий AD я могу связываться с AD, используя правильное имя пользователя / пароль для домена, и все хорошо. Однако сейчас мне нужно запустить внешний процесс (robocopy) для выполнения какой-либо работы, и я не могу найти ни одного примера кода для этого в .NET 3.5.

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

Я нашел какой-то старый код .NET 1.1 из K. Блог Скотта Аллена (см. Последние несколько комментариев для хорошего списка кода), который расширяет объект System.Diagnostics.Process и вызывает функцию Win32 API CreateProcessAsUserW. Однако код не работает из-за некоторых изменений API в .NET 2.0. Использование фрагмента кода из последнего комментария в ссылочном блоге, где он использует отражение для вызова частной функции SetProcessHandle объекта Process, вызывает ошибки Access Denied, когда я пытаюсь взаимодействовать с процессом (убить его или получить код выхода).

У кого-нибудь есть хороший пример того, как этого добиться?

РЕДАКТИРОВАТЬ: встроенный .NET Process и ProcessStartInfo API действительно позволяет вам указать альтернативные учетные данные, но когда вы это сделаете, он хочет создать видимое окно (даже если вы укажете скрытый CreateNoWindow или WindowStyle), которое не будет работать при Служба Windows. Так что это не вариант для этого приложения. Олицетворение также не работает, поскольку при запуске внешнего процесса используются учетные данные родительского процесса, а не олицетворенные учетные данные.

РЕШЕНИЕ: Как указал Рид ниже, P / Invoke, использующий одну из функций Win32 API, должен позволить вам сделать это. В итоге я пошел по другому пути, используя старую бесплатную утилиту NT4 RunProcess , которая позволяет вам указать имя пользователя / пароль в командной строке. Он работал на Vista и 2k3, а также корректно работал при запуске службой Windows, работающей в качестве локальной системы.

Ответы [ 5 ]

4 голосов
/ 13 марта 2009

Я думаю, вы хотите посмотреть на:

ProcessStartInfo

Это обеспечивает .NET единственный способ запустить процесс под другим пользователем с другими учетными данными. Больше нет необходимости в Win32 API.

--- РЕДАКТИРОВАТЬ ---

Другими альтернативами может быть использование P / Invoke, как указано здесь (сначала посмотрите примечание внизу) или, более вероятно, использование P / Invoke с CreateProcessWithLogonW .

1 голос
/ 13 марта 2009

Просто непроверенная мысль, но разве использование динамического Impersonate допустимо для всего блока кода в .net 2+? Итак, выдайте себя за требуемого пользователя, а затем сделайте все, что вам нужно в олицетворенном контексте / области, например, запустив процесс обычным способом? Думаю, мы сделали что-то подобное для интеграции запуска mstsc.exe с использованием уже предоставленных учетных данных.

0 голосов
/ 18 марта 2010

Если вы хотите увидеть те коды выхода, которые действительно используются, загляните на www.robocopyplus.com. он действует как обертка вокруг robocopy, добавляя сообщения для уведомления по электронной почте и фильтрации отчетов. Это может уже сделать кое-что из того, чего вы пытаетесь достичь.

0 голосов
/ 13 марта 2009

StartInfo имеет свойство CreateNoWindow, которое может заставить предложение Рида работать на вас.

0 голосов
/ 13 марта 2009

Это должно хорошо работать с классом Process и ProcessStartInfo.

Различные учетные данные:

Стандартный перенаправленный вывод:

Код выхода:

Надеюсь, это поможет.

Matthias

...