оконный сервис должен взаимодействовать с пользовательским интерфейсом - PullRequest
0 голосов
/ 24 октября 2011

У меня есть служба 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

1 Ответ

0 голосов
/ 25 октября 2011

Рекомендуемые способы борьбы с изоляцией сеанса описаны в MSDN . У вас есть два варианта:

  1. Простой, но очень ограниченный способ - просто отображать диалоговые окна в пользовательском сеансе с использованием WTSSendMessage API.
  2. Более сложным, но гораздо более гибким вариантом является наличие отдельного процесса, который выполняется в сеансе пользователя (и подключается к рабочему столу пользователя). Ваша служба связывается с этим процессом, используя какой-то механизм IPC.

Для # 2 есть несколько способов, как вы можете запустить процесс в сеансе пользователя. Популярный подход заключается в подключении до при входе в систему триггера. Другой подход заключается в использовании CreateProcessAsUser . Вы можете посмотреть пример кода для его использования для запуска процесса в другом сеансе здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...