在管道之间显示 - PowerShell

时间:2015-11-16 23:05:16

标签: powershell

我想获得一组用户所在的群组列表。我已尝试过:

Get-AdGroupMember Users | Get-ADPrincipalGroupMembership | Format-Table -Property name

但这只会让我输出所有组,而不会列出所列组中的原始用户。对Powershell来说相当新,所以也许我错过了一些东西。我想看看输出如下:

user123
-------
Domain Users
Sec Group
Bob Group

user555
------
Domain Users

2 个答案:

答案 0 :(得分:1)

上午8:21

您没有正确使用管道。在面向对象的编程中,首先获得一个对象,然后使用它的属性对其进行过滤。例如:

 Get-WmiObject Win32_UserAccount  | Where-Object {$_.FullName -eq "Doe, John"}

首先我使用cmdlet" Get-WmiObject"调用对象" Win32_UserAccount"。这包括AD上的所有用户帐户。然后我将这些结果传输到另一个Cmdlet" Where-Object",它会过滤结果。 Where-Object有自己的属性,必须以自己的方式使用。 " {}"用于表示语句的开头和结尾。 " $ _"是如何让它知道它是Win32_UserAccount的属性。 "当量"代表等于,然后我给它我正在寻找的字符串" Doe,John"。

如果您已连接到域,则可以使用WMI检索帐户数据。使用此命令获取所有不同的帐户:

Get-WmiObject Win32_Account

对于更具体的结果,您可以使用不同的WMI,如:

Get-WmiObject Win32_UserAccount
Get-WmiObject Win32_Group
Get-WmiObject Win32_SystemAccount

希望这会有所帮助,但听起来您需要更多有关PowerShell的知识。

答案 1 :(得分:1)

我想我理解你的要求。正如您所看到的,PowerShell正在执行您要求它执行的操作...从name创建一个包含所有Get-ADPrincipalGroupMembership的表。管道正在收集信息,以便将其显示为一个单元。

从预期输出的外观中,您实际上希望用户将数据拆分。有几种方法可以完成这项工作。简单的方法是构建一个循环并为每个循环创建一个单独的输出。

Get-ADGroupMember "Domain Admins" | ForEach-Object{
    $_.Name
    "--------"
    $_ | Get-ADPrincipalGroupMembership | Select-Object -ExpandProperty Name
    ""
}

这会产生你在问题中看到的输出。我不太喜欢那个输出,因为它被发送到输出流并且没有利用对象。所以,虽然不像你想要的输出,我会考虑不同的东西:

Get-ADGroupMember "Domain Admins" | ForEach-Object{
    $user =  $_
    $_ | Get-ADPrincipalGroupMembership | ForEach-Object{"{0} - {1}" -f $user.Name, $_.Name}
}

或者

Get-ADGroupMember "Domain Admins" | Select Name,@{Name="PrincipalGroupMembership";Expression={
    ($_ | Get-ADPrincipalGroupMembership | Select-Object -ExpandProperty Name) -join ";"
}} 

这对您有利,因为如果您想使用Export-CSV,现在可以将其导出为CSV。