![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Access denied при выполнении OpenProcess [WinXP]
DelphiN! © (2007-11-14 11:25:00)Компьютер работает под учетной записью "Client" c пользовательскими правами. Административная учетная запись - "Admin".
Программа запускается из под учетной записи Client с правами пользователя Admin и пытается завершить процесс запущенный под пользователем Client. Однако при попытке выполнить функцию OpenProcess возникает ошибка 5 - Access denied
Запуск программы из под пользователя Client, с правами учетной записи Admin выполняется следующим образом :
function MyCreateProcess(Path,Folder,User,Pass: String): Boolean;
var
sa: STARTUPINFO;
pi: PROCESS_INFORMATION;
WLogin,WPass,WPath,WFolder: PWideChar;
lz: Cardinal;
err: array[0..512] of Char;
begin
ZeroMemory(@Sa,Sizeof(sa));
sa.cb := SizeOf(tstartupinfo);
sa.dwFlags := STARTF_USESHOWWINDOW;
sa.wShowWindow := SW_SHOWDEFAULT;
sa.lpReserved := nil;
sa.lpDesktop := nil;
sa.lpTitle := nil;
GetMem(WLogin, Length(User) * SizeOf(WLogin) + 1);
StringToWideChar(User, WLogin, Length(User) * SizeOf(WLogin) + 1);
GetMem(WPass, Length(Pass) * SizeOf(WPass) + 1);
StringToWideChar(Pass, WPass, Length(Pass) * SizeOf(WPass) + 1);
GetMem(WPath, Length(Path) * SizeOf(WPath) + 1);
StringToWideChar(Path, WPath, Length(Path) * SizeOf(WPath) + 1);
GetMem(WFolder, Length(Folder) * SizeOf(WFolder) + 1);
StringToWideChar(Folder, WFolder, Length(Folder) * SizeOf(WFolder) + 1);
end;
CreateProcessWithLogonW(WLogin, nil, WPass, 0,
nil, WPath,0, nil, , sa, pi)
WaitForSingleObject(pi.hProcess,INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
err := '';
lz := GetLastError;
if lz <> 0 then
begin
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, lz, 0, @err, 512, nil);
if Dialogs then
MessageBox(0,PChar(String('Error '+IntToStr(lz)+'. '+err)),'',0);
Result := false;
end;
Dispose(WLogin);
Dispose(WPass);
Dispose(WPath);
Dispose(WFolder);
end;
MyCreateProcess('C:\1.exe','C:\','Admin','AdminPass');
Из программы 1.exe, запущенной кодом выше под Admin-ом пытаюсь завершить процесс EXPLORER.EXE, запущенный под Client-ом.
Код завершения процесса следующий :
type
TProcNameList = packed record
Count: integer;
Names: array of string;
pIDs: array of integer;
end;
function GetProcessList: TProcNameList;
var
hSnapshoot: integer;
pe32: TProcessEntry32;
begin
FillChar(result, sizeof(TProcNameList), #0);
hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
pe32.dwSize := SizeOf(TProcessEntry32);
Process32First(hSnapshoot, pe32);
repeat
SetLength(result.Names, length(result.Names) + 1);
SetLength(result.pIDs, length(result.pIDs) + 1);
inc(result.Count);
result.pIDs[result.Count - 1] := pe32.th32ProcessID;
result.Names[result.Count - 1] := pe32.szExeFile;
until (not Process32Next(hSnapshoot, pe32));
end;
function TerminateProcess(ProcessName: string): Boolean;
function _TerminateProcess(ProcID: Cardinal): boolean;
var
hProcess: THandle;
lz: Integer;
err: PChar;
begin
hProcess := OpenProcess(0,
False, ProcID); //OpenProcess возвращает ошибку 5 Access denied
lz := GetLastError;
if lz <> 0 then
begin
//FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, lz, 0, @err, 512, nil);
// MessageBox(0,PChar(String(err)),'',0);
ShowMessage(inttostr(lz));
end;
ShowMessage(IntToStr(hProcess));
if (hProcess = 0) then
begin
result := false;
exit;
end;
result := Windows.TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
if (not result) then
exit;
result := true;
end;
var
i: integer;
PList: TProcNameList;
begin
Result := false;
PList := GetProcessList;
for i := 0 to PList.Count - 1 do
if AnsiUpperCase(PList.Names[i]) = AnsiUpperCase(ProcessName) then
result := _TerminateProcess(PList.pIDs[i]);
end;
begin
TerminateProcess('Explorer.exe');
end;
Однако при выполнении функции OpenProcess возникает ошибка доступа.
В чем может быть проблема и как ее решить?
DelphiN! (2007-11-16 08:08:00) [1]
> MetalFan © (16.11.07 00:19) [16]
Спасибо огромное!!!
MetalFan (2007-11-16 00:19:00) [2]хм... MSDN
To open a handle to another another local process and obtain full access rights, you must enable the SeDebugPrivilege privilege. For more information, see Changing Privileges in a Token.
Игорь Шевченко (2007-11-15 14:54:00) [3]Осталось выяснить, какие параметры передаются в супер-пупер функцию и все будет хорошо.
ЗЫ: Развелось странных админов компьютерных клубов - плюнуть некуда, всяко в странного админа попадешь, который права не умеет настраивать.
DelphiN! (2007-11-15 09:17:00) [4]
> Anatoly Podgoretsky © (15.11.07 09:08) [13]
Если я запускаю тем же способом вместо своей программы термирования диспетчер задач Виндоус или Виндоус программу taskkill.exe то она выполняет термирование успешно, значит проблема не в варианте запуска, а в самом способе термирования
Anatoly Podgoretsky (2007-11-15 09:08:00) [5]
> Программа запускается под пользователeм Admin
Это не возможно, учите Виндоус
DelphiN! (2007-11-15 08:41:00) [6]
> Leonid Troyanovsky © (14.11.07 15:11) [8]
ProcID передаваемый в ф-ию OpenProcess - верный.
Функция _TerminateProcess термирует приложения отлично, если термируемый процесс имеет права того же пользователя под которым выполняется термирование
DelphiN! (2007-11-15 08:37:00) [7]
> Игорь Шевченко © (14.11.07 15:16) [9]
Термирование Explorer.exe необходимо для того чтобы закрыть текущий explorer.exe под пользовательской учетной записью и открыть explorer.exe под учеткой админа, при входе в режим администратора оболочки для компьютерных клубов
> Anatoly Podgoretsky © (14.11.07 14:37) [7]
Программа запускается под пользователeм Admin
Leonid Troyanovsky (2007-11-14 15:30:00) [8]
> Игорь Шевченко © (14.11.07 15:16) [9]
> развелось вирусописателей
Сомнительно, с такими-то познаниями пароль украсть.
Если, конечно, не на виду лежит.
--
Regards, LVT.
Игорь Шевченко (2007-11-14 15:16:00) [9]развелось вирусописателей - плюнуть некуда
Leonid Troyanovsky (2007-11-14 15:11:00) [10]
> DelphiN! © (14.11.07 11:25)
> type
> TProcNameList = packed record
> Count: integer;
> Names: array of string;
> pIDs: array of integer;
> end;
>
> function GetProcessList: TProcNameList;
TProcName = record
Name: String;
Pid: Longint;
end;
TProcNames = array of TProcName;
procedure GetProcessList (var List: TProcNames);
> False, ProcID); //OpenProcess возвращает ошибку 5
> Access denied
Кто-кто возвращает?
--
Regards, LVT.
Anatoly Podgoretsky (2007-11-14 14:37:00) [11]> DelphiN! (14.11.2007 14:22:06) [6]
Не просто админ а admin на комьютере\домене CompName.
У программы не может быть прав, права они у пользователя.
DelphiN! (2007-11-14 14:22:00) [12]
> Eraser © (14.11.07 13:52) [5]
У 1.exe админские права. Если запускать таким же образом из под клиента с правами админа встроенную в Windows программу taskkill.exe експлорер термируется нормально.
В программе ProcessExplorer (sysinternals.com) в колонке User name, у моей программы производящей термирование написано CompName\Admin. Тоесть она под учетной Admin
Eraser (2007-11-14 13:52:00) [13]
> DelphiN! (14.11.07 13:13) [3]
> У меня стоит :
на сколько помню, в справке по Делфи написано, что нужно использовать GetMem-FreeMem или New-Dispose, а не как попало )
так на глазок сказать что-то сложно.. надо смотреть, например, через ProcessExplorer (sysinternals.com) какие права у 1.exe, после запуска якобы под админом.
DelphiN! (2007-11-14 13:37:00) [14]Попробовал запустить программу которая термирует explorer.exe(1.exe) через встроенную в Windows утилиту RunAs - результат тот же. Значит проблема именно в коде термирования. Если запускаю под админом TaskMgr.exe и пытаюсь термировать explorer.exe через него, explorer.exe завершается успешно.
Проблемма - в коде термирования, но где именно?
DelphiN! (2007-11-14 13:13:00) [15]
> OpenProcess(PROCESS_TERMINATE
Так тоже пробовал - тоже самое, 0 поставил лишь в результате долгих эксперементов
> > GetMem
>
> FreeMem
У меня стоит :
Dispose(WLogin);
Dispose(WPass);
Dispose(WPath);
Dispose(WFolder);
Eraser (2007-11-14 11:48:00) [16]
> GetMem
FreeMem
Eraser (2007-11-14 11:43:00) [17]
> OpenProcess(0
OpenProcess( PROCESS_TERMINATE