如何将2个属性合并到AD对象的单个输出中?

时间:2019-06-25 22:43:28

标签: powershell active-directory windows-scripting adgroup

我需要将两个属性合并到一栏中,用户名在DisplayName中,而组名存储在Name中,但是两种对象都具有DisplayName,Name属性,所以我需要在一栏中显示它们。

Suppose Group is 'Test Group'

CN : …
ObjectGUID : 123-456-XXXX
ObjectClass: group
DisplayName: 
Name: 'Test Group'

And 'Test User' Properties are 
CN: …
ObjectGUID : 789-456-XXXX
ObjectClass: user
DisplayName: 'Test User'
Name: 

我已经尝试过为每个循环使用a,但是无法弄清楚select语句的使用。

Get-ADGroupMember -Identity $GroupGUID | 
ForEach-Object{
    if($_.ObjectClass -eq 'User'){
        # process user object
        $_ | Get-ADUser -Properties DisplayName
    }elseif ($_.ObjectClass -eq 'User'){
        # process group
        $_ | Get-ADGroup -Properties Name
    }
} 

预期输出必须为

MemberName          ObjectGUID
----------------    ------------------
Test Group          123-456-XXXX
Test User           789-456-XXXX

2 个答案:

答案 0 :(得分:1)

我将使用switch语句根据每个项目是用户还是用户组来对其进行处理,然后根据其内容替换MemberName属性:

$Results = Switch(Get-ADGroupMember -Identity $GroupGUID){
    {$_.ObjectClass -eq 'User'} {$_ | Get-ADUser -Prop DisplayName | Select *,@{l='MemberName';e={$_.DisplayName}} -ExcludeProperty MemberName}
    {$_.ObjectClass -eq 'Group'} {$_ | Get-ADGroup | Select *,@{l='MemberName';e={$_.Name}} -ExcludeProperty MemberName}
}
$Results|Select MemberName,ObjectGUID

或者,如果您真的希望在管道中完成所有操作,则可以这样做:

Get-ADGroupMember -Identity $GroupGUID -PipelineVariable 'Member' | ForEach{If($Member.ObjectClass -eq 'User'){$_ | Get-ADUser -Properties DisplayName}Else{$_ | Get-ADGroup}} | Select @{l='MemberName';e={If($Member.ObjectClass -eq 'User'){$_.DisplayName}Else{$_.Name}}},ObjectGUID

答案 1 :(得分:0)

i 认为您想将源合并到一个输出对象中。

将来自多个源的值添加到一个对象中的通常方法是使用[PSCustomObject]来构建... 自定义对象。 [咧嘴]我没有任何广告访问权限,因此这是通过本地用户和组信息完成的。您可以通过计算要使用的内容并将其全部填充到一个整齐的结构化对象中,来进行一些相当复杂的结构化处理。

这是使用本地帐户的演示示例

$GroupName = 'Homonymic_Tuu'

$MemberList = Get-LocalGroupMember -Group $GroupName |
    Where-Object {$_.ObjectClass -eq 'User'}
$GroupInfo = Get-LocalGroup -Name $GroupName

foreach ($ML_Item in $MemberList)
    {
    $UserInfo = Get-LocalUser -Name $ML_Item.Name.Split('\')[-1]
    if ([string]::IsNullOrEmpty($UserInfo.LastLogon))
        {
        $LastLogon = '_Never_'
        }
        else
        {
        $LastLogon = $UserInfo.LastLogon
        }
    [PSCustomObject]@{
        Group_Name = $GroupInfo.Name
        Group_Description = $GroupInfo.Description
        User_Name = $UserInfo.Name
        User_Description = $UserInfo.Description
        User_Enabled = $UserInfo.Enabled
        User_LastLogon = $LastLogon
        }
    }

截断的输出...

Group_Name        : Homonymic_Tuu
Group_Description : Homonym - sounds like Tuu
User_Name         : 22
User_Description  : The Digit 2 Twice
User_Enabled      : True
User_LastLogon    : 2018-11-27 9:19:10 PM

[*...snip...*] 

Group_Name        : Homonymic_Tuu
Group_Description : Homonym - sounds like Tuu
User_Name         : TwoTwo
User_Description  : Repeating the name of the number after One.
User_Enabled      : True
User_LastLogon    : _Never_

数据也将很容易导出到CSV文件。 [咧嘴]