我无法使用 Active Directory 模块获取特定 AD 组中用户的 SamAccountName。我如何使用 ADSI 做到这一点?
我已经尝试过:
$Group = [ADSI]"LDAP://DN of the AD group"
$Group.Member | ForEach-Object {
$Searcher = [adsisearcher]"(samAccountName=$_)"
$searcher.FindOne().Properties
}
但我看到这条消息:
samAccountName 搜索过滤器无效。
我该怎么做?
据我所知,有两种方法可以解决这个问题,但可能有一种更简单的方法。
一种是搜索
memberOf
属性具有该组的 DistinguishedName
的所有用户(这可能是不太麻烦的方法):
$group = 'CN=myGroup, OU=myOU, DC=myDomain'
$searcher = [adsisearcher]"(&(objectclass=user)(objectcategory=person)(memberof=$group))"
$members = foreach($member in $searcher.FindAll()) {
$member.Properties.samaccountname
}
另一种方法是使用与您在问题中使用的相同的方法:
$group = 'CN=myGroup, OU=myOU, DC=myDomain'
$adsi = [adsi]"LDAP://$group"
$members = foreach($member in $adsi.member) {
$isUser = [adsi]"LDAP://$member"
if('person' -in $isUser.objectclass) {
$isUser.samaccountname
}
}
与上面的类似,但是使用
adsisearcher
,不确定在这种情况下哪个会更有效:
$members = foreach($member in $adsi.member) {
$check = [adsisearcher]"(&(distinguishedname=$member)(objectclass=user)(objectcategory=person))"
if($isUser = $check.FindOne()) {
$isUser.Properties.samaccountname
}
}
我在自己的系统上运行了代码的修改版本,这样我就可以看到搜索字符串实际上是什么样子:
$Group = [ADSI]"LDAP://DN of the AD group"
$Group.Member | ForEach-Object {
$searchKey = "(samAccountName=$_)"
$searchKey
$Searcher = [adsisearcher]$searchKey
# $searcher.FindOne().Properties
}
注意我让
$searchKey
来到控制台的那一点。当我这样做时,我看到带有 完整专有名称 的值,而不仅仅是 samAccountName
。基于这个结果,我更改了代码来查找该值而不是 samAccountName
,然后我看到了(大概)预期的结果:
$Group = [ADSI]"LDAP://DN of the AD group"
$Group.Member | ForEach-Object {
$Searcher = [adsisearcher]"(distinguishedName=$_)"
$searcher.FindOne().Properties
}
这对我有用:
$group = 'CN=myGroup, OU=myOU, DC=myDomain'
$adsi = [adsi]"LDAP://$group"
foreach($member in $adsi.member) {
$isUser = [adsi]"LDAP://$member"
if('person' -in $isUser.objectclass) {
$isUser.samaccountname
}
}