Conversión de valores de atributo de UserAccountControl de AD

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.

Opciones de cuenta de usuario de AD - UserAccountControl

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

valor de get-aduser UserAccountControl

Valor de UserAccountControl en el editor de atributos de anuncios

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:

  1. Un usuario habitual de AD: 0x200 (512);
  2. Un controlador de dominio: 0x82000 (532480);
  3. 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

Función DecodeUserAccountControl PowerShell

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

get-adcomputer con DecodeUserAccountControl

Artículos Interesantes