首页 > 解决方案 > Pscustomobject 添加动态值

问题描述

我正在尝试从特定 OU 读取计算机的组成员身份并写入 CSV 文件。组成员的输入标准就像计算机是“管理员”的一部分,我需要以下格式的 csv 文件

---------------------------------------------------------
Computer   Group1  Group2  Group3 Group4
ABCD       admin1   admin2 admin3 admin4
EFGH                admin2  admin3
XYZZ       admin1                  admin4
--------------------------------------------------------------
but end up like this.
---------------------------------------------------------
Computer   Group1  Group2  Group3 Group4
ABCD       admin1  admin2  admin3 admin4
EFGH       admin2  admin3
XYZZ       admin1  admin4
--------------------------------------------------------------

代码是这样的

$All_computer = Get-ADComputer -Filter * -Property * -SearchBase $ou -Server $server | Select-object Name,DNSHostName,Description,memberof 
$computerExport = $All_computer | 
ForEach-Object {

  $ComputerName = $_.Name
  $Description = $_.description
  $DNSHostname = $_.DNSHostName
  $memberof = $_.memberof
  
$groups = $memberof.where{$_ -like  "*$unput_group*"} 
$Group_member = [pscustomobject]@{
        Workstation = $ComputerName
        Comp_Description = $Description
        DNS_Hostname = $DNSHostname
    }
$i = 0

foreach($group in $Groups) 
{
$i++
$member = $group.split('=')[1].split(',')[0]
$Group_member | add-member -MemberType NoteProperty -Name "Group$i" -Value $member
}

$Group_member
  } 

 }

$computerExport | export-csv .\Membership_status.csv -NoTypeInformation

我需要做什么才能使组成员身份填充到正确的列中。

标签: powershellpowershell-3.0pscustomobject

解决方案


当然可以。我的意思是它正在做你要求它做的事情。您只是将属性数量添加到从 where 对象查询中找到的自定义对象。我真的很难理解您要这样做的目的,但我认为您真正想要的是每个对象都具有所有可能的属性,但对于那些不匹配特定计算机或更好的对象具有空值使用布尔值。

所以......也许是这样的:

[string]$GroupSearch = "admin"

$All_computer = Get-ADComputer -Filter * -Property DNSHostName, Description, memberof -SearchBase $ou -Server $server | Select-Object Name, DNSHostName, Description, memberof 
$MatchedGroups = $All_Computer.MemberOf | Sort -Unique | ?{$_.Name -match $GroupSearch}

$computerExport = ForEach ($C in $All_computer) {
    $Group_member = [pscustomobject]@{
        Workstation      = $($C.Name)
        Comp_Description = $($C.Description)
        DNS_Hostname     = $($C.DNSHostName)
    }

    ForEach ($group in $MatchedGroups) {
        [string]$GrpName = $($group.split('=')[1].split(',')[0])
        If ($C.MemberOf -contains $group) {
            $Group_member | Add-Member -MemberType NoteProperty -Name $GrpName -Value $true
        } else {
            $Group_member | Add-Member -MemberType NoteProperty -Name $GrpName -Value $false
        }
    }
    $Group_member
} 

$computerExport | Export-Csv .\Membership_status.csv -NoTypeInformation

推荐阅读