У меня есть служба Windows, которая запускает графический интерфейс при запуске на ОС Win 2003.Но из-за функции безопасности, появившейся в win 2008 (Session 0 Isolation), моя оконная служба не может запускать графический интерфейс.Как я могу добиться, чтобы запустить графический интерфейс оконным сервисом на платформе Win 2008.
Примечание. Я не хочу включать «Интерактивное обнаружение служб» для достижения решения.Пожалуйста, дайте мне знать, если кто-нибудь сталкивался или реализовал упомянутую проблему.
Я создал пример сервиса, где я помещаю приведенный ниже код в функцию OnStart.Привет Сева, я просмотрел твои комментарии и сделал пример службы Windows. Я помещаю ниже код в OnStart.Служба запускается, но не отображается "notepad.exe".Можете ли вы предложить, если я делаю что-то не так здесь.
HANDLE hToken = NULL;
HANDLE hTokenDup = NULL;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof( STARTUPINFO ) );
ZeroMemory( &pi, sizeof( PROCESS_INFORMATION ) );
si.cb = sizeof( STARTUPINFO );
si.lpDesktop = _T("Winsta0\\Default");
DWORD dwCreationFlag = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;
LPVOID pEnvironment = NULL;
LPFNCREATEENVIRONMENTBLOCK lpfnCreateEnvironmentBlock = NULL;
LPFNDESTROYENVIRONMENTBLOCK lpfnDestroyEnvironmentBlock = NULL;
HMODULE hUserEnvLib = NULL;
hUserEnvLib = LoadLibrary( _T("userenv.dll") );
if ( NULL != hUserEnvLib ) {
lpfnCreateEnvironmentBlock = (LPFNCREATEENVIRONMENTBLOCK)
GetProcAddress( hUserEnvLib, "CreateEnvironmentBlock" );
lpfnDestroyEnvironmentBlock = (LPFNDESTROYENVIRONMENTBLOCK)
GetProcAddress( hUserEnvLib, "DestroyEnvironmentBlock" );
}
OpenThreadToken( GetCurrentThread(), TOKEN_DUPLICATE, TRUE, &hToken );
DuplicateTokenEx( hToken,
TOKEN_IMPERSONATE|TOKEN_READ|TOKEN_ASSIGN_PRIMARY|TOKEN_DUPLICATE,
NULL, SecurityImpersonation, TokenPrimary, &hTokenDup );
RevertToSelf( );
CloseHandle( hToken );
if ( NULL != lpfnCreateEnvironmentBlock ) {
if ( lpfnCreateEnvironmentBlock( &pEnvironment, hTokenDup, FALSE ) ) {
dwCreationFlag |= CREATE_UNICODE_ENVIRONMENT; // must specify
}
else {
pEnvironment = NULL;
OutputDebugString( _T(" CreateEnvironmentBlock() -- FAILED") );
}
}
else {
OutputDebugString(_T(" FAILED - GetProcAddress(CreateEnvironmentBlock)"));
}
CreateProcessAsUser( hTokenDup, NULL, _T("C:\\windows\\system32\\notepad.exe"),
NULL, NULL, FALSE, dwCreationFlag,
pEnvironment, NULL, &si, &pi );
if ( NULL != lpfnDestroyEnvironmentBlock )
lpfnDestroyEnvironmentBlock( pEnvironment );
if ( NULL != hUserEnvLib ) FreeLibrary( hUserEnvLib );
CloseHandle( hTokenDup );
Вышеупомянутый код, кажется, не работает, кто-нибудь может помочь мне решить эту проблему?-Dev