如何使用PowerShell 7为Microsoft DNS记录批量添加缺失的ACL访问控制项(ACE)
如何使用PowerShell 7为Microsoft DNS记录批量添加缺失的ACL访问控制项(ACE)
看起来你已经找对了方向,用PowerShell 7批量修复DNS记录的ACL确实是处理这种大量记录场景的最优解。我来帮你把这个脚本补全并优化,确保能顺利批量添加目标部门DNS管理员组的ACE:
一、完整脚本步骤与说明
1. 基础准备与变量定义
首先确认你已经在安装了RSAT工具的机器上运行PowerShell 7,并且拥有足够的权限(域管理员或DNS管理员权限)。先完成基础变量的定义:
# 导入所需模块 Import-Module ActiveDirectory # 获取目标DNS管理员组的SID $DnsAdminGroup = Get-ADGroup -Identity "DeptDnsAdmins" $SID = New-Object System.Security.Principal.SecurityIdentifier $DnsAdminGroup.SID.Value # 定义ACE的权限参数:这里设置为DNS记录的常用管理权限,可根据需求调整 # 权限类型:允许;权限:写入属性、删除、删除子对象、扩展权限;继承:无(DNS记录是叶子节点) $acePermissions = [System.DirectoryServices.ActiveDirectoryRights]::WriteProperty -bor [System.DirectoryServices.ActiveDirectoryRights]::Delete -bor [System.DirectoryServices.ActiveDirectoryRights]::DeleteTree -bor [System.DirectoryServices.ActiveDirectoryRights]::ExtendedRight $aceType = [System.Security.AccessControl.AccessControlType]::Allow $inheritanceType = [System.DirectoryServices.ActiveDirectorySecurityInheritance]::None
2. 创建完整的访问控制项(ACE)
把你之前未完成的ACE创建命令补全:
$ACE = New-Object System.DirectoryServices.ActiveDirectoryAccessRule( $SID, $acePermissions, $aceType, $inheritanceType )
如果你需要更精细的权限(比如仅允许修改记录而不删除),可以调整$acePermissions的值,比如只保留WriteProperty和ExtendedRight
3. 批量获取目标DNS记录
你需要先筛选出属于该部门的DNS记录,这里假设你可以通过记录名称前缀(比如Dept-*)或者自定义属性来识别,根据实际情况调整筛选条件:
# 指定DNS区域的AD搜索路径,替换成你的实际路径 $dnsSearchBase = "CN=MicrosoftDNS,CN=System,DC=my,DC=domain,DC=org" # 获取所有目标DNS记录对象,同时获取其安全描述符属性 $targetDnsRecords = Get-ADObject -SearchBase $dnsSearchBase -Filter {objectClass -eq "dnsNode" -and Name -like "Dept-*"} -Properties ntSecurityDescriptor
4. 遍历记录并添加ACE
循环处理每个记录,将ACE添加到其ACL中并保存:
foreach ($record in $targetDnsRecords) { # 获取当前记录的ACL $acl = $record.ntSecurityDescriptor # 检查ACE是否已存在,避免重复添加(可选但推荐) $existingAce = $acl.Access | Where-Object { $_.IdentityReference -eq $SID -and $_.AccessControlType -eq $aceType -and $_.ActiveDirectoryRights -eq $acePermissions } if (-not $existingAce) { # 添加ACE到ACL $acl.AddAccessRule($ACE) # 更新记录的安全描述符 Set-ADObject -Identity $record.DistinguishedName -Replace @{ntSecurityDescriptor = $acl} Write-Host "已为记录 $($record.Name) 添加ACE" } else { Write-Host "记录 $($record.Name) 已存在目标ACE,跳过" } }
二、关键注意事项
- 测试先行:建议先在测试环境或者选取少量记录进行测试,确认ACE添加效果符合预期后再批量执行。
- 权限调整:根据实际需求修改
$acePermissions的值,比如如果只需要允许修改记录内容,不需要删除权限,可以去掉Delete和DeleteTree。 - 筛选条件优化:如果部门的DNS记录有统一的标识(比如特定的
description属性值),可以把-Filter条件改成对应的筛选规则,确保只处理目标记录。
备注:内容来源于stack exchange,提问作者K. McGregor
相关产品推荐
相关产品推荐

