在Get-ADUser筛选参数中传递string会导致在pscustomobject中找不到错误属性

我正在尝试创build一个新的Active Directory用户,但首先validation用户不存在与Get-ADUser 。 我从我们的人力资源部门导入用户数据并构build自定义属性:

 $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中search用户:

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

该filter导致错误:

 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是一个string,所以我不明白为什么会导致一个问题。 对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包含一个有效的string值

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

我需要做些什么来获得$newUser.UPN被识别为filter参数的string? 怎么回事,我不明白?

filter查询string的BNF不允许expression式作为比较中的第二个操作数,只有值(强调我的):

句法:
以下语法使用Backus-Naur格式来显示如何使用PowerShellexpression式语言来使用此参数。

<filter> :: =“{”<FilterComponentList>“}”
<FilterComponentList> :: = <FilterComponent> | <FilterComponent> <JoinOperator> <FilterComponent> | <NotOperator> <FilterComponent>
<FilterComponent> :: = <attr> <FilterOperator> <value> | “(”<FilterComponent>“)”
<FilterOperator> :: =“-eq”| “-le”| “-ge”| “-ne”| “-lt”| “-gt” | “-approx”| “-bor”| “ – 带”| “-recursivematch”| “-like”| “-不喜欢”
<JoinOperator> :: =“ – 和”| “-要么”
<NotOperator> :: =“ – 不”
<attr> :: = <PropertyName> | <属性的LDAPDisplayName>
<value> :: = <使用指定的<FilterOperator >>将此值与<attr>进行比较

将要比较的属性的值放入一个variables中,并在比较中使用该variables。 如果只是为了清楚起见(尽pipe它看起来像filter不是一个脚本块),您也可能想要将filter定义为一个实际的string。

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

expression式可以在Get-ADUser的filter块中,但是它们需要用引号正确包装。

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