Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.27;
Скачать: CL | DM;

Вниз

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

 
Hamstel ©   (2003-07-18 17:43) [0]

необходимо запустить процесс от имени другого пользователя.

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. нет привелегий. Хотя запуск идет от имени админа. никто не сталкивался, каких именно привилегий не хватает.


 
Набережных С. ©   (2003-07-18 20:33) [1]

SE_ASSIGNPRIMARYTOKEN_NAME и SE_INCREASE_QUOTA_NAME. Но это не последний подводный камень.


 
ZZ ©   (2003-07-18 21:53) [2]

Вот этот камень обычно является последним :)

PS. На >=Win2000 есть CreateProcessWithLogonW


 
Набережных С. ©   (2003-07-19 06:42) [3]

>На >=Win2000 есть CreateProcessWithLogonW

И весьма удобная, кстати...если только не требуется предварительно поработать с маркером.


 
Hamstel ©   (2003-07-19 13:54) [4]

CreateProcessWithLogonW штука отличная, только пот NT 4 не работает:-((( А у меня сетка смешанная. Поэтому выбора нет, только CreateProcessasUser.


 
Hamstel ©   (2003-07-19 14:45) [5]

Включил SE_ASSIGNPRIMARYTOKEN_NAME и SE_INCREASE_QUOTA_NAME а также SE_TCB_NAME - не помогло. Все таже 1314(A required privilege is not held by the client).


 
Набережных С. ©   (2003-07-19 14:56) [6]

Лучше покажи код


 
Hamstel ©   (2003-07-19 15:09) [7]

Код корявый, оптимизацией пока не занимался.

if not LogonUser("administrator", "polypack", "******", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, phToken) then exit;
if LookupPrivilegeValue("", "SeIncreaseQuotaPrivilege", UID) then
begin
TP.PrivilegeCount:=1;
TP.Privileges[0].Luid:=UID;
TP.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
if not AdjustTokenPrivileges(phToken, false, TP, siZEof(TP), nil, RV) then
GetLastError;
end;
if LookupPrivilegeValue("", "SeAssignPrimaryTokenPrivilege", UID) then
begin
TP.PrivilegeCount:=1;
TP.Privileges[0].Luid:=UID;
TP.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
if not AdjustTokenPrivileges(phToken, false, TP, siZEof(TP), nil, RV) then
GetLastError;
end;
if LookupPrivilegeValue("", "SeTcbPrivilege", UID) then
begin
TP.PrivilegeCount:=1;
TP.Privileges[0].Luid:=UID;
TP.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
if not AdjustTokenPrivileges(phToken, false, TP, siZEof(TP), nil, RV) then
GetLastError;
end;
if not CreateProcessAsUser(phToken, "C:\1\BIN\IDEW32.EXE", "", nil, nil, false, CREATE_DEFAULT_ERROR_MODE, nil, "C:\1\BIN", SI, PI) then
( 0, PChar(IntToStr(Getlasterror)
Код корявый, оптимизацией пока не занимался.

if not LogonUser("administrator", "polypack", "******", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, phToken) then exit;
if LookupPrivilegeValue("", "SeIncreaseQuotaPrivilege", UID) then
begin
TP.PrivilegeCount:=1;
TP.Privileges[0].Luid:=UID;
TP.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
if not AdjustTokenPrivileges(phToken, false, TP, siZEof(TP), nil, RV) then
GetLastError;
end;
if LookupPrivilegeValue("", "SeAssignPrimaryTokenPrivilege", UID) then
begin
TP.PrivilegeCount:=1;
TP.Privileges[0].Luid:=UID;
TP.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
if not AdjustTokenPrivileges(phToken, false, TP, siZEof(TP), nil, RV) then
GetLastError;
end;
if LookupPrivilegeValue("", "SeTcbPrivilege", UID) then
begin
TP.PrivilegeCount:=1;
TP.Privileges[0].Luid:=UID;
TP.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
if not AdjustTokenPrivileges(phToken, false, TP, siZEof(TP), nil, RV) then
GetLastError;
end;
if not CreateProcessAsUser(phToken, "C:\1\BIN\IDEW32.EXE", "", nil, nil, false, CREATE_DEFAULT_ERROR_MODE, nil, "C:\1\BIN", SI, PI) then
MessageBox(0, PChar(IntToStr(Getlasterror)), "", 0);
end;


 
Hamstel ©   (2003-07-19 15:11) [8]

Да, забыл указать список переменных

var
SI: STARTUPINFO;
PI: PROCESS_INFORMATION;
UID: INT64;
TP: tTokenPrivileges;
RV: cardinal;


 
Набережных С. ©   (2003-07-19 16:07) [9]

1) Попытаться включить привилегию <> сделать это. Откуда ты знаешь, что попытки были удачными?
2) Привилегии нужны твоему процессу, а не пользователю.

Сначала с этим разберись, потом продолжим, если потребуется.


 
ZZ ©   (2003-07-19 19:33) [10]

Код не то что корявый... он несколько бессмысленный. "SeTcbPrivilege" нужна для вызова LogonUser. Но это все фигня, ибо винда сама включит тебе все привилегии (полный plug"n"play панимаешь) и код между LogonUser и CreateProcessAsUser можешь удалять. Ты лучше раскажи как ты Включил SE_ASSIGNPRIMARYTOKEN_NAME и SE_INCREASE_QUOTA_NAME а также SE_TCB_NAME. Если с помошью AdjustTokenPrivileges, то это совсем не то. Включается это админом в secpol.msc или (m)usrmgr.exe - в зависимости от ОС для определенного юзера(ов) или групп(ы).

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


 
Набережных С. ©   (2003-07-19 20:32) [11]

>ZZ © (19.07.03 19:33)
>Включается это админом в secpol.msc или (m)usrmgr.exe

Не только. Добавить привилегию учетной записи можно и программно, вот только на уже запущенный процесс это никак не повлияет. А AdjustTokenPrivileges в данном случае, ИМХО, - хороший способ проверить наличие привилегии у процесса. Можно, конечно, использовать и PrivilegeCheck, но она, на мой взгляд, менее удобна.


 
Hamstel ©   (2003-07-22 13:43) [12]

To ZZ
>Ты лучше раскажи как ты включил SE_ASSIGNPRIMARYTOKEN_NAME SE_INCREASE_QUOTA_NAME а также SE_TCB_NAME.
>У тебя права админа домена есть?
Права админа естественно есть. Я и есть админ:-) Политики включил в Domain Policy, согласно PlatformSDK.




 
Игорь Шевченко ©   (2003-07-22 14:51) [13]

if not AdjustTokenPrivileges(phToken, false, TP, siZEof(TP), nil, RV) then
GetLastError;

Вот такие вот операторы не совсем понятны, точнее, совсем непонятны. GetLastError возвращает значение, но не видно, как оно анализируется :) Может, от отсутствия этого анализа и появляются проблемы ?


 
ZZ ©   (2003-07-22 15:25) [14]

Игорь Шевченко
Так получать привилегии "руками" нужно или нет? По моему нет. Или я не правильно понял
If the necessary privileges are not already enabled, CreateProcessAsUser enables them for the duration of the call

Hamstel
Ну так заработало или нет???


 
Игорь Шевченко ©   (2003-07-22 15:47) [15]

ZZ © (22.07.03 15:25)

Если привилегии есть, то CreateProcessAsUser сам их включит. Я верю MSDN и Рихтеру с Кларком


 
ZZ ©   (2003-07-22 16:08) [16]

А я верю в Деда Мороза... :)
Просто мне не понятно
Игорь Шевченко © (22.07.03 14:51)
от отсутствия этого анализа и появляются проблемы
Ведь получил он их или нет - абсолютно неважно


 
Набережных С. ©   (2003-07-22 16:24) [17]

>ZZ © (22.07.03 16:08)

Если привилегия есть - удалось включить. Не удалось - привилегии нет, нужно добавлять либо административно, либо программно, с помощью LsaAddAccounRights. Но эти изменения не подействуют на уже запущенные процессы. Маркер процесса создается при запуске приложения и далее в части привелегий неизменен. AdjustTokenPrivileges позволяет только изменить состояние(включено/выключено) существующих у маркера привилегий. CreateProcessAsUser включит их автоматически, но зато AdjustTokenPrivileges позволяет выяснить, стоит ли пытаться ее вызывать и каких именно привилегий нехватает.


 
VMcL ©   (2003-07-22 16:46) [18]

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/security/starting_an_interactive_client_process.asp

?


 
Набережных С. ©   (2003-07-22 17:09) [19]

>VMcL © (22.07.03 16:46)
>?

В смысле?


 
Игорь Шевченко ©   (2003-07-22 17:24) [20]

ZZ © (22.07.03 16:08)


> А я верю в Деда Мороза... :)

Вопросы религии все-таки больше для потрепаться подходят. Я к тому, что а) анализ ошибок нужен в любом случае. б) код некорректный - человек делает LookupPrivilegeValue, если есть, то устанавливает в Enable, если нет, то тупо идет дальше. Я такого кода не понимаю.


 
Набережных С. ©   (2003-07-22 17:44) [21]

>Игорь Шевченко © (22.07.03 17:24)

Хм, не совсем Вас понял. Что значит "человек делает , если есть, то устанавливает в Enable"? Вообще-то ошибка именно на LookupPrivilegeValue в данном контексте весьма и весьма маловероятна...или я ошибаюсь?


 
Набережных С. ©   (2003-07-22 17:46) [22]

:)))
Извиняюсь, следует читать так:
Хм, не совсем Вас понял. Что значит "человек делает LookupPrivilegeValue, если есть, то устанавливает в Enable"? Вообще-то ошибка именно на LookupPrivilegeValue в данном контексте весьма и весьма маловероятна...или я ошибаюсь?


 
Игорь Шевченко ©   (2003-07-22 18:04) [23]

Набережных С. © (22.07.03 17:46)

То есть, по вашему получается, что если вся работы с привилегиями не завершится успешно, то можно смело дальше идти на вызов CreateProcessAsUser ? (согласно коду)


 
Набережных С. ©   (2003-07-22 18:10) [24]

>Игорь Шевченко © (22.07.03 18:04)

Да нет, конечно:) Просто я не понял, почему Вы акцентировали внимание именно на LookupPrivilegeValue, хотя, вроде-бы, там ожидать ошибку можно меньше всего. А когда я чего-то не понимаю, я подозреваю пробел в знаниях во вроде-бы знакомой области, а это вызывает чувство дискомфорта, потому и спросил:)


 
Игорь Шевченко ©   (2003-07-22 18:57) [25]

Я акцентировал внимание исключительно на обработке ошибок :) Потому что если бы она была, вопрос бы в форуме не поднимался :))


 
Набережных С. ©   (2003-07-22 19:10) [26]

>Игорь Шевченко © (22.07.03 18:57)
Ну, в принципе, я мог бы и сам догадаться, не задавая глупых вопросов:)) Так что извините за назойливость:)))


 
Hamstel ©   (2003-07-22 19:33) [27]

Шевченко

По поводу
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.


 
DAN   (2003-08-21 15:17) [28]

Порядок вызова функций:
LogonUser - получаем токен нужного юзверя.
потом ОБЯЗАТЕЛЬНО!!! инначе нихрена не получется т.к.
с токеном полученным от LogonUser нельзя регистрировать новый процесс...
DuplicateTokenEX - переводим полученный токен в Primary.
и только теперь :)
CreateProcessAsUser
:)))


 
fiber ©   (2003-10-03 13:55) [29]

Удалено модератором
Примечание: Offtopic



Страницы: 1 вся ветка

Текущий архив: 2003.11.27;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.018 c
1-89932
Nucl
2003-11-17 18:02
2003.11.27
Картинки из TImageList


1-89947
mmmaloy
2003-11-18 01:05
2003.11.27
TreeView программно


14-90079
Колян_К
2003-11-05 11:26
2003.11.27
Куда мог подеваться вопрос


8-90016
sam_perm
2003-08-01 13:37
2003.11.27
распознование бланков


14-90082
Проходящи_й_
2003-11-05 10:40
2003.11.27
100$ за то, кто узнает sn delphi, версию, систему, sn из exe.