Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.24;
Скачать: CL | DM;

Вниз

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(0

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

Текущий архив: 2008.08.24;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.018 c
2-1216627313
TUserClass
2008-07-21 12:01
2008.08.24
Английская XP и моя программа...


11-1192907816
Turbid
2007-10-20 23:16
2008.08.24
TabControl и XP


2-1216281741
ZLO
2008-07-17 12:02
2008.08.24
Assert


2-1216626771
Denis__
2008-07-21 11:52
2008.08.24
Что использовать вместо StringGrid?


2-1216289835
NJ
2008-07-17 14:17
2008.08.24
DLL