Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Denied ©   (2009-02-10 21:36:00) 

Имеется сервис (свой), работающий в Windows Vista.
Нужно получить доступ к активному десктопу, чтобы была возможность установки хука и заодно - работы с пользователем. (сразу скажу - пишу что-то вроде http://www.lanagent.ru/, хоть такое здесь и не любят).

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

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

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

Что я не учитываю?


Denied   (2009-02-20 01:15:00) [1]

P.P.S. Ошибочка - /с указанием в TStartupInfo.lpDesktop 'winsta0\ default'./


Denied   (2009-02-20 01:11:00) [2]

P.S. И это несмотря на включенный UAC, с которым придется еще повозиться, наверное :)


Denied   (2009-02-20 01:10:00) [3]

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

Итого, для запуска из не-интерактивного сервисапроцесса на десктопе активной сессии нужна связка:

var
 ActiveSessionID:DWORD;

GetCurrentProcessID>OpenProcessToken(MAXIMUM_ALLOWED...)>DuplicateTokenEx(...TOK EN_ALL_ACCESS or TOKEN_ADJUST_SESSIONID...)>SetTokenInformation(...TokenSessionId, @ActiveSessionID, SizeOf(DWORD))>CreateProcessAsUser
/с указанием в TStartupInfo.lpDesktop 'winsta0\winlogon'./

ActiveSessionID можно получить с помощью WTSGetActiveConsoleSessionID, но лучше - из HandlerEx сервиса. (стандартный TService достаточно легко дорабатывается для использования этой функции).

Как результат - процесс запускается на десктопе Default активной сессии, имеет Owner-ом группу "Администраторы" и практически все привилегии как DefaultEnabled.


Denied   (2009-02-12 22:33:00) [4]

Up.

Попробую задать вопрос покороче.
В описании параметров CreateProcessAsUser по hToken написано:
The process is run in the session specified in the token. By default, this is the same session that called LogonUser. To change the session, use the SetTokenInformationfunction.

В описании SetTokenInformation:
The buffer receives a DWORD value that indicates the Terminal Services session identifier associated with the token... The process must have the SE_TCB_NAMEprivilege and must be enabled to set the session ID in a token..
Выделенное жирным "недоперепонял". как это?

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

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

Как решить эту проблему?


Наверх

Титульная страница Поиск, карта сайта Написать письмо