在Get-ADUser过滤器参数中传递字符串会导致错误 - 在pscustomobject中找不到属性

时间:2015-12-01 19:09:14

标签: powershell active-directory

我尝试创建新的Active Directory用户,但首先我验证用户是否已经与Get-ADUser一起存在。 我从人力资源部门导入用户数据并构建自定义属性:

$newUsers = Import-Csv $csvFile |
            Select-Object -Property @{n='EmpNum';e={$_.'Employee Number'}},
                @{n='UPN';e={$_.'Email Address'}},
                @{n='Alias';e={$_.'Email Address'.Split("@")[0]}} #### etc

当我循环CSV文件中的对象时,我使用UPN属性在Active Directory中搜索用户:

foreach ($newUser in $newUsers) {
    $exists = Get-ADUser -Filter {UserPrincipalName -eq $newUser.UPN} -Properties * -Server $adServer -Credential $adCred 
    ...
}

过滤器导致错误:

Get-ADUser : Property: 'UPN' not found in object of type:
'System.Management.Automation.PSCustomObject'. At
C:\Users\bphillips.NEWHOPEOFIN\Dropbox\Powershell\NewHire\AddNewDSP.ps1:50
char:15
+     $exists = Get-ADUser -Filter {UserPrincipalName -eq $newUser.UPN} -Propertie ...

我已经尝试过这样做:-Filter {UserPrincipalName -eq $(" $ newUser.UPN")但这并没有帮助;我收到另一个错误

Get-ADUser : Cannot process argument because the value of argument
"path" is not valid. Change the value of the "path" argument and run
the operation again. At
C:\Users\bphillips.NEWHOPEOFIN\Dropbox\Powershell\NewHire\AddNewDSP.ps1:50
char:15
+     $exists = Get-ADUser -Filter {UserPrincipalName -eq $("$newUser.UPN")} -Prop ...

$newUser是一个字符串,所以我不明白它为什么会导致问题。硬编码UserPrincipalName," test@ourcompany.com"虽然有效但$newUser.UPN无法工作。**

PS C:\> $newUser.UPN.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

PS C:\> $newUser.UPN | gm

   TypeName: System.String

$newUser.UPN包含有效的字符串值

PS C:\> $newUser.UPN
ypope@ourcompany.net

我需要做些什么才能将$newUser.UPN识别为过滤器参数的字符串?我不明白的是什么?

3 个答案:

答案 0 :(得分:3)

BNF for filter query strings不允许将表达式作为比较中的第二个操作数,只允许值(强调我的):

  

语法:
  以下语法使用Backus-Naur表单来说明如何将PowerShell表达式语言用于此参数。

     

<滤光器> :: =“{”< FilterComponentList> “}”
  < FilterComponentList> :: =< FilterComponent> | < FilterComponent> < JoinOperator> < FilterComponent> | < NotOperator> < FilterComponent>
  < FilterComponent> :: = < attr> < FilterOperator> < value> | “(”< FilterComponent>“)”
  < FilterOperator> :: =“ - eq”| “-le”| “-ge”| “-ne”| “-lt”| “-gt” | “-approx”| “-bor”| “-band”| “-recursivematch”| “ - 像”| “-notlike”
  < JoinOperator> :: =“ - 和”| “OR”
  < NotOperator> :: =“ - 不是”   < ATTR> :: =< PropertyName> | <属性的LDAPDisplayName>
  < value> :: =<将此值与< attr>进行比较使用指定的< FilterOperator>>

将要比较的属性的值放在变量中,并在比较中使用该变量。您可能还希望将过滤器定义为实际字符串,只是为了清楚起见(尽管看起来过滤器不是脚本块)。

$upn = $newUser.UPN
$exists = Get-ADUser -Filter "UserPrincipalName -eq '$upn'" ...

答案 1 :(得分:1)

表达式可以在Get-ADUser的过滤器块内,但它们需要用引号正确包装。

Get-ADUser -Filter "UserPrincipalName -eq '$($newUser.UPN)'"

答案 2 :(得分:0)

  • 绝不使用脚本块{ ... })作为-Filter参数 - -Filter参数的类型为[string] - 将过滤器构建为字符串

  • 虽然看似方便,但使用脚本块只能在非常有限的情况下工作,并且当它不起作用时会引起混淆 - 例如涉及属性访问时 ,就像在这种情况下一样。

有关详细信息,请参阅我的this answer