でのサービスのように実行されています。それはNT4で動作しましたが、現代版のWindowsでテストしていないので、NT4と同様に動作することは保証できません。
編集:いいえ、それはそのままでは機能しません。デスクトップを作成し、SIDなどを設定するにはhereというコードを追加する必要があります。
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年前の答えで、受諾も投票もないので、今はもっと時間を費やすことに消極的です。 –