Среда - VS2008, Vista SP1.
Я написал службу управления процессами, которая может запускать приложения либо в сеансе 0, либо на интерактивной консоли (обычно 1). Обратите внимание, что это НЕ нормальный режим работы, он предназначен только для внутренней отладки. В полевых условиях эти процессы будут надежно скрыты в сеансе 0. Проблемы безопасности не применяются.
Очевидно, что люди не читают это: проблемы безопасности не применяются. У нас есть десятки существующих серверных приложений (НЕ сервисов), написанных так. Мы не собираемся полностью модернизировать эти приложения, нам просто нужно иметь возможность получить доступ к их встроенным диалоговым окнам отладки при запуске собственных версий выпуска. Я уже все знаю о каноническом решении, каналах и т. Д. Если бы было допустимо добавлять удаленные интерфейсы во все эти приложения, это то, чем мы бы занимались.
Я использую следующий код для этого:
ZeroMemory (&sui, sizeof(STARTUPINFO));
sui.cb = sizeof (STARTUPINFO);
sui.wShowWindow = pTask->GetWinStartState() ;
sui.dwFlags = STARTF_USESHOWWINDOW ;
ZeroMemory (&pi,sizeof(pi));
if (bInteractive)
{
HANDLE hToken = NULL;
DWORD dwSessionId = WTSGetActiveConsoleSessionId();
WTSQueryUserToken (dwSessionId, &hToken);
sui.lpDesktop = TEXT("winsta0\\default");
LPVOID pEnv = NULL;
DWORD dwCreationFlag = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;
HMODULE hModu = LoadLibrary(TEXT("Userenv.dll"));
if (hModu )
{
if (CreateEnvironmentBlock (&pEnv, hToken, FALSE))
dwCreationFlag |= CREATE_UNICODE_ENVIRONMENT;
else
pEnv = NULL;
}
bCreatedOk = CreateProcessAsUser (hToken,
NULL,
(LPTSTR)(pTask->GetExeName()),
NULL,
NULL,
FALSE,
dwCreationFlag,
pEnv,
NULL,
&sui,
&pi);
}
else
{
bCreatedOk = CreateProcess (NULL, ... blah...);
}
Все это прекрасно работает, и я могу запускать и отслеживать собственные процессы как в сеансе службы Vista, так и в консоли. Отлично. Торты и эль для всех.
Так вот в чем проблема. Если я попытаюсь запустить приложение winforms (C #) в интерактивном режиме, то вот, похоже, что оно запускается, отображается в Process Explorer как работающее в сеансе 1, но на рабочем столе ... nada Окно не появляется вообще. Процесс запускается и выключается все нормально, но окно никогда не появляется. Точно такой же winform exe, запускаемый из explorer, также отображается в сеансе 1, но на этот раз на рабочем столе выглядит просто отлично.
Есть идеи?