为什么Active Directory主目录查询在Get-ADuser中返回的内容与在AD管理面板中返回的内容不同?

时间:2019-02-06 21:48:29

标签: windows powershell active-directory

我想问一下,因为我正在使用Get-ADuser从AD查询其主目录位于Powershell中某个目录中的所有用户,并且在大多数情况下,它会检索空结果。

我运行的查询是这样:

$DirectoryInfo = Get-Item \\Fileserver\Users

$strFilter = $DirectoryInfo.FullName.Replace('\','\5c')

$AdUser = Get-AdUser -Filter {homeDirectory -like $strFilter}

echo $AdUser

如果我从AD管理中心面板中查找特定用户,则可以看到它确实在Powershell中将主目录设置为我之前查询过的路径。

令我感到奇怪的另一件事是查询中出现了一些用户,因此前一种情况并不适用于所有用户。

例如,AD管理中心面板是显示该用户所属的组的主目录,还是我从Powershell运行了错误的查询?

预先感谢

Juan Pablo。

2 个答案:

答案 0 :(得分:0)

我不知道\ 5c在该代码中正在做什么,所以请原谅我的无知。

如果\ Fileserver \ Users是包含主目录的根目录,则下面的代码应该起作用:

$DirectoryInfo = Get-Item \\Fileserver\Users
$strFilter = $DirectoryInfo.FullName + '\*'
$AdUser = Get-AdUser -Filter {homeDirectory -like $strFilter}
$AdUser

如果您的字符串不完全匹配,则-like运算符需要星号。

答案 1 :(得分:0)

我认为由于HomeDirectory属性不在Get-ADUser的默认输出集中,因此您也需要将其添加到所需的Properties中。
这可能是较大脚本的一部分,但是从问题中我看不出您为什么需要这样做:

$DirectoryInfo = Get-Item \\Fileserver\Users
$strFilter = $DirectoryInfo.FullName + '\*'

因为您已经具有用户主目录的UNC路径。

我现在无法测试,但是您可以尝试这样:

$strFilter = '\\Fileserver\Users\*'
$AdUser = Get-AdUser -Filter "HomeDirectory -like $strFilter" -Properties HomeDirectory
$AdUser

或使用Where-Object获得所需的内容:

$strFilter = '\\Fileserver\Users\*'
$AdUser = Get-AdUser -Filter * -Properties HomeDirectory | Where-Object { $_.HomeDirectory -like $strFilter }
$AdUser


如果您更喜欢使用-LDAPFilter而不是-Filter,则需要escape字符串中可能包含的特殊字符。

*         \2A
(         \28
)         \29
\         \5C
NUL       \00

您可以通过在每个这些字符前面加上反斜杠\并将这些字符本身替换为十六进制的ASCII码来实现。 (变成\28,反斜杠\变成\5c等。

这使用一个小函数来转义这些字符以进行LDAP搜索过滤器:

function Escape-LdapSearchFilter([string] $Filter) {
    return $Filter -creplace '\*', '\2a' `
                   -creplace '\(', '\28' `
                   -creplace '\)', '\29' `
                   -creplace '/' , '\2f' `
                   -creplace '`0', '\00' `
                   -creplace '\\(?![0-9A-Fa-f]{2})', '\5c'
}

$strFilter = Escape-LdapSearchFilter "\\Fileserver\Users\"
# for LDAP you must use the correct attribute name, so `homeDirectory` with a lower-case `h`
$AdUser = Get-AdUser -LDAPFilter "(homeDirectory=$strFilter*)" -Properties HomeDirectory
$AdUser