You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 10:03:08