2
을 원하는 호출 서비스에 대한예제 코드 : 서비스는에 CreateProcessAsUser()를 내가 예제 코드 추구하고있는 사용자의 세션에서 실행하는 과정이 아닌 세션 0
을에 CreateProcessAsUser()를 내가의 실행 과정을 원하는 호출 사용자의 세션이 아닌 세션 0
지금까지 생성 된 프로세스는
을 원하는 호출 서비스에 대한예제 코드 : 서비스는에 CreateProcessAsUser()를 내가 예제 코드 추구하고있는 사용자의 세션에서 실행하는 과정이 아닌 세션 0
을에 CreateProcessAsUser()를 내가의 실행 과정을 원하는 호출 사용자의 세션이 아닌 세션 0
지금까지 생성 된 프로세스는
이 세션 0에 서비스처럼 실행하는 서비스에서 콘솔 응용 프로그램을 출시 옛날 코드에서 제거되었다. NT4에서 작동했지만 현대 버전의 Windows에서 테스트하지 않았으므로 NT4에서와 마찬가지로 작동 할 것이라고 보장 할 수는 없습니다.
편집 : 아니요, 그대로 작동하지 않습니다. 찾은 코드 here을 추가하여 바탕 화면을 만들고 SID를 설정해야합니다.
if (!LogonUser(userId,
domain,
password,
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
&hUserToken))
{
return GetLastError();
}
if (!ImpersonateLoggedOnUser(hUserToken))
{
DWORD rc = GetLastError();
CloseHandle(hUserToken);
return rc;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&si, 0, sizeof(si));
memset(&pi, 0, sizeof(pi));
si.cb = sizeof(si);
rc = CreateProcessAsUser(hUserToken, // user token
0, // app name
"foo.exe", // command line
0, // process attributes
0, // thread attributes
FALSE, // don't inherit handles
DETACHED_PROCESS, // flags
0, // environment block
0, // current dir
&si, // startup info
&pi); // process info gets put here
if (!rc)
{
DWORD rc = GetLastError();
RevertToSelf();
CloseHandle(hUserToken);
return rc;
}
RevertToSelf();
CloseHandle(hUserToken);
return 0;
새 바탕 화면을 만들 필요가 없습니다. 사용자의 상호 작용하는'WinSta0 \ Default' 데스크탑 (Microsoft의 예제에서 볼 수 있듯이)과 같이'STARTUPINFO' 구조체에 기존 데스크탑을 지정합니다. 그리고 당신은 SID를 가지고 주위를 망칠 필요가 없습니다. 서비스의'CreateProcessAsUser()'는 그것들 없이는 정상적으로 작동 할 수 있습니다. 나는 아무 문제없이 몇 년 동안 서비스에서 그것을 사용 해왔고, 나는 그것을위한 SID를 조작하지 않는다. 반면에'LogonUser()'또는'ImpersonateLoggedOnUser()'를 사용하지 않고 대신'WTSQueryUserToken()'과'DuplicateTokenEx()'를 사용합니다. –
또한'CreateProcessAsUser()'를 호출하기 전에'CreateEnvironmentBlock()'을 호출해야합니다. –
@RemyLebeau 나는 (어느 정도) 동의한다. 아마도 새로운 대답을 써야 할 것입니다. 3 년 전의 답변으로 승낙도없고 투표도 없으므로 위아래로 지금 당장 더 많은 시간을 할애하기를 꺼립니다. –