我创建了一个应该返回 OU 规范名称的表达式。一个小轮廓:
@(Search-ADAccount -LockedOut -UsersOnly) | Select-Object Name,SamAccountName,@{Name="OU";Expression={((Get-ADOrganizationalUnit -Identity $($_."DistinguishedName")).CanonicalName)}}
但是,此表达式返回一个空 OU 列,其他 2 列已填充。
我的问题是这个表达有什么问题?如有任何反馈,我们将不胜感激。
谨致问候, 刺探飞行员
计算属性的故障排除技术:
存储在哈希表的
Expression
条目中的脚本块定义了计算属性:
在相对于调用者范围的child范围中运行。
更重要的是,它安静地忽略发生的任何错误。
但是,此类错误记录在自动
$Error
变量中,因此要诊断您的问题,您可以执行以下操作:
$Error.Clear()
Search-ADAccount -LockedOut -UsersOnly |
Select-Object Name, SamAccountName, @{Name="OU";Expression={(Get-ADOrganizationalUnit -Identity $_.DistinguishedName).CanonicalName}}
$Error # Output the errors that occurred inside the calculated property's script block.
解决您的具体问题:
正如 Santiago Squarzon 的有用答案所解释的那样,您需要从 user's 中提取 OU 的专有名称 (DN),并将前者传递给
Get-ADOrganizationalUnit -Identity
。
虽然从用户的 DN 中删除第一个
$_.DistinguishedName.Split(',',2)[1]
分隔的令牌的 ,
可以正常工作,但对于使用 转义 ,
字符的 DN,它可能会失败。 (\,
) 将被视为值的一部分;例如:# !! Simple splitting by the first "," is NOT enough here:
PS> 'CN=Martin Luther King\, Jr.,OU=Ministry,DC=example,DC=org'.Split(',',2)[1]
Jr.,OU=Ministry,DC=example,DC=org # !! WRONG - split at the *escaped* ","
为了也处理这些边缘情况,即要
稳健地从用户的中提取OU的DN,需要复杂的正则表达式,并结合-replace
运算符
:
# OK: The regex correctly recognizes the escaped \, as such.
PS> 'CN=Martin Luther King\, Jr.,OU=Ministry,DC=example,DC=org' -replace '^.+?((?<=[^\\])(?:\\\\)*),'
OU=Ministry,DC=example,DC=org # OK
将所有内容放在一起:
Search-ADAccount -LockedOut -UsersOnly |
Select-Object Name,
SamAccountName,
@{
Name = 'OU'
Expression = {
(Get-ADOrganizationalUnit -Identity ($_.DistinguishedName -replace '^.+?((?<=[^\\])(?:\\\\)*),')).CanonicalName
}
}
Get-ADOrganizationalUnit
而不是 OU 的
DistinguishedName
,这是无效的。还值得一提的是,你在 DistinguishedName
上错过了 -Properties CanonicalName
。
试试这个:Get-ADOrganizationalUnit
现在,这种使用上面的
$exp = { ($_.DistinguishedName.Split(',', 2)[1] | Get-ADOrganizationalUnit -Properties CanonicalName).CanonicalName }
Search-ADAccount -LockedOut -UsersOnly |
Select-Object Name, SamAccountName, @{ N = "OU"; E = $exp }
计算属性的语法确实很难阅读,而且效率也很低,它正在查询每个用户的 OU,并且同一个 OU 很有可能会被多次查询。我建议使用
Select-Object
和
key = the OU DN
将 OU 缓存在哈希表中。这好多了:value = the OU CanonicalName