![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запуск програмы от имени другого пользователя
Hamstel © (2003-07-18 17:43:00)необходимо запустить процесс от имени другого пользователя.
var phToken:cardinal;
SI: STARTUPINFO;
( UserName, Domain, Password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, phToken)необходимо запустить процесс от имени другого пользователя.
var phToken:cardinal;
SI: STARTUPINFO;
PI: PROCESS_INFORMATION;
LogonUser(UserName, Domain, Password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, phToken);
CreateProcessAsUser(phToken, Program, "", nil, nil, false, CREATE_DEFAULT_ERROR_MODE, nil, Path, SI, PI);
И вот тут функция возвращает false А по GetLastError - 1314. нет привелегий. Хотя запуск идет от имени админа. никто не сталкивался, каких именно привилегий не хватает.
fiber (2003-10-03 13:55:00) [1]
Удалено модератором
Примечание: Offtopic
DAN (2003-08-21 15:17:00) [2]
Порядок вызова функций:
LogonUser - получаем токен нужного юзверя.
потом ОБЯЗАТЕЛЬНО!!! инначе нихрена не получется т.к.
с токеном полученным от LogonUser нельзя регистрировать новый процесс...
DuplicateTokenEX - переводим полученный токен в Primary.
и только теперь :)
CreateProcessAsUser
:)))
Hamstel (2003-07-22 19:33:00) [3]Шевченко
По поводу
if not AdjustTokenPrivileges(phToken, false, TP, siZEof(TP), nil, RV) then
( в данном случае)
Шевченко
По поводу
if not AdjustTokenPrivileges(phToken, false, TP, siZEof(TP), nil, RV) then
GetLastError;
Так как это еще не программа, а поиск решения, то в этом случае на GetLastError ставится Breakpoint и проверяется значение в Inspect.
Естествено, если ошибки нет, то и обработка не нужна(в данном случае).
А так как все работы с привилегиями завершаются успешно, то мы смело идем с CreateProcessAsUser.
Впрочем, проблема снята, действительно AdjustTokenPrivileges не нужен. Вся проблема в предоставлении прав в политиках домена. Я разрешил привилегию SE_INCREASE_QUOTA_NAME для одной группы пользователей, а пытался запустить процесс от другой.:-((((((
Итоговый код
LogonUser("user", "domain", "password", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, phToken);
CreateProcessAsUser(phToken, "program", "", nil, nil, false, CREATE_DEFAULT_ERROR_MODE, nil, "Programdir", SI, PI);
Ну и конечно добавить обработку ошибок и завтра проверить под NT4.
Набережных С. (2003-07-22 19:10:00) [4]
>Игорь Шевченко © (22.07.03 18:57)
Ну, в принципе, я мог бы и сам догадаться, не задавая глупых вопросов:)) Так что извините за назойливость:)))
Игорь Шевченко (2003-07-22 18:57:00) [5]
Я акцентировал внимание исключительно на обработке ошибок :) Потому что если бы она была, вопрос бы в форуме не поднимался :))
Набережных С. (2003-07-22 18:10:00) [6]
>Игорь Шевченко © (22.07.03 18:04)
Да нет, конечно:) Просто я не понял, почему Вы акцентировали внимание именно на LookupPrivilegeValue, хотя, вроде-бы, там ожидать ошибку можно меньше всего. А когда я чего-то не понимаю, я подозреваю пробел в знаниях во вроде-бы знакомой области, а это вызывает чувство дискомфорта, потому и спросил:)
Игорь Шевченко (2003-07-22 18:04:00) [7]
Набережных С. © (22.07.03 17:46)
То есть, по вашему получается, что если вся работы с привилегиями не завершится успешно, то можно смело дальше идти на вызов CreateProcessAsUser ? (согласно коду)
Набережных С. (2003-07-22 17:46:00) [8]
:)))
Извиняюсь, следует читать так:
Хм, не совсем Вас понял. Что значит "человек делает LookupPrivilegeValue, если есть, то устанавливает в Enable"? Вообще-то ошибка именно на LookupPrivilegeValue в данном контексте весьма и весьма маловероятна...или я ошибаюсь?
Набережных С. (2003-07-22 17:44:00) [9]
>Игорь Шевченко © (22.07.03 17:24)
Хм, не совсем Вас понял. Что значит "человек делает , если есть, то устанавливает в Enable"? Вообще-то ошибка именно на LookupPrivilegeValue в данном контексте весьма и весьма маловероятна...или я ошибаюсь?
Игорь Шевченко (2003-07-22 17:24:00) [10]
ZZ © (22.07.03 16:08)
> А я верю в Деда Мороза... :)
Вопросы религии все-таки больше для потрепаться подходят. Я к тому, что а) анализ ошибок нужен в любом случае. б) код некорректный - человек делает LookupPrivilegeValue, если есть, то устанавливает в Enable, если нет, то тупо идет дальше. Я такого кода не понимаю.
Набережных С. (2003-07-22 17:09:00) [11]
>VMcL © (22.07.03 16:46)
>?
В смысле?
VMcL (2003-07-22 16:46:00) [12]
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/security/starting_an_interactive_client_process.asp
?
Набережных С. (2003-07-22 16:24:00) [13]
>ZZ © (22.07.03 16:08)
Если привилегия есть - удалось включить. Не удалось - привилегии нет, нужно добавлять либо административно, либо программно, с помощью LsaAddAccounRights. Но эти изменения не подействуют на уже запущенные процессы. Маркер процесса создается при запуске приложения и далее в части привелегий неизменен. AdjustTokenPrivileges позволяет только изменить состояние(включено/выключено) существующих у маркера привилегий. CreateProcessAsUser включит их автоматически, но зато AdjustTokenPrivileges позволяет выяснить, стоит ли пытаться ее вызывать и каких именно привилегий нехватает.
ZZ (2003-07-22 16:08:00) [14]
А я верю в Деда Мороза... :)
Просто мне не понятно
Игорь Шевченко © (22.07.03 14:51)
от отсутствия этого анализа и появляются проблемы
Ведь получил он их или нет - абсолютно неважно
Игорь Шевченко (2003-07-22 15:47:00) [15]
ZZ © (22.07.03 15:25)
Если привилегии есть, то CreateProcessAsUser сам их включит. Я верю MSDN и Рихтеру с Кларком
ZZ (2003-07-22 15:25:00) [16]
Игорь Шевченко
Так получать привилегии "руками" нужно или нет? По моему нет. Или я не правильно понял
If the necessary privileges are not already enabled, CreateProcessAsUser enables them for the duration of the call
Hamstel
Ну так заработало или нет???
Игорь Шевченко (2003-07-22 14:51:00) [17]
if not AdjustTokenPrivileges(phToken, false, TP, siZEof(TP), nil, RV) then
GetLastError;
Вот такие вот операторы не совсем понятны, точнее, совсем непонятны. GetLastError возвращает значение, но не видно, как оно анализируется :) Может, от отсутствия этого анализа и появляются проблемы ?
Hamstel (2003-07-22 13:43:00) [18]
To ZZ
>Ты лучше раскажи как ты включил SE_ASSIGNPRIMARYTOKEN_NAME SE_INCREASE_QUOTA_NAME а также SE_TCB_NAME.
>У тебя права админа домена есть?
Права админа естественно есть. Я и есть админ:-) Политики включил в Domain Policy, согласно PlatformSDK.
Набережных С. (2003-07-19 20:32:00) [19]
>ZZ © (19.07.03 19:33)
>Включается это админом в secpol.msc или (m)usrmgr.exe
Не только. Добавить привилегию учетной записи можно и программно, вот только на уже запущенный процесс это никак не повлияет. А AdjustTokenPrivileges в данном случае, ИМХО, - хороший способ проверить наличие привилегии у процесса. Можно, конечно, использовать и PrivilegeCheck, но она, на мой взгляд, менее удобна.
ZZ (2003-07-19 19:33:00) [20]
Код не то что корявый... он несколько бессмысленный. "SeTcbPrivilege" нужна для вызова LogonUser. Но это все фигня, ибо винда сама включит тебе все привилегии (полный plug"n"play панимаешь) и код между LogonUser и CreateProcessAsUser можешь удалять. Ты лучше раскажи как ты Включил SE_ASSIGNPRIMARYTOKEN_NAME и SE_INCREASE_QUOTA_NAME а также SE_TCB_NAME. Если с помошью AdjustTokenPrivileges, то это совсем не то. Включается это админом в secpol.msc или (m)usrmgr.exe - в зависимости от ОС для определенного юзера(ов) или групп(ы).
ЗЫ. Прога общается с сетью или только с локальным компом? У тебя права админа домена есть?