Я потратил несколько дней на эту проблему, и даже если в Интернете есть несколько разных примеров, это сложная проблема, и я не могу заставить их работать в моем сценарии.Запуск процессов под конкретные учетные данные из службы Windows
У меня есть служба Windows, которая работает под учетной записью Local System. Он имеет конечную точку WCF, слушая запросы API. Когда он передается через API, служба должна начать новый процесс в системном сеансе (0) и с учетными данными учетной записи «Работник». Этот процесс является рабочим, который проверяет работу в очереди и делает это. Если он не найдет работу, он немного поспит и снова проверит. Если он найдет работу, он начнет новый процесс в том же сеансе и с теми же учетными данными и выполнит эту работу. После завершения работы он закрывается.
«Рабочий» - это учетная запись домена и член группы локальных администраторов на компьютере, которая имеет разрешения на выполнение для исполняемого файла. Машина находится в том же домене, что и учетная запись.
Проблема в том, что когда служба пытается запустить процесс, она получает код ошибки ERROR_ACCESS_DENIED (5)
из метода CreateProcessAsUser
.
Я попытался запустить тот же код на машине Windows 7 с теми же учетными данными, и он прекрасно работает, но он получает этот код ошибки при работе в Windows Server 2008.
код слишком большой, чтобы показать здесь, так Я положил его в другом месте ...
ProcessHelper: http://pastie.org/private/y7idu3nw4xv1fxzeizbn9g
служба называет StartAsUserFromService
метод, чтобы начать процесс, который внутренне вызывает CreateProcessAsUser
после установления сеанса. Процесс вызывает метод StartAsUserFromApplication
, чтобы запустить его преемника, который внутренне вызывает CreateProcessWithLogonW
.
ImpersonationContext: http://pastie.org/private/xppc7wnoidajmpq8h8sg
Сервис должен получить маркер пользователя, чтобы начать процесс в них. Для этого процесс не нужен, чтобы запустить своего преемника. Насколько я могу судить о том, что олицетворение удалось на сервере 2008, но у него нет некоторых разрешений, и я не могу понять, какой.
EDIT:
Я попробовал как локальную учетную запись администратора и учетная запись домена на компьютере Windows 7, и они прекрасно работают. Но ни один из них не работает на машине Server 2008. Там где-то должно быть разрешение, но я не знаю, где; сообщение об ошибке не помогает.
Я также попытался отметить флажок «запустить как администратор» на вкладке совместимости исполняемого файла, но это не имело никакого значения.
EDIT:
Я использовал монитор процесса, чтобы увидеть, что происходит в службе, и это, где это получает ошибку ...
Date & Time: 12/02/2014 11:44:03
Event Class: File System
Operation: CreateFile
Result: ACCESS DENIED
Path: D:\..\executable.exe
TID: 6244
Duration: 0.0000450
Desired Access: Read Data/List Directory, Execute/Traverse, Read Attributes, Synchronize
Disposition: Open
Options: Synchronous IO Non-Alert, Non-Directory File
Attributes: n/a
ShareMode: Read, Delete
AllocationSize: n/a
Impersonating: Domain\Worker
и
Date & Time: 12/02/2014 11:44:03
Event Class: File System
Operation: CreateFile
Result: ACCESS DENIED
Path: D:\..\executable.exe
TID: 6244
Duration: 0.0000480
Desired Access: Execute/Traverse, Synchronize
Disposition: Open
Options: Synchronous IO Non-Alert, Non-Directory File
Attributes: n/a
ShareMode: Read, Delete
AllocationSize: n/a
Impersonating: Domain\Worker
ли пользователь домена у входа в систему в качестве прав обслуживания? http://technet.microsoft.com/en-us/library/cc739424(v=ws.10).aspx –
@ Давид Да, это так. Несмотря на то, что они не нуждаются в них, потому что я не запускаю этот процесс как службу с помощью LogonType.Service. Я начинаю с 'LogonType.Interactive'. – Edgar
О, глупо меня. Это был тупой вопрос, который я задал. Сожалею. –