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