Powershell 在Get ADUser筛选器参数中传递字符串会导致错误-在pscustomobject中找不到属性
我正在尝试创建一个新的Active Directory用户,但首先我要用Get ADUser验证该用户是否已经存在。 我从人力资源部门导入用户数据并构建自定义属性:Powershell 在Get ADUser筛选器参数中传递字符串会导致错误-在pscustomobject中找不到属性,powershell,active-directory,Powershell,Active Directory,我正在尝试创建一个新的Active Directory用户,但首先我要用Get ADUser验证该用户是否已经存在。 我从人力资源部门导入用户数据并构建自定义属性: $newUsers = Import-Csv $csvFile | Select-Object -Property @{n='EmpNum';e={$_.'Employee Number'}}, @{n='UPN';e={$_.'Email Address'}},
$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:在类型为的对象中找不到属性:“UPN”:
“System.Management.Automation.PSCustomObject”。在
C:\Users\b hillips.NEWHOPEOFIN\Dropbox\Powershell\NewHire\AddNewDSP.ps1:50
字符:15
+$exists=Get ADUser-Filter{UserPrincipalName-eq$newUser.UPN}-property。。。
我尝试过这样做:-Filter{UserPrincipalName-eq$$newUser.UPN,但没有帮助;我遇到了另一个错误
Get ADUser:无法处理参数,因为参数的值
路径无效。请更改path参数的值并运行
手术又开始了
C:\Users\b hillips.NEWHOPEOFIN\Dropbox\Powershell\NewHire\AddNewDSP.ps1:50
字符:15
+$exists=Get ADUser-Filter{UserPrincipalName-eq$$newUser.UPN}-Prop。。。
$newUser是一个字符串,所以我不明白它为什么会导致问题。硬编码UserPrincipalName,比如,test@ourcompany.com可以,但$newUser.UPN不起作用**
PS C:\>$newUser.UPN.GetType
IsPublic IsSerial名称基类型
---- ----- ----
真字符串系统。对象
及
PS C:\>$newUser.UPN| gm
TypeName:System.String
$newUser.UPN包含有效的字符串值
PS C:\>$newUser.UPN
ypope@ourcompany.net
要使$newUser.UPN被识别为筛选器参数的字符串,我必须做些什么?发生了什么我不明白的事情?不允许表达式作为比较中的第二个操作数,只有值:
语法:
以下语法使用Backus Naur form来显示如何对此参数使用PowerShell表达式语言
:={}
::= | |
::= |
::=-eq-le-ge-ne-lt-gt-approx-bor-band-recursivematch-like-notlike
:=-和|-或
:=-不是
::= |
:=
将要比较的属性的值放在变量中,并在比较中使用该变量。您可能还希望将筛选器定义为实际字符串,尽管看起来筛选器不是脚本块,但这只是为了清楚起见
$upn = $newUser.UPN
$exists = Get-ADUser -Filter "UserPrincipalName -eq '$upn'" ...
不允许表达式作为比较中的第二个操作数,只允许值:
语法:
以下语法使用Backus Naur form来显示如何对此参数使用PowerShell表达式语言
:={}
::= | |
::= |
::=-eq-le-ge-ne-lt-gt-approx-bor-band-recursivematch-like-notlike
:=-和|-或
:=-不是
::= |
:=
将要比较的属性的值放在变量中,并在比较中使用该变量。您可能还希望将筛选器定义为实际字符串,尽管看起来筛选器不是脚本块,但这只是为了清楚起见
$upn = $newUser.UPN
$exists = Get-ADUser -Filter "UserPrincipalName -eq '$upn'" ...
表达式可以在Get ADUser的筛选器块中,但需要用引号正确地包装它们
Get-ADUser -Filter "UserPrincipalName -eq '$($newUser.UPN)'"
表达式可以在Get ADUser的筛选器块中,但需要用引号正确地包装它们
Get-ADUser -Filter "UserPrincipalName -eq '$($newUser.UPN)'"
永远不要使用脚本块{…}作为-Filter参数-Filter参数的类型是[string]-将过滤器构造为字符串
演示如何做到这一点。
虽然看起来很方便,但使用脚本块只在非常有限的场景中起作用,并且在不起作用时会引起混乱,例如在本例中涉及属性访问时
有关更多信息,请参阅我的
永远不要使用脚本块{…}作为-Filter参数-Filter参数的类型是[string]-将过滤器构造为字符串
演示如何做到这一点。
虽然看起来很方便,但使用脚本块只在非常有限的场景中起作用,并且在不起作用时会引起混乱,例如在本例中涉及属性访问时
有关更多信息,请参阅我的。尝试获取aduser*-Filter{UserPrincipalName-eq$newUser.UPN}-Properties*-Server$adServer-Credential$adCred$exists=获取aduser*-Filter{UserPrincipalName-eq$newUser.UPN}-Properties*-Server$adServer-Credential$adCred=>$exists-eq$null=>True(对于不应返回null的UPN值)。抱歉,我不清楚。它不起作用。Get-ADUser:找不到接受参数“*”的位置参数。请尝试$UPN=$newUser.UPN,然后:-过滤器{UserPrincipalName-eq$UPN}是的,这是有效的。我已经使用过了。困扰我的是,我不知道为什么其他方法不起作用……我怀疑这与$newUser成为PSHA有关
sh table?,但UPN属性的计算结果应为字符串。也许我离基地太远了。。。dunno.Try Get aduser*-Filter{UserPrincipalName-eq$newUser.UPN}-Properties*-Server$adServer-Credential$adCred$exists=Get aduser*-Filter{UserPrincipalName-eq$newUser.UPN}-Properties*-Server$adServer-Credential$adCred=>exists-eq$null=>True对于不应返回null的UPN值抱歉,我不清楚。它不起作用。Get-ADUser:找不到接受参数“*”的位置参数。请尝试$UPN=$newUser.UPN,然后:-筛选器{UserPrincipalName-eq$UPN}是的,有效。我已经用过了。让我烦恼的是我不知道为什么另一种方法不起作用。。。我怀疑这与$newUser是pscustomobject哈希表有关,但UPN属性的计算结果应该是字符串。也许我离基地太远了。。。不知道。嗨,安斯加,你能再解释一下吗?或者甚至去我刚刚创建的帖子,这基本上是我从文档中引用的同一个问题。您还需要什么解释?筛选器查询可以使用表达式作为第二个操作数,但是你在变量中粘贴表达式的解决方案也是一个有效的解决方法。@贝恩,我已经看到使用表达式的过滤器查询失败了太多的时间来考虑任何事情,但是一个简单的值是可行的选项。如果字符串值中有一个“选项”,这将不起作用。相反,生成了一个语法错误。嗨,安斯加,你能解释一下吗?或者甚至去我刚刚创建的帖子,这基本上是我从文档中引用的同一个问题。您还需要什么解释?筛选器查询可以使用表达式作为第二个操作数,但是你在变量中粘贴表达式的解决方案也是一个有效的解决方法。@贝恩,我已经看到使用表达式的过滤器查询失败了太多的时间来考虑任何事情,但是一个简单的值是可行的选项。如果字符串值中有一个“选项”,这将不起作用。相反,会生成一个语法错误。除非字符串中有一个'。然后它失败,出现语法错误。除非字符串中有一个'。然后它失败,出现语法错误。