Pregunta

Me gustaría saber cómo consultar para el propietario de un proceso en (o a través de) C#. He probado el ejemplo en http://www.codeproject.com/kb/cs/processownersid.aspx.

WMI: Puede consultar todo el proceso y sus dueños, pero es demasiado lento.

Win32: Rápido, pero obtengo una excepción de permiso negado al consultar para el propietario de cualquier proceso que no sea el mío.

He tratado de implementar suplantación para resolver el problema Win32, no GO. También he intentado ejecutar el Compilado .exe como administrador, no GO. Tengo solo unos meses después de esta cosa de C#, así que ve fácilmente.

¿Fue útil?

Solución

Agregué lo siguiente al ejemplo Win32 de: http://www.codeproject.com/kb/cs/processownersid.aspx

static void ProcessSID(Process process)
{
    string sid;
    ExGetProcessInfoByPID(process.Id, out sid);
    Console.WriteLine("{0} {1} {2}", process.Id, process.ProcessName, sid);
}

static void Main(string[] args)
{
    foreach (Process process in Process.GetProcesses())
    {
        ProcessSID(process);
    }
}

y cuando lo ejecuto como administrador, imprime con éxito el SIDS para todos los procesos (excepto el sistema y los procesos protegidos como AudioDG). No produce un error de acceso.

¿Este código funciona para usted?

También estoy usando Windows 7 x64.

Actualizar

Esto funciona para todos los procesos, excepto los procesos de Runas. El problema son las partes internas de Process.Handle, que solicitan demasiados permisos.

Si reemplaza la llamada a procesar.handle con

IntPtr procHandle=OpenProcess(ProcessAccessFlags.QueryInformation, false, PID);

y agregue las siguientes definiciones, entonces el código también funciona con los procesos Runas.

[Flags]
enum ProcessAccessFlags : uint
{
    All = 0x001F0FFF,
    Terminate = 0x00000001,
    CreateThread = 0x00000002,
    VMOperation = 0x00000008,
    VMRead = 0x00000010,
    VMWrite = 0x00000020,
    DupHandle = 0x00000040,
    SetInformation = 0x00000200,
    QueryInformation = 0x00000400,
    Synchronize = 0x00100000,
    ReadControl = 0x00020000
}

[DllImport("kernel32.dll")]
static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId);

Otros consejos

Parece que he entendido mal la pregunta primero, lo siento. Acabo de encontrar un tema interesante sobre el tema que puede ayudarlo.

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