これは、タスク管理サービスでこれを行うために過去に使用したコードであり、対話型セッションで何かを実行する必要がある場合がありました。wibble.exe をアプリに置き換えます。Server 2003 (つまり、NT5) で問題なく動作するはずです。NT6 でインタラクティブ モードを実行しようとはしませんでした (手間がかかりすぎました)。アプリをサービス セッションで実行したままにして、パイプ経由で対話する独自のデバッグ ユーティリティを作成しました。
STARTUPINFO sui ;
PROCESS_INFORMATION pi;
ZeroMemory (&sui, sizeof(STARTUPINFO));
sui.cb = sizeof (STARTUPINFO);
sui.wShowWindow = pTask->GetWinStartState();
sui.dwFlags = STARTF_USESHOWWINDOW;
ZeroMemory (&pi,sizeof(pi));
if (InteractiveMode)
{
HANDLE hToken = NULL;
DWORD dwSessionId = GetCurrentUserSession();
if (dwSessionId != (DWORD)-1)
{
if (WTSQueryUserToken (dwSessionId, &hToken))
{
sui.lpDesktop = TEXT("winsta0\\default");
LPVOID pEnv = NULL;
dwCreateFlags |= CREATE_NEW_CONSOLE;
HMODULE hModu = LoadLibrary(TEXT("Userenv.dll"));
if (hModu)
{
if (CreateEnvironmentBlock (&pEnv, hToken, FALSE))
{
dwCreateFlags |= CREATE_UNICODE_ENVIRONMENT;
}
else
{
pEnv = NULL;
}
}
bCreatedOk = CreateProcessAsUser (hToken,
NULL,
TEXT("wibble.exe"),
NULL,
NULL,
FALSE,
dwCreateFlags,
pEnv,
NULL,
&sui,
&pi);
}
else
{
// error case
}
}
else
{
// remote session? error case.
}
}
あなたの「指定されたユーザー アカウント」は、ここではコンソール セッションである必要があると思います。そのアカウントがまだログインしていない状態で指定されたアカウントで実行する必要がある場合は、レジストリ ハイブの読み込みなど、まったく新しい世界にいることになります。