Powershell 表达式没有给出结果

问题描述 投票:0回答:2

我创建了一个应该返回 OU 规范名称的表达式。一个小轮廓:

@(Search-ADAccount -LockedOut -UsersOnly) | Select-Object Name,SamAccountName,@{Name="OU";Expression={((Get-ADOrganizationalUnit -Identity $($_."DistinguishedName")).CanonicalName)}}

但是,此表达式返回一个空 OU 列,其他 2 列已填充。

我的问题是这个表达有什么问题?如有任何反馈,我们将不胜感激。

谨致问候, 刺探飞行员

powershell active-directory
2个回答
3
投票

计算属性的故障排除技术

存储在哈希表的

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 } }



2
投票
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

© www.soinside.com 2019 - 2024. All rights reserved.