Skip to content

Instantly share code, notes, and snippets.

@joshfinley
Created May 13, 2025 19:47
Show Gist options
  • Save joshfinley/e30fd912c55d1cfd9ac4913dfe488ac9 to your computer and use it in GitHub Desktop.
Save joshfinley/e30fd912c55d1cfd9ac4913dfe488ac9 to your computer and use it in GitHub Desktop.
Convert AD UAC values to decimal or human readable forms
import argparse
def set_user_account_control_value_table():
return {
"SCRIPT": 1,
"ACCOUNTDISABLE": 2,
"HOMEDIR_REQUIRED": 8,
"LOCKOUT": 16,
"PASSWD_NOTREQD": 32,
"ENCRYPTED_TEXT_PWD_ALLOWED": 128,
"TEMP_DUPLICATE_ACCOUNT": 256,
"NORMAL_ACCOUNT": 512,
"INTERDOMAIN_TRUST_ACCOUNT": 2048,
"WORKSTATION_TRUST_ACCOUNT": 4096,
"SERVER_TRUST_ACCOUNT": 8192,
"DONT_EXPIRE_PASSWORD": 65536,
"MNS_LOGON_ACCOUNT": 131072,
"SMARTCARD_REQUIRED": 262144,
"TRUSTED_FOR_DELEGATION": 524288,
"NOT_DELEGATED": 1048576,
"USE_DES_KEY_ONLY": 2097152,
"DONT_REQ_PREAUTH": 4194304,
"PASSWORD_EXPIRED": 8388608,
"TRUSTED_TO_AUTH_FOR_DELEGATION": 16777216,
"PARTIAL_SECRETS_ACCOUNT": 67108864
}
def get_user_account_control_flags(value):
flags_table = set_user_account_control_value_table()
sorted_flags = dict(sorted(flags_table.items(), key=lambda item: item[1]))
return [name for name, bit in sorted_flags.items() if value & bit]
def compute_user_account_control_value(flag_names):
flags_table = set_user_account_control_value_table()
value = 0
for name in flag_names:
upper = name.strip().upper()
if upper in flags_table:
value |= flags_table[upper]
else:
raise ValueError(f"Invalid flag: {name}")
return value
def main():
parser = argparse.ArgumentParser(
description="Decode or compute userAccountControl flags."
)
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument(
"-d", "--decode", type=int,
help="Decode a userAccountControl integer value into flags."
)
group.add_argument(
"-c", "--compute", nargs="+",
help="Compute userAccountControl integer value from a list of flags."
)
args = parser.parse_args()
if args.decode is not None:
flags = get_user_account_control_flags(args.decode)
print(f"Flags set for value {args.decode}:")
for flag in flags:
print(f"- {flag}")
elif args.compute is not None:
try:
result = compute_user_account_control_value(args.compute)
print(f"Bitmask value for flags {args.compute}: {result}")
except ValueError as e:
print(f"Error: {e}")
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment