サンプルコードを探しています:
サービスが CreateProcessAsUser() を呼び出す場合、セッション 0 ではなく、ユーザーのセッションでプロセスを実行したい
これまでのところ、作成されたプロセスはセッション 0 のサービスのようにのみ実行されています
サンプルコードを探しています:
サービスが CreateProcessAsUser() を呼び出す場合、セッション 0 ではなく、ユーザーのセッションでプロセスを実行したい
これまでのところ、作成されたプロセスはセッション 0 のサービスのようにのみ実行されています
これは、サービスからコンソール アプリを起動する一部の古いコードから削除されました。NT4 で動作しましたが、最新バージョンの Windows でテストしていないため、NT4 での動作を保証することはできません。
編集:いいえ、そのままでは機能しません。デスクトップの作成、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;