欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

AD 域 UserAccountControl 属性、AD 域重要用户属性

最编程 2024-05-06 08:24:46
...
武汉源创会回归,4月20聊聊大模型”

 

AD域UserAccountControl属性、AD域重要用户属性

    • 1. UserAccountControl属性
    • 2. 重要用户属性

 

1. UserAccountControl属性

因为在修改AD域用户状态的时候发现,一些博客给定的禁用和启用用户的状态值并不一致,参考官网文档和国外的博客发现用户在禁用状态下,也会包含其他属性,这些属性有些是相加的。全量的属性列表如下:

如何参考并使用这个对照表呢?

  • 可以搜索表中关于Disabled的行对应的十进制值,在程序中可以使用作为状态的判断——
    UserAccountControl属性为514546660506608066082里面的值的可以判断为禁用账号;
  • 搜索Enabled,值为54466048262656的以及默认账户类型512可以判断为启用账户;

在开发中,现在的做法是:

self.disabled_user_flag = [514, 546, 66050, 66080, 66082]       # 禁用账户的userAccountControl值列表
self.enabled_user_flag = [512, 544, 66048, 262656]              # 启用账户
...
if en['attributes']['userAccountControl'] in self.disabled_user_flag:		# 遍历用户的userAccountControl属性,在self.disabled_user_flag标志列表中的则为禁用账户
	pass
属性标志 十六进制 十进制 非官方值
SCRIPT 0x0001 1  
ACCOUNTDISABLE 0x0002 2  
HOMEDIR_REQUIRED 0x0008 8  
LOCKOUT 0x0010 16  
PASSWD_NOTREQD 0x0020 32  
PASSWD_CANT_CHANGE 0x0040 64  
ENCRYPTED_TEXT_PWD_ALLOWED 0x0080 128  
TEMP_DUPLICATE_ACCOUNT 0x0100 256  
NORMAL_ACCOUNT 默认账户 0x0200 512  
Disabled Account 禁用账户 0x0202 514 x
Enabled, Password Not Required 启用账户 不需密码 0x0220 544 x
Disabled, Password Not Required 禁用账户 不需密码 0x0222 546 x
INTERDOMAIN_TRUST_ACCOUNT 0x0800 2048  
WORKSTATION_TRUST_ACCOUNT 0x1000 4096  
SERVER_TRUST_ACCOUNT 0x2000 8192  
DONT_EXPIRE_PASSWORD 0x10000 65536  
Enabled, Password Doesn’t Expire 启用账户 密码未过期 0x10200 66048 x
Disabled, Password Doesn’t Expire 禁用账户 密码未过期 0x10202 66050 x
Disabled, Password Doesn’t Expire & Not Required 禁用账户 密码未过期且不需密码 0x10220 66080 x
Disabled, Password Doesn’t Expire & Not Required 禁用账户 密码未过期且不需密码 0x10222 66082 x
MNS_LOGON_ACCOUNT 0x20000 131072  
SMARTCARD_REQUIRED 0x40000 262144  
Enabled, Smartcard Required 下面几个都是需要使用智能卡登录账户(我们不涉及) 0x40200 262656 x
Disabled, Smartcard Required 0x40202 262658 x
Disabled, Smartcard Required, Password Not Required 0x40222 262690 x
Disabled, Smartcard Required, Password Doesn’t Expire 0x50202 328194 x
Disabled, Smartcard Required, Password Doesn’t Expire & Not Required 0x50222 328226 x
TRUSTED_FOR_DELEGATION 0x80000 524288  
Domain controller 0x82000 532480  
NOT_DELEGATED 0x100000 1048576  
USE_DES_KEY_ONLY 0x200000 2097152  
DONT_REQ_PREAUTH 0x400000 4194304  
PASSWORD_EXPIRED 0x800000 8388608  
TRUSTED_TO_AUTH_FOR_DELEGATION 0x1000000 16777216  
PARTIAL_SECRETS_ACCOUNT 0x04000000 67108864  

属性说明(可不看):

  • SCRIPT – 将运行登录脚本。
  • ACCOUNTDISABLE – 用户帐户已禁用。
  • HOMEDIR_REQUIRED – 主文件夹是必需的。
  • PASSWD_NOTREQD – 不需要密码。
  • PASSWD_CANT_CHANGE – 用户无法更改密码。这是对用户对象的权限。 有关如何以编程方式设置此权限的信息,请访问以下网站:Modifying User Cannot Change Password (LDAP Provider)
  • ENCRYPTED_TEXT_PASSWORD_ALLOWED – 用户可以发送加密的密码。
  • TEMP_DUPLICATE_ACCOUNT – 这是其主要帐户位于另一个域中的用户的帐户。该帐户为用户提供对该域的访问权限,但不提供对任何信任该域的域的访问权限。有时称为本地用户帐户。
  • NORMAL_ACCOUNT – 这是代表典型用户的默认帐户类型。
  • INTERDOMAIN_TRUST_ACCOUNT – 这是允许信任信任其他域的系统域的帐户的许可。
  • WORKSTATION_TRUST_ACCOUNT – 这是运行Microsoft Windows NT 4.0工作站,Microsoft Windows NT 4.0 Server,Microsoft Windows 2000 Professional或Windows 2000 Server的计算机的计算机帐户,并且是此域的成员。
  • SERVER_TRUST_ACCOUNT – 这是域控制器的计算机帐户,该域控制器是该域的成员。
  • DONT_EXPIRE_PASSWD – 表示密码,该密码永远不会在该帐户上过期。
  • MNS_LOGON_ACCOUNT – 这是MNS登录帐户。
  • SMARTCARD_REQUIRED – 设置此标志后,它将强制用户使用智能卡登录。
  • TRUSTED_FOR_DELEGATION – 设置此标志后,将为Kerberos委派信任运行该服务的服务帐户(用户或计算机帐户)。任何此类服务都可以模拟请求该服务的客户端。要为Kerberos委派启用服务,必须在服务帐户的userAccountControl属性上设置此标志。
  • NOT_DELEGATED – 设置此标志时,即使将服务帐户设置为受Kerberos委派的信任,也不会将用户的安全上下文委派给服务。
  • USE_DES_KEY_ONLY – (Windows 2000 / Windows Server 2003)将此主体限制为仅对密钥使用数据加密标准(DES)加密类型。
  • DONT_REQUIRE_PREAUTH – (Windows 2000 / Windows Server 2003)此帐户登录时不需要Kerberos预身份验证。
  • PASSWORD_EXPIRED – (Windows 2000 / Windows Server 2003)用户密码已过期。
  • TRUSTED_TO_AUTH_FOR_DELEGATION –(Windows 2000 / Windows Server 2003)帐户已启用委派。这是对安全性敏感的设置。启用此选项的帐户应受到严格控制。使用此设置,可以在帐户下运行的服务采用客户端的身份,并以该用户身份向网络上的其他远程服务器进行身份验证。
  • PARTIAL_SECRETS_ACCOUNT – (Windows Server 2008 / Windows Server 2008 R2)该帐户是只读域控制器(RODC)。这是对安全性敏感的设置。从RODC删除此设置会损害该服务器上的安全性。

2. 重要用户属性

AD域中的字段 含义 示例 说明
objectGUID 对象的唯一标识符 24699359-f8c2-482a-a3d6-e5557c31bd19 无需用户修改
sAMAccountName SAM账号 P009527 登录账号
distinguishedName 对象dn CN=李四9527,OU=研发支持,OU=上海总部,OU=XXX,OU=COM 对象在AD域中的位置
pwdLastSet 用户下次登录必须修改密码 0 默认不设置,需要强制其修改则设置为0
accountExpires 账户过期时间 0 设置为0永不过期,否则设置为NT时间
whenCreated 对象创建时间 2020-10-09 09:17:49+00:00 用于表示日期和时间的国际标准是ISO8601。其完整参考编号是ISO 8601:1988(E),其标题是“数据元素和交换格式-信息交换-日期和时间的表示”。
whenChanged 对象修改时间 2020-10-09 09:17:50+00:00  
displayname 显示名 李四  
sn  
givenName  
mail 电子邮件 si.li@XXX.com  
mobile 移动电话 15002510721,13341667654  
telephoneNumber 电话号码 051632423534  
company 公司 小米  
department 部门 研发支持  
title 职务 技术顾问  

accountExpires
如果您在AD中设置了一个帐户,该帐户于2020年10月15日下午5:00到期,则该帐户在AD中有效的最后一天是7月14日。
如果使用Microsoft管理控制台将帐户设置为在2020年10月15日到期,则“登录到期时间”的accountExpires属性设置为在2020年10月16日上午12:00到期,因为Microsoft管理控制台不允许使用要设置的时间值,默认值为12:00 am

在AD中将accountExpires的值设置为“ -1”将导致eDirectory设置为:2106年2月7日,美国东部标准时间(2860207062815Z)1:28:15。

**accountExpires**字段在创建用户的时候可以给定限制,假设当前时间是2020年11月23日,我们给这个用户三个月的有限期,则有如下`python`代码:

def   current_time2nt_time_plus_mouths ( M ):
     import  time
     import  datetime
     from  dateutil.relativedelta  import  relativedelta
     '''当前时间加一个时间差并转换为NT时间
    '''
    now = datetime.datetime.now()                # 当前时间
    now += relativedelta( months =M)               # 当前时间加上时间差
    timestamp = time.mktime(now.timetuple())
    timestamp *=  1000
    timestamp -=  57599875
    timestamp *=  10000
    timestamp +=  116445312000000000
    timestamp =  ' %d '  % timestamp
     return  timestamp
 
if   __name__  ==  "__main__" :
    ts = current_time2nt_time_plus_mouths( 3 )
     print (ts)

最后的ts假设为:

`132585363281250000` 

则为三个月后的此刻过期。

代码直接修改一个用户的过期时间字段为:

modify()方法中第一个参数为用户dn,第二个参数为待修改的内容:{'待修改字段': (2, [值])},2的意思是修改;con = con_ad()是AD服务器的连接,这里不写了。

# con = con_ad()
# modify_res = con.modify("CN=xxx,OU=xxx,OU=xxx,OU=xxx,DC=xxx,DC=com", {
#     'accountExpires': (2, [ts])})
# print(modify_res)