Как объединить 2 свойства в один выход объектов AD? - PullRequest
0 голосов
/ 26 июня 2019

Мне нужно объединить два свойства в один столбец, имя пользователя находится в 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: 

Я пытался использовать для каждого цикла, но не могу понять, как использовать оператор выбора.

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 ]

1 голос
/ 26 июня 2019

Я бы использовал оператор 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
0 голосов
/ 26 июня 2019

i думаю, вы хотите объединить источники в один выходной объект.

обычным способом добавления значений из нескольких источников в один объект является использование [PSCustomObject] для создания ... пользовательского объекта .[ ухмылка ] У меня нет доступа к AD, так что это делается с информацией о локальном пользователе и группе.Вы можете сделать довольно сложное структурирование, рассчитав, с чем вы хотите работать, и поместив все это в один аккуратно структурированный объект.

Вот демонстрация идеи с использованием локальных учетных записей ...

$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довольно легко[ ухмылка ]

...