PSCustomObject foreach

时间:2013-12-13 17:25:57

标签: powershell foreach custom-component

我已经创建了一个自定义对象,但是我对一个数组的输出有些麻烦。

$i = "computername"
$adsi = [ADSI]"WinNT://$i"
$Object = $adsi.Children | ? {$_.SchemaClassName -eq 'user'} | % {
New-Object -TypeName PSCustomObject -Property @{
    ComputerName = $i.toupper() -join ''
    UserName = $_.Name -join ''
    Groups = ($_.Groups()  |Foreach-Object {$_.GetType().InvokeMember("Name",     'GetProperty', $null, $_, $null)}) -join ',' 
    Disabled = Get-WmiObject -ComputerName $i -Class Win32_UserAccount -Filter "LocalAccount='$true'"|Select-Object -expandproperty Disabled 
    }  
  } 

$object

问题在于Disabled数组,而不是每行显示一个项目     {False, True, False, False}我知道我必须在%添加到该行的某个地方,但我不知道在哪里。

有人有什么建议吗?

1 个答案:

答案 0 :(得分:2)

您所看到的内容对我有意义 - 您正在创建一个包含ComputerNameUserName等的对象数组,而在Disabled中您正在获取一个数组值,因为您正在查询所有本地用户帐户并获取其已停用状态。我怀疑你想要的是确定每个用户依次被禁用。在这种情况下,您需要将Filter Get-WMIObject扩展到只有一个用户。

$i = "computername"
$adsi = [ADSI]"WinNT://$i"
$Object = $adsi.Children | ? {$_.SchemaClassName -eq 'user'} | % {
$UserName = $_.Name -join '';
New-Object -TypeName PSCustomObject -Property @{
    ComputerName = $i.toupper() -join ''
    UserName = $UserName
    Groups = ($_.Groups()  |Foreach-Object {$_.GetType().InvokeMember("Name",     'GetProperty', $null, $_, $null)}) -join ',' 
    Disabled = Get-WmiObject -ComputerName $i -Class Win32_UserAccount -Filter "LocalAccount='$true' and name='$UserName'"|Select-Object -expandproperty Disabled 
    }  
  } 

$object