Запуск із сервісу на активному Desktop із правами адміністратора

Є сервіс (свій), що працює в Windows Vista. Потрібно отримати доступ до активного десктопу, щоб була можливість установки хука і заодно - роботи з користувачем. (Одразу скажу - пишу щось на кшталт http://www.lanagent.ru/, хоч таке тут і не люблять).

Що пробував: Сервіс отримує повідомлення про зміну користувачів в HandlerEx , приймаючи SessionID . Далі WTSQueryUserToken>DuplicateTokenEx(..TokenPrimary..)>CreateProcessAsUser . При цій послідовності моя програма запускається, користувача, відповідно – у процеси, запущені "від адміністратора" хук не встановлюється. GetTokenInformation(. TokenGroups. ) "каже", що для SID групи "Адміністратори" встановлений атрибут SE_GROUP_USE_FOR_DENY_ONLY (це ж підтверджує і ProcessExplorer). Спроба підміни атрибута на SE_GROUP_OW ps. ) дає помилку "Неправильний параметр". Спроба SetTokenInformation(. TokenPrimaryGroup. ) відпрацьовує нормально, але результатів ніяких не дає. SetTokenInformation(. TokenOwner. ) видає помилку 1307 - Invalid Owner (в принципі і зрозуміло:) )

Пробував задіяти токен самого сервісу та підмінити в ньому SessionId - (OpenProcessToken>DuplicateTokenEx>SetTokenInformation(. TokenSessionId.. .) ) отримую (5) ERROR_ACCESS_DENIED і процес запускається на десктопі інтерактивних служб.

Програми схожого спрямування (RAdmin, ROM. ) якось роблять це - інтерактивні процеси, що запускаються їх службами, є дочірніми до їхніх же служб. Причому закладка Security інтерактивного процесу в ProcessExplorer змушує думати, що за основу запуску взято токен сервісу (більшість привілеїв мають статус DefaultEnabled і т.д.).

Що я не враховую?

Спробую поставити питання коротше. В описі параметрів CreateProcessAsUser по hToken написано: The process is run in the session specified in the token. By default, this is the same session that calledLogonUser. Щоб змінити session, використовуватиSetTokenInformationфункцію.

В описі SetTokenInformation: Виберіть значення DWORD значення, що вказує на Terminal Services session identifier associated with the token. Процес повинен матиSE_TCB_NAMEпривілеї імусить бути налаштованим для налаштування session ID в фоні.. Виділене жирним "неперепонял". як це?

SE_TCB_NAME сервіс має статус DefaultEnabled. SessionID має правильний номер - 1.

Проте - AccessDenied при спробі привласнити SessionID токену, отриманому через DuplicateTokenEx(токен_мого_сервісу).

Як вирішити цю проблему?

Проблема вирішена, дякую всім за участь :) Взагалі, вона полягала в тому, що в D7 в константу TOKEN_ALL_ACCESS не включено TOKEN_ADJUST_SESSIONID ($100). Саме це й малося на увазі в MSDN: must be enabled to set the session ID in a token.

Отже, для запуску зне-інтерактивного сервісупроцесу на робочому столі активної сесії потрібна зв'язка:

GetCurrentProcessID>OpenProcessToken(MAXIMUM_ALLOWED. )>DuplicateTokenEx(. TOK EN_ALL_ACCESS or TOKEN_ADJUST_SESSIONID. )>SetTokenInformation(. TokenSessionId, ієм у TStartupInfo.lpDesktop "winsta0\winlogon"./

ActiveSessionID можна отримати за допомогою WTSGetActiveConsoleSessionID, але краще – з HandlerEx сервісу. (стандартний TService досить легко доопрацьовується для використання цієї функції).

Як результат - процес запускається на робочому століDefault активної сесії, має Owner-му групу "Адміністратори" і практично всі привілеї як DefaultEnabled.