Это код, который я использовал в прошлом, чтобы сделать это в службе управления задачами, которая иногда требовалась для запуска чего-либо в интерактивном сеансе. Замените 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.
}
}
Ваша "указанная учетная запись пользователя" должна была быть здесь консольной сессией, я думаю. Если вам нужно, чтобы он работал в указанной учетной записи без того, чтобы эта учетная запись уже была зарегистрирована, вы попадаете в совершенно новый мир вреда, загружая кусты реестра и т. Д.