[Delphi]Zabijanie procesów/uprawnienia konta i usługi

0

Witam,
Natrafiłem ostatnio na dość użyteczną do moich celów funkcję:

procedure KillProcessHWND(hWindowHandle: HWND);
var
  hprocessID: INTEGER;
  processHandle: THandle;
  DWResult: DWORD;
begin
  SendMessageTimeout(hWindowHandle, WM_CLOSE, 0, 0,
    SMTO_ABORTIFHUNG or SMTO_NORMAL, 5000, DWResult);
  if isWindow(hWindowHandle) then
  begin
    { Get the process identifier for the window}
    GetWindowThreadProcessID(hWindowHandle, @hprocessID);
    if hprocessID <> 0 then
    begin
      { Get the process handle }
      processHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION,
        False, hprocessID);
      if processHandle <> 0 then
      begin
        { Terminate the process }
        TerminateProcess(processHandle, 0);
        CloseHandle(ProcessHandle);
      end;
    end;
  end;
end;

Oraz

function enumcallback(h:HWND;l:LPARAM):bool;stdcall;
var
  i:integer;
  p:array of char;
begin
  enumcallback:=true;
  i:=GetWindowTextLength(h)+1;
  SetLength(p,i);
  GetWindowText(h,pchar(p),i);
  if pos('Kalk',pchar(p))>0 then
    begin
      HWND(pointer(l)^):=h;
      KillProcessHWND(h);
      enumcallback:=false;
    end;
  SetLength(p,0);
end;

Wywołanie:

EnumWindows(@enumcallback,LPARAM(@czatwin));

Pierwsza funkcja ma za zadanie zabicie procesu po uchwycie okna, który przekazany jest przez funkcję drugą.
Obie funkcje działają prawidłowo na koncie z uprawnieniami administratora – i tylko tam.
Problem polega na tym, że aplikacja ma działać na koncie użytkownika z ograniczonymi uprawnieniami.
Logika podpowiada, że wystarczy uruchomić program z uprawnieniami systemowymi i problem powinien się rozwiązać. Sam program nie mógł działać jako usługa ponieważ zarówno wbudowana funkcja FundWindow (z której właśnie dlatego zrezygnowałem) jak i (jeśli dobrze pamiętam) funkcja druga nie działały prawidłowo – czytać wcale (prawdopodobnie przeszukiwane były tylko nazwy w obrębie usług a nie wszystkich procesów). Dlatego napisałem prostą usługę uruchamiającą program z ww funkcjami a dziedziczenie uprawnień w systemie windows generalnie powinno załatwić problem. Ale nic z tego. Tutaj już nie sprawdzałem czy funkcja szukająca nazwy okna czy zabijająca proces nie działa ponieważ efekt z punktu widzenia użytkownika pozostawał niezmienny. Ostatnim pomysłem było wykorzystanie systemowej komendy runas i odpalenie programu jako użytkownik z uprawnieniami administratora... I tu już zupełnie zgłupiałem bo niby wszystko działa ale funkcja, która powinna zabić proces po prostu go minimalizuje... Jakieś pomysły? Krócej się chyba nie dało ;-)
Jak ktoś coś wymyśli to dzięki piękne za pomoc.
Pozdrawiam.

//edit: usunąłem śmiecie w funkcji.

0

Halo?
Już kilka dni i brak pomysłów? Nie wierze, że to jakiś odosobniony przypadek występujący tylko na 8 komputerach na których sprawdzałem. Druga sprawa, że forum istnieje już parę dobrych lat i liczyłem na to, że bardziej doświadczeni „wyjadacze” przez ten czas musieli się spotkać z większością problemów występujących przy tworzeniu programów w Delphi.
Niewiem jak usługi systemowe ale to dalej chyba warstwa ring3 pomimo uprawnień systemowych.
Ewentualnie co myślicie o napisaniu sterownika systemowego zamiast typowej aplikacji, ma to szanse zadziałać?

//edit: Całość ma działać na win xp pro na koncie z ogranicionymi uprawnieniami.

0

Troche malo danych podajesz to sie nikomu nie chce nie dziala ... daj chociaz kody bledow (czytajac mozna odniesc wrazenie, ze tobie sie tez nie chce @vanish77:Tutaj już nie sprawdzałem czy funkcja ...).
Popatrz na AdjustTokenPrivileges, moze pomoze.

0

To nie jest pytanie z Delphi tylko z WinAPI. Po prostu zwyklu user nie ma uprawnien do zabijania procesow (no chyba, ze nadasz mu takie uprawnienia w systemie). Musisz to zrobic jako uzytkownik z uprawnieniami admina. Poczytaj w helpie WinAPI lub na msdn o funkcjach LogonUser i ImpersonateLoggedOnUser...

1 użytkowników online, w tym zalogowanych: 0, gości: 1