我想问一下,因为我正在使用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。
答案 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