2010-08-03 14 views
6

Estoy tratando de obtener la ruta del proceso por pid, pero obtengo la excepción Win32Exception (acceso denegado).Acceso denegado al obtener la ruta del proceso

El código es el siguiente:

string path = Process.GetProcessById(pid).MainModule.FileName 

He intentado usar OpenProcess con GetModuleFileNameEx pero OpenProcess vuelve 0. Incluso he intentado que permite SeDebugPrivilege acuerdo con C# – How to enable SeDebugPrivilege pero no sirvió de nada.

El código anterior funciona para la mayoría de los procesos pero arroja un error para SynTPHelper.exe (Synaptics Pointing Device Helper) La aplicación se ejecuta con el mismo nombre de usuario que mi código. Tanto mi aplicación como el proceso se ejecutan en 64 bits.

¿Es posible recuperar la ruta sin ejecutando mi aplicación como administrador?

Editar

Task Manager es capaz de 'ubicación del archivo abierto' a pesar de que no estoy corriendo como un administrador.

Respuesta

12

Finalmente logré resolverlo. Al final resultó que hay una nueva función en Vista y de arriba para obtener la ruta del proceso y el nuevo acceso de proceso (PROCESS_QUERY_LIMITED_INFORMATION):

QueryFullProcessImageName

Este es el código que funciona de no elevada proceso:

private static string GetExecutablePathAboveVista(UIntPtr dwProcessId) 
    { 
     StringBuilder buffer = new StringBuilder(1024); 
     IntPtr hprocess = OpenProcess(ProcessAccessFlags.PROCESS_QUERY_LIMITED_INFORMATION, false, dwProcessId); 
     if (hprocess != IntPtr.Zero) 
     { 
      try 
      { 
       int size = buffer.Capacity; 
       if (QueryFullProcessImageName(hprocess, 0, buff, out size)) 
       { 
        return buffer.ToString(); 
       } 
      } 
      finally 
      { 
       CloseHandle(hprocess); 
      } 
     } 
     return string.Empty; 
    } 
+3

Muchas gracias por http://www.aboutmycode.com/net-framework/how-to-get-elevated-process-path-in-net/ (¿ese es el mismo Giorgi?). Copiar/Pasar/Reformatear/Añadir algunos espacios de nombres y funciona! :) –

+0

@Andreas: Sí, es solo mi blog. – Giorgi

+3

PROCESS_QUERY_LIMITED_INFORMATION = 0x1000; http://msdn.microsoft.com/en-us/library/windows/desktop/ms684880(v=vs.85).aspx – Jason

1

Bueno, ciertamente no es raro que los servicios eliminen los derechos de acceso para que incluso un administrador no pueda abrir el proceso. Un servicio tiene suficientes privilegios para hacerlo, los componentes de DRM como audiodg.exe lo hacen fácilmente. Un mouse pad helper no me parece algo que requiera tal protección. Pero qué diablos, ¿por qué alguien necesitaría meterse con un mouse pad helper?

+0

No estoy tratando de meterme con eso, solo quiero obtener una lista de procesos con ruta ejecutándose bajo el usuario actual. – Giorgi

+0

Póngase en contacto con Synaptics para obtener asistencia. Prepárate para el ¿Por qué? pregunta. –

+0

audiodg.exe también es un proceso protegido IIRC por lo que recibe protección así gratis – Anders

Cuestiones relacionadas