DirectoryServices 过滤器和方法

Bar*_*Vos 3 powershell active-directory windows-server-2008-r2

我正在尝试从 AD 获取 OU/DC 中所有用户的列表。

这就是我想出的:

$erroractionpreference = "SilentlyContinue"
function Get-GroupMembers {
    $filter = "(&(objectCategory=person)(objectClass=user))"
    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.Filter = $filter
    $colResults = $objSearcher.FindAll()

        foreach ($member in $colResults) { 
            $member
        }
}
get-GroupMembers 
Run Code Online (Sandbox Code Playgroud)

如果我将过滤器更改为

    $filter = "(&(objectCategory=person)(objectClass=user)("OU=Admin Accounts,DC=admin"))
Run Code Online (Sandbox Code Playgroud)

什么都没有返回。为什么是这样?
我还想显示某些值(如果帐户处于活动状态或禁用状态等),但如果我通过管道连接$membergm,我什么也得不到。

任何帮助将不胜感激。

ajk*_*ajk 5

如果要搜索特定的 OU,可以将其设置为搜索器对象的根:

$objOU = New-Object System.DirectoryServices.DirectoryEntry("LDAP://OU=Admin Accounts,DC=admin")
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objOU
Run Code Online (Sandbox Code Playgroud)

您还可以控制搜索范围。以下是与您最相关的两个选项:

# Option 1: Return only users in the 'Admin Accounts' OU
$objSearcher.SearchScope = "OneLevel"

# Option 2: Return users in the 'Admin Accounts' OU or any level beneath it
$objSearcher.SearchScope = "SubTree"
Run Code Online (Sandbox Code Playgroud)

除非您覆盖搜索根和范围,否则您将默认对当前域的根执行子树搜索。您可以在这篇 TechNet 文章中找到更多详细信息:

编辑:正如 uSlackr 指出的,你的直流分量确实看起来很可疑。我在示例中保留了它,但无论您使用什么方法,不完整/格式错误的基本对象名称都会破坏您的搜索。


uSl*_*ckr 5

直流分量不完整。它应该看起来像这样:

 $filter = "(&(objectCategory=person)(objectClass=user)("OU=Admin Accounts,DC=myco,dc=com"))
Run Code Online (Sandbox Code Playgroud)

但 dc=admin,dc=com 应该从本例中的 AD 域名“admin.com”转换而来,这似乎不正确

使用 Microsoft AD cmdlet,这要容易得多。

get-aduser -filter * -searchbase "ou=test,dc=mycom,dc=com"
Run Code Online (Sandbox Code Playgroud)

TechNet上提供了有关下载和使用 cmdlet 的信息