У меня есть служба 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, работающей в качестве локальной системы.