これは過去に、タスク管理サービスでこれを行うために使用していたコードです。これは、対話型セッションで物事を実行する必要があることがあります。 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.
}
}
「指定されたユーザーアカウント」はここのコンソールセッションでなければならないと思います。そのアカウントが既にログインしていない特定のアカウントで実行する必要がある場合は、まったく新しい世界の怪我、レジストリハイブなどをロードしています。
編集されました。セキュリティは間違いなくここの「問題」です。 –