Ir al contenido


Foto

Obtener lista de procesos ejecutados como administrador


  • Por favor identifícate para responder
11 respuestas en este tema

#1 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 02 febrero 2017 - 03:32

Hola tengo problemas al extraer la informacón de la lista  de procesos ejecutados por el usuario q esten elevados a nivel adnimistrador en w10


  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 febrero 2017 - 05:57

Esta función te devuelve del usuario y dominio que creó un proceso:


php
  1. function GetUserAndDomainFromPID(ProcessId: Cardinal; var User, Domain: String): boolean;
  2. var
  3. snu: SID_NAME_USE;
  4. pProcessInfo: TA_WTS_PROCESS_INFO;
  5. nProc,UserSize, DomainSize: Cardinal;
  6. begin
  7. Result:= false;
  8. nProc:= 0;
  9. UserSize:= 0;
  10. DomainSize:= 0;
  11.  
  12. if WTSEnumerateProcessesA(0, 0, 1, PWTS_PROCESS_INFO(pProcessInfo), nProc) then
  13. begin
  14. repeat dec(nProc) until (nProc <= 0) or (ProcessId = pProcessInfo[nProc].ProcessId);
  15. LookupAccountSid(nil, pProcessInfo[nProc].pUserSid, nil, UserSize, nil, DomainSize, snu);
  16. if (UserSize <> 0) or (DomainSize <> 0) then
  17. begin
  18. SetLength(User, UserSize);
  19. SetLength(Domain, DomainSize);
  20. Result:= LookupAccountSid(nil, pProcessInfo[nProc].pUserSid, @User[1], UserSize, @Domain[1], DomainSize, snu);
  21. end;
  22. WTSFreeMemory(pProcessInfo);
  23. end;

Esta función te informa si el usuario del proceso actual es administrador:


delphi
  1. function IsAdmin: boolean;
  2. var
  3. scManager: SC_HANDLE;
  4. begin
  5. scManager:= OpenSCManagerW(nil, nil, SC_MANAGER_ALL_ACCESS);
  6. if scManager <> 0 then
  7. CloseServiceHandle(scManager);
  8. Result:= scManager <> 0;
  9. end;

Esta otra te permite saber si un proceso fue creado por un usuario que pertenece a un grupo, está escrita en C:


cpp
  1. BOOL BelongGroup(char *Group, int PID)
  2. {
  3. HANDLE hProcess, hAccessToken;
  4. UCHAR InfoBuffer[1024];
  5. PTOKEN_GROUPS ptgGroups = (PTOKEN_GROUPS)InfoBuffer;
  6. DWORD dwInfoBufferSize;
  7. SID_NAME_USE snuInfo;
  8. UCHAR szAccountName[256], szDomainName[256];
  9.  
  10. DWORD dwAccountNameSize, dwDomainNameSize;
  11. UINT x;
  12.  
  13. hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, PID);
  14.  
  15. if(!OpenProcessToken(hProcess,TOKEN_READ,&hAccessToken))
  16. return(FALSE);
  17.  
  18. if(!GetTokenInformation(hAccessToken,TokenGroups,InfoBuffer, 1024, &dwInfoBufferSize))
  19. return(FALSE);
  20.  
  21. for(x=0;x<ptgGroups->GroupCount;x++){
  22. dwAccountNameSize = 256;
  23. dwDomainNameSize = 256;
  24.  
  25. LookupAccountSid(NULL, ptgGroups->Groups[x].Sid, szAccountName,
  26. &dwAccountNameSize, szDomainName, &dwDomainNameSize, &snuInfo);
  27.  
  28. if(!strcmp(szAccountName, Group) && !strcmp(szDomainName,"BUILTIN"))
  29. return(TRUE);
  30. }
  31. return(FALSE);
  32. }

Usada de esta forma, sabrás si es del grupo de administradores:


cpp
  1. if(BelongGroup("Administradores", 10376))
  2. Beep(1000, 100);

Saludos.


  • 1

#3 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 03 febrero 2017 - 07:29

No e probado el codigo todavia pero por lo q entendi de lo q explica usted eso me devuelve si el usuario con q se ejecuta es administrador o no, lo q necesito es saber si la aplicacion fue elevada a nivel de administrador con "Ejecutar como administrador", en el administrador de tareas te da esa informacion si es elevada o no, el usuario q va a ser esto siempre va ser del grupo administrativo. Ahora voy a porbar su codigo.

Saludos


  • 0

#4 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 03 febrero 2017 - 09:45

Buscando encontre esta función creo q es lo q necesito


delphi
  1. function RunningAsAdmin: boolean;
  2. var
  3. hToken, hProcess: THandle;
  4. pTokenInformation: pointer;
  5. ReturnLength: DWord;
  6. TokenInformation: TTokenElevation;
  7. begin
  8. hProcess := GetCurrentProcess;
  9. try
  10. if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then try
  11. TokenInformation.TokenIsElevated := 0;
  12. pTokenInformation := @TokenInformation;
  13. GetTokenInformation(hToken, TokenElevation, pTokenInformation, sizeof(TokenInformation), ReturnLength);
  14. result := (TokenInformation.TokenIsElevated > 0);
  15. finally
  16. CloseHandle(hToken);
  17. end;
  18. except
  19. result := false;
  20. end;
  21. end;


  • 0

#5 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 03 febrero 2017 - 10:10

Por que ocultar las excepciones?

Editado por Agustin Ortu, 03 febrero 2017 - 10:11 .

  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 03 febrero 2017 - 11:08

 

Buscando encontre esta función creo q es lo q necesito


delphi
  1. function RunningAsAdmin: boolean;
  2. var
  3. hToken, hProcess: THandle;
  4. pTokenInformation: pointer;
  5. ReturnLength: DWord;
  6. TokenInformation: TTokenElevation;
  7. begin
  8. hProcess := GetCurrentProcess;
  9. try
  10. if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then try
  11. TokenInformation.TokenIsElevated := 0;
  12. pTokenInformation := @TokenInformation;
  13. GetTokenInformation(hToken, TokenElevation, pTokenInformation, sizeof(TokenInformation), ReturnLength);
  14. result := (TokenInformation.TokenIsElevated > 0);
  15. finally
  16. CloseHandle(hToken);
  17. end;
  18. except
  19. result := false;
  20. end;
  21. end;

 

Esa función habla del proceso actual. Para eso, prefiero tratar de crear un servicio (OpenSCManagerW) pues solo los administradores pueden y precisa poco código.

 

Para saber si una app diferenre a la actual, se ejecuta con permisos de administrador prefiero comprobar si el usuario ese administrador con la función C que te mostré. Cuando tenga un rato te la traduzco, si no puedes.

 

Saludos.


  • 0

#7 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 03 febrero 2017 - 11:16

Por que ocultar las excepciones?

 

Personalmente prefiero no usar excepciones en código de bajo nivel. Son "devoradoras" especialmente cuando el tamaño es crítico. Otras veces son catastróficas como en la  inyección directa y shellcodes.

 

Saludos.


  • 1

#8 Dante

Dante

    Advanced Member

  • Miembros
  • PipPipPip
  • 89 mensajes

Escrito 03 febrero 2017 - 11:22

Tenia idea de usar la funcion q encontre cambiando hProcess := GetCurrentProcess; por el Handle del proceso q voy a utilizar, haber si me explico mejor con respecto a lo q nesesito y si estoy en lo correcto o no.

A partir de W Vista si no estoy herrado hay aplicaciones q aunque el usuario por el q se este trabajando se del grupo administrador  nesesitan Ejecutarse como Administrador, es decir yo tengo un usuario admin y ejecute una aplicación con esta opcion esta en un nivel administrativo del sistema, eso es lo q quiero detectar.


  • 0

#9 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 03 febrero 2017 - 11:34

Sí abres el proceso a tratar con OpenProcess te servirá. Debes hacer pruebas para ver si detecta privilegios elevados. Debería funcionar correctamente.

No puedo hacer pruebas pues no dispongo de PC a mano en este momento.

Saludos.


  • 0

#10 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 03 febrero 2017 - 12:20

Eso me pasa por no citar. En realidad era mas que nada por este codigo publicado por Dante, mensaje #4


delphi
  1. function RunningAsAdmin: boolean;
  2. var
  3. hToken, hProcess: THandle;
  4. pTokenInformation: pointer;
  5. ReturnLength: DWord;
  6. TokenInformation: TTokenElevation;
  7. begin
  8. hProcess := GetCurrentProcess;
  9. try
  10. if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then try
  11. TokenInformation.TokenIsElevated := 0;
  12. pTokenInformation := @TokenInformation;
  13. GetTokenInformation(hToken, TokenElevation, pTokenInformation, sizeof(TokenInformation), ReturnLength);
  14. result := (TokenInformation.TokenIsElevated > 0);
  15. finally
  16. CloseHandle(hToken);
  17. end;
  18. except
  19. result := false;
  20. end;
  21. end;

Siempre que veo un try-except con el except que "se come" u oculta la excepcion me dan escalofrios. En esa funcion el try-except esta totalmente de gusto


  • 0

#11 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 03 febrero 2017 - 06:28

Yo lo implementaría así:


delphi
  1. function RunningAsAdmin(PID: integer): boolean;
  2. const
  3.   TokenElevation = 20;
  4. var
  5.   hToken, hProcess: THandle;
  6.   ReturnLength: DWORD;
  7.   TokenInformation: TTokenElevation;
  8. begin
  9.   Result:= false;
  10.   hProcess:= OpenProcess(PROCESS_QUERY_INFORMATION, false, PID);
  11.   if hProcess <> 0 then
  12.   begin
  13.     if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then
  14.     begin
  15.       TokenInformation.TokenIsElevated := 0;
  16.       GetTokenInformation(hToken, TTokenInformationClass(TokenElevation), @TokenInformation, sizeof(TTokenElevation), ReturnLength);
  17.       Result:= (TokenInformation.TokenIsElevated > 0);
  18.       CloseHandle(hToken);
  19.     end;
  20.     CloseHandle(hProcess);
  21.   end;
  22. end;

Probada en delphi 7 y debe ser ejecutada desde un proceso ejecutado como administrador.

 

 

Saludos.


  • 0

#12 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 03 febrero 2017 - 06:48

En Builder 5 lo haría de este modo:


cpp
  1. #define TokenElevation 20
  2.  
  3. typedef struct _TOKEN_ELEVATION {
  4. DWORD TokenIsElevated;
  5. } TOKEN_ELEVATION, *PTOKEN_ELEVATION;
  6.  
  7. BOOL RunningAsAdmin(int PID)
  8. {
  9. HANDLE hToken, hProcess;
  10. DWORD ReturnLength;
  11. TOKEN_ELEVATION TokenInformation = {0};
  12. hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, false, PID);
  13. if(hProcess){
  14. if(OpenProcessToken(hProcess, TOKEN_QUERY, &hToken)){
  15. TokenInformation.TokenIsElevated = 0;
  16. GetTokenInformation(hToken, (TOKEN_INFORMATION_CLASS)TokenElevation, &TokenInformation, sizeof(TOKEN_ELEVATION), &ReturnLength);
  17. CloseHandle(hToken);
  18. }
  19. CloseHandle(hProcess);
  20. }
  21. return TokenInformation.TokenIsElevated > 0;
  22. }

Saludos.


  • 0




IP.Board spam blocked by CleanTalk.