Форум: "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