![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запуск из сервиса на активном 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/с указанием в TStartupInfo.lpDesktop 'winsta0\winlogon'./
ActiveSessionID:DWORD;
GetCurrentProcessID>OpenProcessToken(MAXIMUM_ALLOWED...)>DuplicateTokenEx(...TOK EN_ALL_ACCESS or TOKEN_ADJUST_SESSIONID...)>SetTokenInformation(...TokenSessionId, @ActiveSessionID, SizeOf(DWORD))>CreateProcessAsUser
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(токен_моего_сервиса).
Как решить эту проблему?