Zamykanie procesu - odmowa dostępu!

dział ogólny

Zamykanie procesu - odmowa dostępu!

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 11 stycznia 2010, 11:28

Stworzyłem sobie funkcję do zamykania procesu aplikacji w oparciu o nazwę pliku procesu:

Kod: Zaznacz cały
//---------------------------------------------------------------------------
void __fastcall CloseProcess(String ProcesName)
{
HANDLE Snap;
PROCESSENTRY32 proces;

Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
proces.dwSize = sizeof(PROCESSENTRY32);

if(Process32First(Snap, &proces))
{
  do
  {
   if(proces.szExeFile[0] != '[')
   {
   if(SameText(proces.szExeFile, ProcesName))
   {
    ShowMessage("Proces odnaleziono - pobieram uchwyt"); /* komunikat kontrolny, sprawdzajÄ…cy czy odnaleziono proces */

    HANDLE hWnd = OpenProcess(PROCESS_ALL_ACCESS, false, proces.th32ProcessID);

    if(hWnd)
    {
     TerminateProcess(hWnd, ExitCode);
    }
    CloseHandle(hWnd);
    return;
   }
   }
  }
  while(Process32Next(Snap , &proces));
}
CloseHandle(Snap);
}
//---------------------------------------------------------------------------


Po skompilowaniu programu, po uruchomieniu z poziomu środowiska C++Builder 2010 i wywołaniu funkcji, wszystko działa poprawnie, proces zostaje odnaleziony, uchwyt jest pobierany do zmiennej hWnd poprzez funkcję OpenProcess, ale po uruchomieniu aplikacji bez środowiska C++builder, proces zostaje odnaleziony ale funkcja nie pobiera uchwytu do zmiennej hWnd i otrzymuję komunikat odmowa dostępu, co sprawdziłem funkcją GetLastError(). Próbowałem zmienić przywileje za pomocą funkcji AdjustTokenPrivileges, ale to nic nie zmienia:

Kod: Zaznacz cały
    HANDLE hToken;
    TOKEN_PRIVILEGES tkp;
    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES |
                                    TOKEN_QUERY, &hToken);
    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);

    HANDLE hWnd = OpenProcess(PROCESS_ALL_ACCESS, false, proces.th32ProcessID);


Ten fragment kodu nie działa prawidłowo:

Kod: Zaznacz cały
HANDLE hWnd = OpenProcess(PROCESS_ALL_ACCESS, false, proces.th32ProcessID);


Jakieś pomysły?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Zamykanie procesu - odmowa dostępu!

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 11 stycznia 2010, 11:57

Mam już rozwiązanie, trzeba użyć flagi: PROCESS_TERMINATE

To mnie jednak zastanawia:

► ErrorExit 


Kod: Zaznacz cały
    HANDLE hWnd = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proces.th32ProcessID);
   GetLastError();
   ErrorExit("OpenProcess: ");



OpenProcess: failed with error 5: Odmowa dostępu


Dlaczego nie uzyskuję pełnego dostępu. Parametr PROCESS_ALL_ACCESS powinien zapewnić pełen dostęp. Przypominam, ze problemem nie jest funkcja TerminateProcess lecz OpenProcess, która z parametrem PROCESS_ALL_ACCESS odmawia dostępu, podczas gdy z parametrem PROCESS_TERMINATE dostęp zostaje przyznany.
Nie rozumiem tego zachowania.

Czekam na sugestie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Zamykanie procesu - odmowa dostępu!

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 11 stycznia 2010, 12:26

No dobrze. W helpie znalazłem coś takiego:


If the caller has enabled the SeDebugPrivilege privilege, the requested access is granted regardless of the contents of the security descriptor.




Tak więc SeDebugPrivilege rozwiązuje problem z PROCESS_ALL_ACCESS:

► ostateczne rozwiÄ…zanie problemu 
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości