![]() |
| ||
|
|
Новости |
Поиск |
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. нет привелегий. Хотя запуск идет от имени админа. никто не сталкивался, каких именно привилегий не хватает.
Набережных С. (2003-07-19 16:07:00) [21]
1) Попытаться включить привилегию <> сделать это. Откуда ты знаешь, что попытки были удачными?
2) Привилегии нужны твоему процессу, а не пользователю.
Сначала с этим разберись, потом продолжим, если потребуется.
Hamstel (2003-07-19 15:11:00) [22]
Да, забыл указать список переменных
var
SI: STARTUPINFO;
PI: PROCESS_INFORMATION;
UID: INT64;
TP: tTokenPrivileges;
RV: cardinal;
Hamstel (2003-07-19 15:09:00) [23]Код корявый, оптимизацией пока не занимался.
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;
Набережных С. (2003-07-19 14:56:00) [24]
Лучше покажи код
Hamstel (2003-07-19 14:45:00) [25]
Включил SE_ASSIGNPRIMARYTOKEN_NAME и SE_INCREASE_QUOTA_NAME а также SE_TCB_NAME - не помогло. Все таже 1314(A required privilege is not held by the client).
Hamstel (2003-07-19 13:54:00) [26]
CreateProcessWithLogonW штука отличная, только пот NT 4 не работает:-((( А у меня сетка смешанная. Поэтому выбора нет, только CreateProcessasUser.
Набережных С. (2003-07-19 06:42:00) [27]
>На >=Win2000 есть CreateProcessWithLogonW
И весьма удобная, кстати...если только не требуется предварительно поработать с маркером.
ZZ (2003-07-18 21:53:00) [28]
Вот этот камень обычно является последним :)
PS. На >=Win2000 есть CreateProcessWithLogonW
Набережных С. (2003-07-18 20:33:00) [29]
SE_ASSIGNPRIMARYTOKEN_NAME и SE_INCREASE_QUOTA_NAME. Но это не последний подводный камень.