Powershell 中 Get-ADUser 的函数
Function for Get-ADUser in Powershell
我正在 PowerShell 中编写以下函数,但在执行时生成错误:
Get-ADUser : Error parsing query: 'EmployeeId -eq ' Error Message: 'syntax error' at position
: '12'.
At line:14 char:16
函数如下
Function UpdateGroupMembership ($Members, $Group, $err) {
$Members | ForEach-Object {
$EID = $_.ID
$filter = [scriptblock]::Create("EmployeeId -eq $EID")
If ((Get-ADUser -Filter $filter) -like "")
{$err += "`n"+"User: "+$_."First Name"+" "+$_."Last Name"+" was not found in "+$_."District"+"<br>"}
Else
{$alias += Get-ADUser -Filter $filter}
}
$alias | ForEach-Object {
Add-ADGroupMember -Identity $Group -Members $_.SamAccountName
}
}
UpdateGroupMembership ($atl, $atlGroup, $atlerr)
如有任何建议,我们将不胜感激!刚刚学习 PowerShell...所以请放轻松!
很难确切地说出您的代码是如何工作的,因为您没有向我们展示任何输入,但以下是第一个主要问题
函数参数
UpdateGroupMembership ($atl, $atlGroup, $atlerr)
函数不是方法。当您像那样调用您的函数时,您会将所有参数作为数组发送到参数 $Members
。调用必须如下所示。
UpdateGroupMembership $atl, $atlGroup, $atlerr
那个If
块
((Get-ADUser -Filter $filter) -like "")
不确定您要完成什么,但 -like
通常用于字符串比较。 Get-ADUser
将 return 对象数组或 $null
。你在测试它是空的还是空的?
If(Get-ADUser -Filter $filter){
}
只有在 returned 数据的情况下,以上内容才成立。
关于$err
您是否试图通过该变量传回信息?函数默认按值传递信息,因此您填充 $err
在函数外部没有用处。
我认为这里需要对函数和参数以及错误处理进行一些了解。您遗漏了一些信息,所以我将假设 $atl
是 objects 的数组,并且那些 objects 每个(至少)具有属性 'ID','First Name',以及 'Last Name'。我假设 $atlGroup
是一个字符串,它是您要将那些 objects 中定义的用户添加到的组的名称。我还假设 $atlerr
可能什么都不是,但是您希望它在发生错误时填充错误。
这实际上归结为马特在他的回答中所说的话。您错误地调用了函数。您正在传递一个 objects 数组作为第一个参数('Members' 参数)。所以这是您拥有的功能流程...
$Members = @($atl, $atlGroup, $atlErr)
$Group = $null
$Err = $null
$Members
然后被传递给 ForEach 循环,所以它传递它的第一项,这是一个 objects 的数组。它将 $atl
的整个数组传递给 ForEach 循环,因此该循环现在变为:
$EID = $atl.ID
好吧,我们有问题了。 $atl 是一个数组,它不像它包含的所有 objects 那样具有 'ID' 的 属性。所以它returns$null
,所以...
$EID = $null
$filter = [scriptblock]::Create("EmployeeId -eq $EID")
好的,所以现在 $filter
是一个看起来像 {EmployeeId -eq $null}
的脚本块,作为脚本块就可以了。问题是,当它作为 -Filter
参数的参数传递给 Get-ADUser cmdlet 时,该参数希望您提供以下格式的内容:
Property Operator Value
您正在查看 EmployeeID 属性,并使用 -eq
运算符。 属性 是一个字符串,因此它希望您提供一个字符串来与之进行比较。你不这样做,所以它会抛出一个错误。
现在你希望用你的 If/Else 语句来捕捉这些错误,但是孩子你只是 re-creating 那个轮子。 PowerShell 已经有 Try/Catch 个块,下面是它们的工作原理。如果您 Try
导致脚本停止的操作,而不是停止它移动到 Catch
脚本块并执行它。
因此,为了简化您所做的事情,我们可以 Try
获取广告用户,并将其直接传送到 add-adprincipalgroupmembership
(此 cmdlet 接受传送到用户 objects,并让您定义要将它们添加到的组的名称,而不是您使用的接受管道组 objects 的 cmdlet,并允许您定义要添加到该组的用户)。然后在 Catch
块中,我们输出您的错误,这应该只在 Try
块中的进程失败时发生。现在您只需将函数的输出分配给您想要存储错误的任何内容。它最终看起来像这样:
Function UpdateGroupMembership{
Param(
[object[]]$Members,
[String]$Group
)
ForEach($User in $Members){
Try{
Get-ADUser -Filter {EmployeeId -eq "$($User.ID)"} | Add-ADPrincipalGroupMembership -MemberOf $Group
}
Catch{
"User: {0} {1} was not found." -f $User."First Name",$User."Last Name"
}
}
}
$atlErr = UpdateGroupMembership $atl $atlGroup
马特的回答确实回答了你的问题,我只是想提供一些指导,说明这个过程到底是如何工作的,为什么会出现错误,并就如何更好地编写函数提供一些建议,这样你就可以一些可以带你前进的东西。我 up-voted Matt 的回答,它确实回答了这个问题,我只是想一些额外的上下文和解决问题的帮助是为了帮助新手。我们都曾经去过那里。
编辑: 我还应该提一下,我认为创建一个函数来处理像这样的事物组是一个错误。你最好让它处理一件事,然后接受管道输入或将其放入 ForEach 循环中。但这只是我的意见,要么接受要么放弃。
Function UpdateGroupMembership {
Param(
[object[]]$Members,
[String]$Group
)
ForEach($User in $Members){
Try{
$filter = $($User.ID)
Get-ADUser -Filter {EmployeeId -eq $filter} | Add-ADPrincipalGroupMembership -MemberOf $Group
}
Catch{
"User: {0} {1} was not found in {2}." -f $User."First Name",$User."Last Name", $User.District
}
}
}
$atlErr = UpdateGroupMembership $atl $atlGroup
我正在 PowerShell 中编写以下函数,但在执行时生成错误:
Get-ADUser : Error parsing query: 'EmployeeId -eq ' Error Message: 'syntax error' at position
: '12'.
At line:14 char:16
函数如下
Function UpdateGroupMembership ($Members, $Group, $err) {
$Members | ForEach-Object {
$EID = $_.ID
$filter = [scriptblock]::Create("EmployeeId -eq $EID")
If ((Get-ADUser -Filter $filter) -like "")
{$err += "`n"+"User: "+$_."First Name"+" "+$_."Last Name"+" was not found in "+$_."District"+"<br>"}
Else
{$alias += Get-ADUser -Filter $filter}
}
$alias | ForEach-Object {
Add-ADGroupMember -Identity $Group -Members $_.SamAccountName
}
}
UpdateGroupMembership ($atl, $atlGroup, $atlerr)
如有任何建议,我们将不胜感激!刚刚学习 PowerShell...所以请放轻松!
很难确切地说出您的代码是如何工作的,因为您没有向我们展示任何输入,但以下是第一个主要问题
函数参数
UpdateGroupMembership ($atl, $atlGroup, $atlerr)
函数不是方法。当您像那样调用您的函数时,您会将所有参数作为数组发送到参数 $Members
。调用必须如下所示。
UpdateGroupMembership $atl, $atlGroup, $atlerr
那个If
块
((Get-ADUser -Filter $filter) -like "")
不确定您要完成什么,但 -like
通常用于字符串比较。 Get-ADUser
将 return 对象数组或 $null
。你在测试它是空的还是空的?
If(Get-ADUser -Filter $filter){
}
只有在 returned 数据的情况下,以上内容才成立。
关于$err
您是否试图通过该变量传回信息?函数默认按值传递信息,因此您填充 $err
在函数外部没有用处。
我认为这里需要对函数和参数以及错误处理进行一些了解。您遗漏了一些信息,所以我将假设 $atl
是 objects 的数组,并且那些 objects 每个(至少)具有属性 'ID','First Name',以及 'Last Name'。我假设 $atlGroup
是一个字符串,它是您要将那些 objects 中定义的用户添加到的组的名称。我还假设 $atlerr
可能什么都不是,但是您希望它在发生错误时填充错误。
这实际上归结为马特在他的回答中所说的话。您错误地调用了函数。您正在传递一个 objects 数组作为第一个参数('Members' 参数)。所以这是您拥有的功能流程...
$Members = @($atl, $atlGroup, $atlErr)
$Group = $null
$Err = $null
$Members
然后被传递给 ForEach 循环,所以它传递它的第一项,这是一个 objects 的数组。它将 $atl
的整个数组传递给 ForEach 循环,因此该循环现在变为:
$EID = $atl.ID
好吧,我们有问题了。 $atl 是一个数组,它不像它包含的所有 objects 那样具有 'ID' 的 属性。所以它returns$null
,所以...
$EID = $null
$filter = [scriptblock]::Create("EmployeeId -eq $EID")
好的,所以现在 $filter
是一个看起来像 {EmployeeId -eq $null}
的脚本块,作为脚本块就可以了。问题是,当它作为 -Filter
参数的参数传递给 Get-ADUser cmdlet 时,该参数希望您提供以下格式的内容:
Property Operator Value
您正在查看 EmployeeID 属性,并使用 -eq
运算符。 属性 是一个字符串,因此它希望您提供一个字符串来与之进行比较。你不这样做,所以它会抛出一个错误。
现在你希望用你的 If/Else 语句来捕捉这些错误,但是孩子你只是 re-creating 那个轮子。 PowerShell 已经有 Try/Catch 个块,下面是它们的工作原理。如果您 Try
导致脚本停止的操作,而不是停止它移动到 Catch
脚本块并执行它。
因此,为了简化您所做的事情,我们可以 Try
获取广告用户,并将其直接传送到 add-adprincipalgroupmembership
(此 cmdlet 接受传送到用户 objects,并让您定义要将它们添加到的组的名称,而不是您使用的接受管道组 objects 的 cmdlet,并允许您定义要添加到该组的用户)。然后在 Catch
块中,我们输出您的错误,这应该只在 Try
块中的进程失败时发生。现在您只需将函数的输出分配给您想要存储错误的任何内容。它最终看起来像这样:
Function UpdateGroupMembership{
Param(
[object[]]$Members,
[String]$Group
)
ForEach($User in $Members){
Try{
Get-ADUser -Filter {EmployeeId -eq "$($User.ID)"} | Add-ADPrincipalGroupMembership -MemberOf $Group
}
Catch{
"User: {0} {1} was not found." -f $User."First Name",$User."Last Name"
}
}
}
$atlErr = UpdateGroupMembership $atl $atlGroup
马特的回答确实回答了你的问题,我只是想提供一些指导,说明这个过程到底是如何工作的,为什么会出现错误,并就如何更好地编写函数提供一些建议,这样你就可以一些可以带你前进的东西。我 up-voted Matt 的回答,它确实回答了这个问题,我只是想一些额外的上下文和解决问题的帮助是为了帮助新手。我们都曾经去过那里。
编辑: 我还应该提一下,我认为创建一个函数来处理像这样的事物组是一个错误。你最好让它处理一件事,然后接受管道输入或将其放入 ForEach 循环中。但这只是我的意见,要么接受要么放弃。
Function UpdateGroupMembership {
Param(
[object[]]$Members,
[String]$Group
)
ForEach($User in $Members){
Try{
$filter = $($User.ID)
Get-ADUser -Filter {EmployeeId -eq $filter} | Add-ADPrincipalGroupMembership -MemberOf $Group
}
Catch{
"User: {0} {1} was not found in {2}." -f $User."First Name",$User."Last Name", $User.District
}
}
}
$atlErr = UpdateGroupMembership $atl $atlGroup