Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.01 c
1-89983
Radik
2003-11-17 13:58
2003.11.27
Временные интервалы


7-90142
mr_All
2003-09-17 11:08
2003.11.27
Как определить произошла ли регистрация любого пользователя ?


14-90092
RoLeX
2003-11-04 10:51
2003.11.27
Помогите перевести язык интерфейса на английский!!!


1-89890
Oleg Khvostenko
2003-11-15 13:46
2003.11.27
Real в Integer


7-90136
ИЛЕЙ
2003-09-17 13:40
2003.11.27
Реагирование на завершение работы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский