Control de cuentas del usuario es uno de los atributos más importantes de las cuentas de usuario y equipo en Active Directory. Este atributo determina el estado de la cuenta en el dominio AD: si la cuenta está activa o bloqueada, si la opción de cambio de contraseña en el próximo inicio de sesión está habilitada, si los usuarios pueden cambiar sus contraseñas, etc. Sin embargo, no todos los administradores están completamente consciente de cómo y con qué propósito se usa el atributo UserAccountControl en AD.
Abra las propiedades de cualquier cuenta de AD en la consola de Usuarios y equipos de Active Directory (ADUC) y vaya a la Cuenta pestaña. Por favor, preste atención al grupo de atributos de usuario en el Opciones de cuenta sección. Aquí puede ver las siguientes opciones:
- El usuario debe cambiar la contraseña en el próximo inicio de sesión;
- El usuario no puede cambiar la contraseña;
- La contraseña nunca expira;
- Almacene la contraseña usando cifrado reversible (no seguro);
- Cuenta deshabilitada;
- Se requiere una tarjeta inteligente para el inicio de sesión interactivo;
- La cuenta es sensible y no se puede delegar;
- Utilice los tipos de cifrado Kerberos DES para esta cuenta;
- Esta cuenta admite el cifrado Kerberos AES de 128/256 bits;
- No requiere autenticación previa de Kerberos.
Cada uno de estos atributos de cuenta de usuario es esencialmente un valor de bit que puede estar en el estado 1 (Verdadero) o 0 (Falso). Sin embargo, estos valores no se almacenan como atributos de AD separados, en su lugar se usa el atributo UserAccountControl.
UserAccountControl como atributo de Active Directory
El valor total de todas las opciones especificadas anteriormente se mantiene en el valor de Control de cuentas del usuario atributo, es decir, en lugar de almacenar todas estas opciones en diferentes atributos, se utiliza un único atributo de Active Directory. UserAccountControl es un máscara de bits cada bit es una bandera separada y tiene un valor diferente (habilitado o deshabilitado). Entonces, dependiendo de las opciones de cuenta habilitadas, un usuario tendrá diferentes valores de atributo UserAccountControl. Puede ver el valor actual del atributo en la pestaña correspondiente del Editor de atributos o usando el cmdlet Get-ADUser en PowerShell:
get-aduser jkelly -properties *|select name,UserAccountControl | ft
En este ejemplo, el valor del atributo es 0x10202 (el valor decimal es 66050). Que significan estos numeros?
La tabla de banderas disponibles de cuentas AD se muestra a continuación. Cada bandera corresponde a un determinado bit de UserAccountControl y el valor de UserAccountControl es igual a la suma de todas las banderas.
Bandera UserAccountControl | Valor HEX | Valor decimal |
SCRIPT (Ejecutando el script de inicio de sesión) | 0x0001 | 1 |
ACCOUNTDISABLE (La cuenta está deshabilitada) | 0x0002 | 2 |
HOMEDIR_REQUIRED (Se requiere la carpeta de inicio) | 0x0008 | 8 |
BLOQUEO (La cuenta está bloqueada) | 0x0010 | dieciséis |
PASSWD_NOTREQD (No se requiere contraseña) | 0x0020 | 32 |
PASSWD_CANT_CHANGE (Evitar que el usuario cambie la contraseña) | 0x0040 | 64 |
ENCRYPTED_TEXT_PWD_ALLOWED (Almacenar contraseña con cifrado reversible) | 0x0080 | 128 |
TEMP_DUPLICATE_ACCOUNT (una cuenta de un usuario, cuya cuenta principal está en otro dominio) | 0x0100 | 256 |
NORMAL_ACCOUNT (una cuenta predeterminada, una cuenta activa típica) | 0x0200 | 512 |
INTERDOMAIN_TRUST_ACCOUNT | 0x0800 | 2048 |
WORKSTATION_TRUST_ACCOUNT | 0x1000 | 4096 |
SERVER_TRUST_ACCOUNT | 0x2000 | 8192 |
DONT_EXPIRE_PASSWORD (cuentas de usuario con contraseñas que no caducan) | 0x10000 | 65536 |
MNS_LOGON_ACCOUNT | 0x20000 | 131072 |
SMARTCARD_REQUIRED (Para iniciar sesión en la red, el usuario necesita una tarjeta inteligente) | 0x40000 | 262144 |
TRUSTED_FOR_DELEGATION | 0x80000 | 524288 |
NOT_DELEGATED | 0x100000 | 1048576 |
USE_DES_KEY_ONLY | 0x200000 | 2097152 |
DONT_REQ_PREAUTH (no se requiere autenticación previa de Kerberos) | 0x400000 | 4194304 |
PASSWORD_EXPIRED (La contraseña de usuario ha caducado) | 0x800000 | 8388608 |
TRUSTED_TO_AUTH_FOR_DELEGATION | 0x1000000 | 16777216 |
PARTIAL_SECRETS_ACCOUNT | 0x04000000 | 67108864 |
Por ejemplo, hay una cuenta normal para la que el requisito de cambiar la contraseña está deshabilitado. El valor de userAccountControl se calcula de la siguiente manera:
NORMAL_ACCOUNT (512) + DONT_EXPIRE_PASSWORD (65536) = 66048
Entonces, el valor de userAccountControl de mi ejemplo (66050) se obtuvo de la siguiente manera:
NORMAL_ACCOUNT (512) + DONT_EXPIRE_PASSWORD (65536) + ACCOUNTDISABLE (2) = 66050
Una cuenta de usuario bloqueada tiene 514 como valor de userAccountControl:
(NORMAL_ACCOUNT (512)+ ACCOUNTDISABLE (2) = 514
Valores predeterminados de UserAccountControl para objetos de dominio típicos:
- Un usuario habitual de AD: 0x200 (512);
- Un controlador de dominio: 0x82000 (532480);
- Una estación de trabajo / servidor: 0x1000 (4096).
Con algunos filtros, puede seleccionar entre los objetos AD con un determinado valor de control de cuenta de usuario. Por ejemplo, para mostrar todas las cuentas activas (normales):
Get-ADUser -Properties * -ldapFilter "(useraccountcontrol=512)"
Muestra la lista de todas las cuentas bloqueadas:
Get-ADUser -Properties * -ldapFilter "(useraccountcontrol=514)"
La lista de cuentas con opciones de contraseña que no caducan:
Get-ADUser -Properties * -ldapFilter "(useraccountcontrol=66048)"
Puede sumar los bits necesarios de la tabla y seleccionar objetos AD usando estos comandos:
$UserAccountControl_hex= 0x10000 + 0x0080 + 0x200000
Get-ADUser -Filter {UserAccountControl -band$UserAccountControl_hex}
Script de PowerShell para decodificar el valor UserAccountControl
Para hacerlo más conveniente, quiero tener una herramienta que convierta automáticamente el valor de la máscara de bits UserAccountControl en una forma transparente para humanos. Intentemos escribir una función simple de PowerShell que toma el valor decimal del atributo UserAccountControl y devuelve la lista de opciones habilitadas de la cuenta. Dado que UserAccountControl es una máscara de bits, puede asignar una descripción de texto a cada bit.
Escribí esta función de PowerShell DecodeUserAccountControl para convertir el valor de UserAccountControl en una pieza de información legible:
Function DecodeUserAccountControl ([int]$UAC)
{
$UACPropertyFlags = @(
"SCRIPT",
"ACCOUNTDISABLE",
"RESERVED",
"HOMEDIR_REQUIRED",
"LOCKOUT",
"PASSWD_NOTREQD",
"PASSWD_CANT_CHANGE",
"ENCRYPTED_TEXT_PWD_ALLOWED",
"TEMP_DUPLICATE_ACCOUNT",
"NORMAL_ACCOUNT",
"RESERVED",
"INTERDOMAIN_TRUST_ACCOUNT",
"WORKSTATION_TRUST_ACCOUNT",
"SERVER_TRUST_ACCOUNT",
"RESERVED",
"RESERVED",
"DONT_EXPIRE_PASSWORD",
"MNS_LOGON_ACCOUNT",
"SMARTCARD_REQUIRED",
"TRUSTED_FOR_DELEGATION",
"NOT_DELEGATED",
"USE_DES_KEY_ONLY",
"DONT_REQ_PREAUTH",
"PASSWORD_EXPIRED",
"TRUSTED_TO_AUTH_FOR_DELEGATION",
"RESERVED",
"PARTIAL_SECRETS_ACCOUNT"
"RESERVED"
"RESERVED"
"RESERVED"
"RESERVED"
"RESERVED"
)
$Attributes = ""
1..($UACPropertyFlags.Length) | Where-Object {$UAC -bAnd [math]::Pow(2,$_)} | ForEach-Object {If ($Attributes.Length -EQ 0) {$Attributes = $UACPropertyFlags[$_]} Else {$Attributes = $Attributes + " | " + $UACPropertyFlags[$_]}}
Return $Attributes
}
Veamos qué significa el valor 66050 de UserAccountControl:
DecodeUserAccountControl 66050
Como puede ver, el script ha devuelto que los siguientes atributos están habilitados para este usuario:
ACCOUNTDISABLE | NORMAL_ACCOUNT | DONT_EXPIRE_PASSWORD
El mismo script se puede usar para decodificar los valores UserAccountControl sobre la marcha al obtener la información sobre las cuentas de AD en la forma conveniente usando los cmdlets Get-AdUser o Get-ADComputer, por ejemplo:
get-aduser ms-pam -properties *|select @{n='UsrAcCtrl';e={DecodeUserAccountControl($_.userAccountControl)}}
ACCOUNTDISABLE | NORMAL_ACCOUNT | DONT_EXPIRE_PASSWORD
get-adcomputer rome-dc01 -properties *|select @{n='UsrAcCtrl';e={DecodeUserAccountControl($_.userAccountControl)}}
SERVER_TRUST_ACCOUNT | TRUSTED_FOR_DELEGATION
Artículos Interesantes
Relacionados:
Contenido