Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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(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 вся ветка

Форум: "WinAPI";
Текущий архив: 2008.08.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.044 c
4-1194987722
Альберт
2007-11-14 00:02
2008.08.24
Размещение ActiveX - MicrosoftWebBrowser в WinAPI


15-1215115864
Petr V. Abramov
2008-07-04 00:11
2008.08.24
Как объяснить женщине


1-1196965642
@!!ex
2007-12-06 21:27
2008.08.24
Как получиьт изображение окна?


15-1215350457
JohnKorsh
2008-07-06 17:20
2008.08.24
Восстановление реестра в XP.


2-1216046956
Vikindos
2008-07-14 18:49
2008.08.24
Замена слов в массиве





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский