2012-02-05 10 views
12

Estoy tratando de obtener un nombre de proceso de su pid. El usuario se está ejecutando como administrador, UAC habilitado, no elevado.¿Cómo obtener un nombre de archivo de proceso de pid, si OpenProcess() falla con ACCESS_DENIED?

Algunos procesos del sistema, como services.exe, tienen su seguridad configurada de tal manera que OpenProcess(PROCESS_QUERY_INFORMATION ... falla con ERROR_ACCESS_DENIED. Mismo resultado con acceso PROCESS_QUERY_LIMITED_INFORMATION a la derecha. Sin embargo, puedo ver que Process Explorerpuede al menos enumerar todos estos procesos, junto con su pid y nombre de archivo (cuando se ejecuta como administrador no elevado).

Mi pregunta es, ¿cómo puedo hacer lo mismo (obtener el nombre de archivo de pid), dado que el administrador no elevado no puede seguir la ruta habitual de OpenProcess() + GetProcessImageFileName()?

Respuesta

9

has necesitado Process32First() y Process32Next() con un mango recuperado por CreateToolhelp32Snapshot()? No le da la ruta completa, pero al menos debería permitirle obtener el nombre del archivo.

+0

Gracias Jim: fue una sugerencia brillante. Si alguien necesita ejemplo, aquí hay un [MSDN uno] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686701%28v=vs.85%29.aspx) – baderman

3

¿Has probado PROCESS_QUERY_LIMITED_INFORMATION en su lugar? Solicita un menor nivel de acceso que puede proporcionar al menos el nombre del ejecutable. Se le permite llamar a QueryFullProcessImageName que proporciona la información que está buscando

+1

Lo siento edité justo antes de su respuesta. Sí, probé esto, y no ayuda. Mismo acceso denegado error. – haimg

+1

Un identificador de un proceso de sistema abierto con PROCESS_QUERY_LIMITED_INFORMATION no le permitirá llamar a QueryFullProcessImageName. Falla con el error 31 "Un dispositivo conectado al sistema no funciona". incluso cuando mi programa se ejecuta con derechos de administrador completos (sin el privilegio SE_DEBUG). –

5

No se pueden abrir los procesos del sistema (más precisamente, los procesos que se ejecutan bajo otra cuenta, en este caso el SISTEMA del usuario) sin el privilegio SE_DEBUG habilitado para su proceso. Si se está ejecutando como administrador, puede establecer fácilmente el privilegio: http://support.microsoft.com/kb/131065/en-us

+1

Ese artículo es un poco anticuado. Lamentablemente, no puede obtener SeDebugPrivilege a menos que sea elevado (UAC). – haimg

+0

@haimg: busqué en Google un poco pero no pude encontrar nada sobre eso, ¿tienes algún enlace donde dice eso? – pezcode

+1

Lo intenté en mi código ... Sin embargo, mira aquí: http://msdn.microsoft.com/en-us/library/bb530410.aspx. Dice que SeDebugPrivilege se elimina de un token restringido (para el administrador). – haimg

Cuestiones relacionadas