这是我过去在任务管理服务中使用的代码,有时需要在交互式会话中运行一些东西。将 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.
}
}
我在想,您的“指定用户帐户”必须是这里的控制台会话。如果您需要它在指定帐户中运行而该帐户尚未登录,那么您将处于一个全新的伤害世界,加载注册表配置单元等。