首页 > 解决方案 > 如何在 Powershell 中添加到此集合?

问题描述

我正在从我们的 ITSM 解决方案中提取 REST API 中的一些数据,它从 json 中解析并放入一个名为 $listOfCurrentUsers 的对象中。然后,我根据从 Active Directory 中提取的数据创建一个对象。然后,它检查 $listOfCurrentUsers 中是否存在 AD 用户,如果存在,它将记录 ID 添加到 $CAServiceDesk 对象。如果用户不存在,它仍然添加记录 ID,但给它一个 null 值。

$listOfCurrentUsers = Invoke-RestMethod -Method Get -Uri $getList -Header $requestHeader

Import-Module ActiveDirectory

$CAServiceDesk = Get-ADGroupMember "ServiceDesk" -Recursive |
ForEach-Object(
{
    Get-ADUser($_.samaccountname) -Properties * | 
        Select-Object -Property Name,
            @{Name = 'SAM Account Name'; Expression = {$_.samaccountname}},
            Department,
            @{Name = 'Telephone Number'; Expression = {$_.telephonenumber}},
            @{Name = 'Manager'; Expression = {($_.manager -split ',*..=')[1]}},
            @{Name = 'User Account Control'; Expression = {$_.useraccountcontrol}},
            Mail,
            @{Name = 'Employee ID'; Expression = {$_.employeeID}}

    if($listOfCurrentUsers.users | where { $_.PublicID -eq $CAServiceDesk.Name }) {
        Add-Member -InputObject  -MemberType NoteProperty -Name RecID -Value $_.RecordID}   
    else {
        Add-Member -InputObject  -MemberType NoteProperty -Name RecID -Value {"null"}}

}
) 

我被困在“如果是真的那么这个”部分。我似乎无法弄清楚如何将 RecordID 值分配给 Add-Member?

标签: powershellapi

解决方案


您的代码似乎无效。您要么缺少第一个 ForEach-Object 的右大括号,要么$CAServiceDesk在为它赋值的表达式中使用$CAServiceDesk(即,当您调用它时它将是一个空变量)。

但是,如果我对您在做什么以及对象的外观做出最好的猜测,我会这样写:

# This should give you a hash table that maps PublicID to RecordID.
# This will not work as I expect if PublicID can be duplicated.
$TableOfCurrentUsers = Invoke-RestMethod -Method Get -Uri $getList -Header $requestHeader |
    Select-Object -ExpandProperty users |
    Select-Object -Property PublicID, RecordID |
    Group-Object -Property PublicID -AsHashTable

# This will get the users and build your custom object
$CAServiceDesk = Get-ADGroupMember "ServiceDesk" -Recursive |
    Get-ADUser -Properties Name, SamAccountName, Department, TelephoneNumber, Manager, UserAccountControl, Mail, EmployeeID |
    Select-Object -Property Name,
        @{n = 'SAM Account Name'; e = {$_.samaccountname}},
        Department,
        @{n = 'Telephone Number'; e = {$_.telephonenumber}},
        @{n = 'Manager'; e = {($_.manager -split ',*..=')[1]}},
        @{n = 'User Account Control'; e = {$_.useraccountcontrol}},
        Mail,
        @{n = 'Employee ID'; e = {$_.employeeID}},
        @{n = 'RecID'; e = { $TableOfCurrentUsers[$_.Name] }}

请注意,Get-ADUser -Properties *除非您真的非常需要,否则您永远不应该指定。有些属性很长,它会使您的 LDAP 查询花费很长时间。


推荐阅读