Estoy ejecutando un proceso como usuario en el grupo Administradores, tratando de obtener un token de proceso para otro proceso. El otro proceso lo ejecuta un usuario que no está en el grupo Administradores. Aquí está la esencia del código que estoy usando. pid en este código representa la identificación del proceso del proceso que no es administrador. Todo esto está en Windows XP SP 2 y todo en la misma máquina. No hay acceso remoto pasando aquí.¿Por qué OpenProcessToken falla con ERROR_ACCESS_DENIED
HANDLE handle;
HANDLE token;
handle = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,pid);
token = NULL;
OpenProcessToken(handle,TOKEN_DUPLICATE,&token);
referencia para OpenProcess aquí: http://msdn.microsoft.com/en-us/library/ms684320%28VS.85%29.aspx
referencia para OpenProcessToken aquí: http://msdn.microsoft.com/en-us/library/aa379295%28VS.85%29.aspx
OpenProcess tiene éxito, pero no importa lo que pase para el argumento DesiredAccess a OpenProcessToken, se produce un error y el retorno GetLastError() ERROR: ACCESO DENEGADO. Agregué un código para entender los privilegios del proceso que ejecuta este código y para habilitar el mayor número posible, así como para reunir información sobre el proceso que estoy tratando de obtener un token. Eso implicó solicitar más acceso (READ_CONTROL | ACCESS_SYSTEM_SECURITY además de PROCESS_QUERY_INFORMATION) de OpenProcess y llamar a GetKernelObjectSecurity (handle). Esto es lo que tengo:
current user: PLEASE_T\dbyron (S-1-5-21-3405506234-1792454352-3826119157-1005) current process: group 0: flags: 0x00000007 sid: S-1-5-21-3405506234-1792454352-3826119157-513 (PLEASE_T\None) current process: group 1: flags: 0x00000007 sid: S-1-1-0 (\Everyone) current process: group 2: flags: 0x0000000F sid: S-1-5-32-544 (BUILTIN\Administrators) current process: group 3: flags: 0x00000007 sid: S-1-5-32-545 (BUILTIN\Users) current process: group 4: flags: 0x00000007 sid: S-1-5-4 (NT AUTHORITY\INTERACTIVE) current process: group 5: flags: 0x00000007 sid: S-1-5-11 (NT AUTHORITY\Authenticated Users) current process: group 6: flags: 0xC0000007 sid: S-1-5-5-0-91553 (no account mapping) current process: group 7: flags: 0x00000007 sid: S-1-2-0 (\LOCAL) SeDebugPrivilege privilege enabled SeTakeOwnershipPrivilege privilege enabled SeSecurityPrivilege privilege enabled SeChangeNotifyPrivilege privilege enabled SeBackupPrivilege privilege enabled SeRestorePrivilege privilege enabled SeSystemtimePrivilege privilege enabled SeShutdownPrivilege privilege enabled SeRemoteShutdownPrivilege privilege enabled SeDebugPrivilege privilege enabled SeSystemEnvironmentPrivilege privilege enabled SeSystemProfilePrivilege privilege enabled SeProfileSingleProcessPrivilege privilege enabled SeIncreaseBasePriorityPrivilege privilege enabled SeLoadDriverPrivilege privilege enabled SeCreatePagefilePrivilege privilege enabled SeIncreaseQuotaPrivilege privilege enabled SeUndockPrivilege privilege enabled SeManageVolumePrivilege privilege enabled SeImpersonatePrivilege privilege enabled SeCreateGlobalPrivilege privilege enabled
He tratado de conseguir todos los privilegios posibles, y creo que la información del grupo anterior muestra que el proceso llamando OpenTokenProcess es un miembro del grupo de administradores.
Aquí está la información de GetKernelObjectSecurity:
control(SE_DACL_PRESENT | SE_SELF_RELATIVE, 0x00008004) owner sid: S-1-5-21-3405506234-1792454352-3826119157-2807 (PLEASE_T\dummyusr) group sid: S-1-5-21-3405506234-1792454352-3826119157-513 (PLEASE_T\None) grant: mask(PROCESS_ALL_ACCESS, 0x001F0FFF), flags(0x00000000): S-1-5-21-3405506234-1792454352-3826119157-2807 (PLEASE_T\dummyusr) grant: mask(PROCESS_ALL_ACCESS, 0x001F0FFF), flags(0x00000000): S-1-5-32-544 (BUILTIN\Administrators) grant: mask(PROCESS_ALL_ACCESS, 0x001F0FFF), flags(0x00000000): S-1-5-18 (NT AUTHORITY\SYSTEM)
lo que parece que el proceso dummyusr (no administrador) permite el acceso al grupo de administradores. Es posible que esté malinterpretando el ¿Entonces por qué OpenProcessToken falla con ERROR_ACCESS_DENIED? Intenté cambiar TOKEN_DUPLICATE por TOKEN_QUERY, pero eso no cambia el resultado.
¿E-uniendo un privilegio? ¿Qué otra cosa me negaría el acceso a un token de acceso para este proceso? Lo intenté en una máquina sin software antivirus y todavía obtengo el mismo resultado.
También probé esto ejecutándose en el contexto del sistema. La información sobre el proceso en curso en ese caso es:
current user: NT AUTHORITY\SYSTEM (S-1-5-18) current process: group 0: flags: 0x0000000E sid: S-1-5-32-544 (BUILTIN\Administrators) current process: group 1: flags: 0x00000007 sid: S-1-1-0 (\Everyone) current process: group 2: flags: 0x00000007 sid: S-1-5-11 (NT AUTHORITY\Authenticated Users)
Tenga en cuenta que las banderas son ligeramente diferentes para el grupo BUILTIN \ Administradores. El proceso de administrador tenía 0xF y el proceso del sistema tenía 0xE. Desde http://msdn.microsoft.com/en-us/library/aa379624%28VS.85%29.aspx, el bit 0x1 significa SE_GROUP_MANDATORY que no parece relevante aquí.
Por defecto, el proceso de contexto del sistema también tenía algunos privilegios adicionales:
SeAuditPrivilege SeCreatePermanentPrivilege SeLockMemoryPrivilege SeTcbPrivilege
Pero todos ellos discapacitado y OpenProcessToken todavía tuvieron éxito en el proceso de contexto del sistema.
Gracias por su ayuda.
(1) buena pregunta. Me enfrento a este tipo de problemas cada pocos meses cuando escribo un nuevo servicio de Windows, y obviamente cada vez que me olvido del baile. –
¿Encontró una solución? (excepto que se ejecuta como servicio local) – vdk