如何用PowerShell查询AD已删除对象容器的ACL权限?
解决AD“已删除对象”容器ACL权限验证的PowerShell方案
方法1:通过ADSI直接获取安全描述符
由于Get-ACL默认无法识别标记为isDeleted的对象,可通过ADSI绑定并启用访问已删除对象的选项,直接提取ACL:
# 获取已删除对象容器的可分辨名称 $deletedObjectsDN = (Get-ADDomain).DeletedObjectsContainer # 配置ADSI搜索器以访问已删除对象 $searcher = [adsisearcher]"(&(objectClass=container)(distinguishedName=$deletedObjectsDN))" $searcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry("LDAP://$deletedObjectsDN") $searcher.SearchRoot.Options.Add([System.DirectoryServices.DirectoryEntryOptions]::ServerHasDeletedObjects) $searcher.PropertiesToLoad.Add("nTSecurityDescriptor") | Out-Null $result = $searcher.FindOne() # 提取并格式化ACL信息 $acl = $result.Properties["nTSecurityDescriptor"][0] $acl.Access | Select-Object IdentityReference, AccessControlType, ActiveDirectoryRights, InheritanceType
此方法无需依赖PSExec,返回标准的.NET ACL对象,便于后续编程验证或修改。
方法2:通过Get-ADObject直接获取安全描述符
利用Get-ADObject的-IncludeDeletedObjects参数,显式请求nTSecurityDescriptor属性,一步获取ACL:
# 获取已删除对象容器及其安全描述符 $deletedObj = Get-ADObject -SearchBase ((Get-ADDomain).DeletedObjectsContainer) -Filter * -IncludeDeletedObjects -SearchScope Base -Properties nTSecurityDescriptor # 提取并输出简洁的权限信息 $acl = $deletedObj.nTSecurityDescriptor $acl.Access | Select-Object IdentityReference, AccessControlType, ActiveDirectoryRights, InheritanceType
这是更简洁的实现方式,核心是指定-Properties nTSecurityDescriptor来获取默认不返回的安全描述符属性。
关键原因说明
Get-ACL直接使用DN失败,是因为其依赖的AD路径解析逻辑默认忽略标记isDeleted属性的对象,必须通过显式配置(如ADSI选项或Get-ADObject的-IncludeDeletedObjects参数)告知客户端要包含已删除对象。
内容的提问来源于stack exchange,提问作者Skyler
相关产品推荐
相关产品推荐

