Pregunta

Esto es raro.Anteriormente, al ejecutar Windows 7 x64, tenía problemas para llamar a Win32 OpenProcess en procesos de 64 bits.Busqué en Google un poco y llegué a la conclusión de que esto simplemente no iba a suceder.

Entonces sucedió algo gracioso.Lo probé con el ID del proceso de explorer.exe y carpa santa, ¡funcionó!Comencé a arrojarle otras ID de proceso, y es solo un maldito juego de azar.

Resulta que puedo llamar a OpenProcess contra una buena cantidad de procesos x64: explorer, itype, ipoint, taskhost, cmd, mstsc, ..., etc.

Y otros muestran un 5 (Acceso denegado): winlogon, csrss, servicios, svchost, mdm, ...

Estoy confirmando el "bitness" y la identificación del proceso usando Process Explorer.Además, llamar a GetModuleFileNameEx en procesos de 64 bits siempre falla, por lo que ofrece una doble verificación de 32/64.

Este es el código:

' Get a handle to the process.
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcessID)
If hProcess Then
   ' Grab the filename for base module.
   nChars = GetModuleFileNameEx(hProcess, 0, Buffer, Len(Buffer))
   ' If running in x64, http://winprogger.com/?p=26
   If Err.LastDllError = ERROR_PARTIAL_COPY Then
      nChars = GetProcessImageFileName(hProcess, Buffer, Len(Buffer))
   End If
   ' Truncate and return buffer.
   If nChars Then
      GetProcessFileName = Left$(Buffer, nChars)
   End If
   Call CloseHandle(hProcess)
Else
   Debug.Print "LastDllError:"; Err.LastDllError
End If

Nada sofisticado.Solo quiero consultar los procesos para cosas como el nombre de archivo o los tiempos de proceso.¿Alguien tiene alguna idea de qué diferencia entre los que puedo abrir y los que no?

Información extra:Ejecutando proceso como administrador.UAC apagado.Sí, es una aplicación de 32 bits.No he obtenido mejores resultados con PROCESS_QUERY_LIMITED_INFORMATION.

Gracias...carlos

¿Fue útil?

Solución

Los procesos que usted citó (winlogon, csrss, etc.) son los procesos y servicios críticos del sistema. Se ejecutan bajo una cuenta diferente, privilegiada. A pesar de que se está ejecutando como administrador, que no es el propietario de esos procesos y por lo tanto no se le otorga ningún derecho sobre su LCA. Al intentar abrir resultará en el acceso negado.

Sin embargo, los miembros del grupo de administradores tienen SeDebugPrivilege. Esto es, básicamente, una anulación de OpenProcess y OpenThread que permitirá abrir el acceso para todos, incluso si no se le concede ningún permiso en la ACL.

SeDebugPrivilege es, obviamente, un privilegio muy peligroso tener - se puede pasar por alto los controles de acceso y modificar / inspeccionar los procesos de otros usuarios. A pesar de que está presente en señal de una administración por defecto, no está activada por defecto. Necesita habilitar este privilegio antes de llamar OpenProcess.

MSDN artículo da código de ejemplo sobre cómo activar y desactivar los privilegios en su ficha.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top