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

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

Запуск програмы от имени другого пользователя


Страницы:   1 2

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 - в зависимости от ОС для определенного юзера(ов) или групп(ы).

ЗЫ. Прога общается с сетью или только с локальным компом? У тебя права админа домена есть?


Страницы:   1 2

Наверх

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