如何使用PowerShell编辑Active Directory对象类的默认安全设置
根据《Active Directory Cookbook》中的说明:
Active Directory中每个实例化的对象都关联一个结构类,该类定义了默认安全描述符(defaultSecurityDescriptor属性)。创建对象时,默认安全描述符会被应用到该对象上,再结合父容器的可继承权限,共同决定对象安全描述符的初始定义。
除了通过Active Directory Schema MMC管理单元中类属性的Default Security选项卡编辑外,你可以使用PowerShell结合Get-ACL/Set-ACL相关逻辑来修改默认ACL,步骤如下:
1. 启用AD架构的修改权限
AD架构默认处于只读状态,需先在架构主服务器上启用修改权限(仅需执行一次):
# 定位到AD驱动器 Set-Location AD:\ # 获取架构命名上下文并启用架构更新 $schemaNC = (Get-ADRootDSE).schemaNamingContext Set-ADObject -Identity $schemaNC -Replace @{schemaUpdateNow=$true}
2. 获取目标架构类的默认ACL
以user类为例,先获取其当前的默认安全描述符并转换为可编辑的ACL对象:
# 查询目标架构类(替换为你需要修改的类名,如computer、group) $targetClass = Get-ADObject -SearchBase $schemaNC -Filter "name -eq 'user'" -Properties defaultSecurityDescriptor # 将SDDL格式的安全描述符转换为DirectorySecurity对象(与Get-ACL返回对象类型一致) $acl = New-Object System.Security.AccessControl.DirectorySecurity $acl.SetSecurityDescriptorSddlForm($targetClass.defaultSecurityDescriptor)
3. 修改ACL规则
使用熟悉的ACL操作方法调整权限,比如添加一条允许Domain Users读取用户属性的规则:
# 定义权限主体 $account = New-Object System.Security.Principal.NTAccount "你的域名\Domain Users" # 创建访问规则(可按需调整权限类型、控制类型和继承方式) $accessRule = New-Object System.DirectoryServices.ActiveDirectoryAccessRule( $account, [System.DirectoryServices.ActiveDirectoryRights]::ReadProperty, [System.Security.AccessControl.AccessControlType]::Allow, [System.DirectoryServices.ActiveDirectorySecurityInheritance]::None ) # 将规则添加到ACL $acl.AddAccessRule($accessRule) # 若需移除已有规则,可使用: # $acl.RemoveAccessRule($accessRule)
4. 将修改后的ACL写回架构类
把编辑好的ACL转换回SDDL格式,再更新目标类的defaultSecurityDescriptor属性:
# 转换为SDDL字符串 $newSddl = $acl.GetSecurityDescriptorSddlForm([System.Security.AccessControl.AccessControlSections]::All) # 更新架构类 Set-ADObject -Identity $targetClass.DistinguishedName -Replace @{defaultSecurityDescriptor=$newSddl}
5. 恢复架构只读状态(操作完成后建议执行)
Set-ADObject -Identity $schemaNC -Replace @{schemaUpdateNow=$false}
关键注意事项
- 操作AD架构必须拥有架构管理员权限,且修改只能在架构主服务器上执行。
- 修改默认安全描述符仅影响后续创建的该类对象,已有对象的权限不会自动变更。
- 建议先在测试环境验证修改逻辑,避免影响生产环境。
内容的提问来源于stack exchange,提问作者Zulakis
相关产品推荐
相关产品推荐

