Форум: "WinAPI";
Текущий архив: 2008.08.24;
Скачать: [xml.tar.bz2];
ВнизAccess denied при выполнении OpenProcess Найти похожие ветки
← →
DelphiN! © (2007-11-14 11:25) [0]Компьютер работает под учетной записью "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 возникает ошибка доступа.
В чем может быть проблема и как ее решить?
← →
Eraser © (2007-11-14 11:43) [1]
> OpenProcess(0OpenProcess(PROCESS_TERMINATE
← →
Eraser © (2007-11-14 11:48) [2]
> GetMem
FreeMem
← →
DelphiN! (2007-11-14 13:13) [3]
> OpenProcess(PROCESS_TERMINATE
Так тоже пробовал - тоже самое, 0 поставил лишь в результате долгих эксперементов
> > GetMem
>
> FreeMem
У меня стоит :
Dispose(WLogin);
Dispose(WPass);
Dispose(WPath);
Dispose(WFolder);
← →
DelphiN! (2007-11-14 13:37) [4]Попробовал запустить программу которая термирует explorer.exe(1.exe) через встроенную в Windows утилиту RunAs - результат тот же. Значит проблема именно в коде термирования. Если запускаю под админом TaskMgr.exe и пытаюсь термировать explorer.exe через него, explorer.exe завершается успешно.
Проблемма - в коде термирования, но где именно?
← →
Eraser © (2007-11-14 13:52) [5]
> DelphiN! (14.11.07 13:13) [3]
> У меня стоит :
на сколько помню, в справке по Делфи написано, что нужно использовать GetMem-FreeMem или New-Dispose, а не как попало )
так на глазок сказать что-то сложно.. надо смотреть, например, через ProcessExplorer (sysinternals.com) какие права у 1.exe, после запуска якобы под админом.
← →
DelphiN! (2007-11-14 14:22) [6]
> Eraser © (14.11.07 13:52) [5]
У 1.exe админские права. Если запускать таким же образом из под клиента с правами админа встроенную в Windows программу taskkill.exe експлорер термируется нормально.
В программе ProcessExplorer (sysinternals.com) в колонке User name, у моей программы производящей термирование написано CompName\Admin. Тоесть она под учетной Admin
← →
Anatoly Podgoretsky © (2007-11-14 14:37) [7]> DelphiN! (14.11.2007 14:22:06) [6]
Не просто админ а admin на комьютере\домене CompName.
У программы не может быть прав, права они у пользователя.
← →
Leonid Troyanovsky © (2007-11-14 15:11) [8]
> 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.
← →
Игорь Шевченко © (2007-11-14 15:16) [9]развелось вирусописателей - плюнуть некуда
← →
Leonid Troyanovsky © (2007-11-14 15:30) [10]
> Игорь Шевченко © (14.11.07 15:16) [9]
> развелось вирусописателей
Сомнительно, с такими-то познаниями пароль украсть.
Если, конечно, не на виду лежит.
--
Regards, LVT.
← →
DelphiN! (2007-11-15 08:37) [11]
> Игорь Шевченко © (14.11.07 15:16) [9]
Термирование Explorer.exe необходимо для того чтобы закрыть текущий explorer.exe под пользовательской учетной записью и открыть explorer.exe под учеткой админа, при входе в режим администратора оболочки для компьютерных клубов
> Anatoly Podgoretsky © (14.11.07 14:37) [7]
Программа запускается под пользователeм Admin
← →
DelphiN! (2007-11-15 08:41) [12]
> Leonid Troyanovsky © (14.11.07 15:11) [8]
ProcID передаваемый в ф-ию OpenProcess - верный.
Функция _TerminateProcess термирует приложения отлично, если термируемый процесс имеет права того же пользователя под которым выполняется термирование
← →
Anatoly Podgoretsky © (2007-11-15 09:08) [13]
> Программа запускается под пользователeм Admin
Это не возможно, учите Виндоус
← →
DelphiN! (2007-11-15 09:17) [14]
> Anatoly Podgoretsky © (15.11.07 09:08) [13]
Если я запускаю тем же способом вместо своей программы термирования диспетчер задач Виндоус или Виндоус программу taskkill.exe то она выполняет термирование успешно, значит проблема не в варианте запуска, а в самом способе термирования
← →
Игорь Шевченко © (2007-11-15 14:54) [15]Осталось выяснить, какие параметры передаются в супер-пупер функцию и все будет хорошо.
ЗЫ: Развелось странных админов компьютерных клубов - плюнуть некуда, всяко в странного админа попадешь, который права не умеет настраивать.
← →
MetalFan © (2007-11-16 00:19) [16]хм... 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.
← →
DelphiN! © (2007-11-16 08:08) [17]
> MetalFan © (16.11.07 00:19) [16]
Спасибо огромное!!!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2008.08.24;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.044 c