2016-07-18 4 views
-2

У нас есть служба, которая работает как LocalSystem. Мы используем CreateProcessAsUser и LoadUserProfile для запуска рабочего приложения в качестве конкретного пользователя. Работает просто отлично. Но если мы будем пытаться использовать CreateProcessWithTokenW, чтобы избежать явной загрузки и управления пользовательским профилем, он выходит из строя, и следующий записываются в журнале событий:CreateProcessAsUser работает, CreateProcessWithTokenW не

Faulting application name: SomeApp.exe, version: 1.0.0.0, time stamp: 0x578a7819 
Faulting module name: KERNELBASE.dll, version: 10.0.10586.494, time stamp: 0x5775e4c5 
Exception code: 0xc06d007e 
Fault offset: 0x0000000000071f28 
Faulting process id: 0x24e4 
Faulting application start time: 0x01d1df8d223316a6 
Faulting application path: C:\SomePath\SomeApp.exe 
Faulting module path: C:\Windows\system32\KERNELBASE.dll 
Report Id: a2310c0d-7ddf-4241-92c9-de03e8de71e8 
Faulting package full name: 
Faulting package-relative application ID: 

Есть хитрость, чтобы получить CreateProcessWithTokenW работать?

+0

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

+0

Я хочу, чтобы CreateProcessWithTokenW преуспел там, где это делает CreateProcessAsUser. –

+1

Невозможно рассказать вам, почему ваш код не работает, когда мы не можем видеть ваш код. См. [Ask], а затем [изменить] ваш вопрос, чтобы включить [mcve]. –

ответ

2

Когда CreateProcessWithTokenW называется - система делает RPC-вызов ncalrpc: [SECLOGON] и фактически главной задачей, выполняемой в контексте некоторой svchost. Вызывается SeclCreateProcessWithLogonW из seclogon.dll. здесь Trase этого вызова функции: enter image description here

внутренне CreateProcessAsUserW называется, но перед этим - вы можете просматривать вызов - SetTokenInformation (.. TokenSessionId ..) - поэтому другой SESSIONID назначены лексемы (прочитать комментарий об этом в MSDN - Процесс запускается в сеансе, указанном в токене. По умолчанию это тот же сеанс, который называется LogonUser. Чтобы изменить сеанс, используйте функцию SetTokenInformation.), который является этим SessionId? это ваш сервис - ищите звонок ProcessIdToSessionIdStub. но нам действительно нужно иметь интерактивный SessionId в токене, а не от сервиса. поэтому мой вывод - CreateProcessWithTokenW не подходит для exec интерактивный процесс от обслуживания

---------- EDIT -------------------- -

CreateProcessWithTokenW - очень толстая оболочка вокруг CreateProcessAsUserW. Для CreateProcessAsUserW требуется SE_ASSIGNPRIMARYTOKEN_PRIVILEGE, но CreateProcessWithTokenW - нет. по этой причине CreateProcessWithTokenW использовал удаленный вызов для службы seclogon (который имеет SE_ASSIGNPRIMARYTOKEN_PRIVILEGE) для внутреннего вызова CreateProcessAsUserW. но если у нас есть SE_ASSIGNPRIMARYTOKEN_PRIVILEGE - лучший прямой вызов CreateProcessAsUserW сам. основные ограничения CreateProcessWithTokenW, которые он установил SessionId в токен, основанный на вызывающем процессе SessionId, и мы не можем это изменить. однако CreateProcessAsUserW не модифицирует SessionId в токене, поэтому мы можем самостоятельно установить интерактивный SessionId в токен или ничего не делать, если этот токен уже с интерактивного сеанса. если мы будем называть CreateProcessWithTokenW из приложения, запускаемого службой, будет выполняться на неинтерактивной оконной станции (принадлежать сеансу 0)

+0

У вас нет упоминания о CreateProcessWithTokenW. Вместо этого речь идет о CreateProcessWithLogonW. –

+0

@AlexI нет, как CreateProcessWithTokenW и CreateProcessWithLogonW называют CreateProcessWithLogonCommonW - я не перепутать – RbMm

+0

@AlexI - смотрите - http://i.imgur.com/V51b0vx.png BOOL WINAPI CreateProcessWithLogonCommonW ( __in HANDLE hToken, __in LPCWSTR lpUsername, __in_opt LPCWSTR lpDomain, __in LPCWSTR lpPassword, __in DWORD dwLogonFlags, __in_opt LPCWSTR lpApplicationName, __inout_opt LPWSTR lpCommandLine, __in DWORD dwCreationFlags, __in_opt LPVOID lpEnvironment, __in_opt LPCWSTR lpCurrentDirectory, __in LPSTARTUPINFOW lpStartupInfo, __out LPP ROCESS_INFORMATION lpProcessInfo ); – RbMm