我尝试创建新的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
识别为过滤器参数的字符串?我不明白的是什么?
答案 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。