ADSI 根据primarygroupid 搜索primary group 的DistinguishedName

ADSI Search for DistinguishedName of the primary group based on primarygroupid

因为我们的所有系统上都没有可用的活动目录模块,所以我们使用 ADSI 来代替。以下代码使用 AdsiSearcher:

从 AD 检索用户对象
$ADUser = ([AdsiSearcher]"(samaccountname=$SamAccountName)").FindOne()

这会导致找到 属性 primarygroupid,它表示用户的域主要组,通常是数字 513。当我们有这个数字时,我们想找到该组的 distinguishedName。但是,下面的代码很好我想知道是否有更好的 filter 可以用来代替 FindAll() 方法后的过滤?

    $searcher = [adsisearcher]'objectclass=group'
    $searcher.PropertiesToLoad.Add('primarygrouptoken')
    $searcher.PropertiesToLoad.Add('distinguishedName')
    $searcher.FindAll() |
    Where-Object { $_.Properties.primarygrouptoken -eq 513}

这样的事情会很棒,但不可能:

([adsisearcher]”(&(objectCategory=group)(primaryGroupid=513))”).FindOne()

primaryGroupToken 是一个 构造的 属性,这意味着它实际上并未在数据库中具体化,也无法使用 LDAP 进行过滤。

为了构建等效过滤器,我们需要查看它是如何构建的 - Active Directory 中的主要组令牌始终与组的 RID 相同objectSid 属性的一部分( 相对标识符 )。

所以,如果我们想按它搜索,我们可以简单地按 objectSid 过滤:

# Obtain domain SID
$dncDN = ([adsi]"LDAP://RootDSE").defaultNamingContext
$dnc = [adsi]"LDAP://$dncDN"
$domainSID = [System.Security.Principal.SecurityIdentifier]::new($dnc.objectSid.Value, 0)

# Set the group ID we're looking for
$RID = 513

# Search for group by objectSid value:
([adsisearcher]"(&(objectCategory=group)(objectSid=${domainSID}-${RID}))").FindOne()