Powershell 返回ad帐户列表并检查是否为组成员

Powershell 返回ad帐户列表并检查是否为组成员,powershell,active-directory,Powershell,Active Directory,我已经写了下面的内容,它可以正常工作(基于),但是它需要非常长的时间才能运行-我假设这是因为它为每个用户检索完整的组。我试着移动$members。。。在函数开始时将行移出以检索组列表一次,但似乎没有任何区别 有没有更有效的方法返回此信息 samaccountname enabled InDenyGroup -------------- ------- ----------- admin-abc True yes admin-def

我已经写了下面的内容,它可以正常工作(基于),但是它需要非常长的时间才能运行-我假设这是因为它为每个用户检索完整的组。我试着移动$members。。。在函数开始时将行移出以检索组列表一次,但似乎没有任何区别

有没有更有效的方法返回此信息

samaccountname   enabled   InDenyGroup 
--------------   -------   ----------- 
admin-abc        True      yes         
admin-def        True      yes         
在本例中,帐户名筛选器为“king”,因为检查帐户是否在组中

Get-ADUser -Filter "(SamAccountName -like 'admin*') -and (enabled -eq 'true')" | 
    ft -AutoSize samaccountname,enabled,@{Name='InBlockGroup'; Expression={InDenyGrp($_.samaccountname)}}


Function InDenyGrp([string]$UserID) {
    $members = Get-ADGroupMember -Identity "myBlockGroup" | Select -ExpandProperty SamAccountName

    If ($members -contains $UserID) {
        Return "yes"
    } Else {
        Return "not in group"
    }
}

谢谢。

在Foreach对象循环的每次迭代中,您都会一次又一次地查询同一个ADGroup的所有ADGroup成员(不仅仅是区分名称)(这是瓶颈)

您只需查询“区块组”的成员(请参阅您发布的链接)并循环查看成员,并检查您的用户是否属于他们(有一些属性可与之进行比较),或者尝试以下代码:

构建查找表应该可以提高性能。 此外,我们不需要比区分名称更多的关于组成员的信息,因此Get-ADGroupMember是过分的

您可以使用不同组的成员扩展LookupTable

#首先使用其成员查询阻塞组(仅区分名称)
$adGroup=获取adGroup-标识“”-属性“成员”
#构建成员的区分名称的查找表
$adGroupMemberLookupTable=[System.Collections.Generic.HashSet[string]]::new()
foreach($adGroup.Members中的成员){
[void]$adGroupMemberLookupTable.Add($member)
}
获取ADUser-Filter“(SamAccountName-like'admin*')-和(enabled-eq'true')”
格式表-自动调整samaccountname的大小,已启用,
@{Name='InBlockGroup';
表达式={
#如果用户是“阻止”组的成员,则查找
$adGroupMemberLookupTable.Contains($\区分名称)
} 
}

我同意,就在上周,我写了一些非常类似的东西。基本相同的概念。