Создайте пользовательский тип объекта с помощью для l oop в powershell - PullRequest
0 голосов
/ 07 января 2020

Я использую Powershell и пытаюсь экспортировать CSV-файл, содержащий список пользователей и все группы, к которым они принадлежат. Когда я сталкиваюсь с проблемами, я хочу, чтобы каждая группа была отдельной колонкой, чтобы было легче сравнивать, кто к чему принадлежит.

$OU = "OU=Company,DC=Domain,DC=local"
$out = @()
$users = Get-aduser -filter * -SearchBase $OU -properties memberof |  Where-Object { $_.enabled -eq "true" }
Foreach ( $user in $users ) {
    $group = ($user.memberof -replace 'CN=(.+?),(OU|DC|)=.+','$1') -split (", ")
    $obj = New-Object psobject
    $obj | Add-Member -membertype noteproperty -name Name -Value $user.name -force
    $obj | Add-Member -membertype noteproperty -name Dept -Value (($user.DistinguishedName -replace "CN=$($user.name),OU=") -replace ",OU(.+?),OU=Company,DC=Domain,DC=local") -force
    $obj | Add-Member -membertype noteproperty -name Loc -Value (($user.DistinguishedName -replace "CN=$($user.name),OU=(.+?),OU=") -replace ",OU=Company,DC=Domain,DC=local") -force
    $group | ForEach-Object { 
        $obj | Add-Member -membertype noteproperty -name $_ -Value "Y" -force 
    }
    $out += $obj
}

$out |export-csv C:\users.csv -NoTypeInformation

Таким образом, будет выполняться поиск всех пользователей, разделение членов по группам. а затем я хочу создать отдельный столбец для каждой группы. Проблема в объекте foreach l oop для каждой группы.

Это то, что я ищу. Скажем, user1 принадлежит к Group1 и Group2, а user2 принадлежит к Group1 и Group3,

Name    Dept    Loc    Group1    Group2     Group3
User1   HR      CAN       Y        Y
User2   Sales   US        Y                   Y

Это работает для первого пользователя, но после этого больше не будет добавлять группы для каждого пользователя, вывод с следующее:

Name    Dept    Loc    Group1    Group2 
User1   HR      CAN       Y        Y
User2   Sales   US        Y

Что мне здесь не хватает? Это возможно?

Ответы [ 2 ]

0 голосов
/ 07 января 2020

Я впервые пишу ответ сообществу PowerShell, поэтому я сделаю все возможное, чтобы предоставить вам информацию, которую я могу, и в надлежащем формате.

По моему опыту Get-ADUser лучше для получения и работы со свойствами пользователя, а не для большого количества групп пользователей. Get-ADPrincipalGroupMembership хорошо работает с получением определенного c членства пользователя и это то, что я использую в своем примере.

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

Get-ADUser

Get-ADPrincipalGroupMembership

В моем примере я использую Get-ADUser и Get-ADPrincipalGroupMembership, который Get-ADPrincipalGroupMembership принимает параметр -Identity и ищет входные данные пользователи SamAccountName, чтобы получить группы для каждого пользователя, и он найден из Get-ADUser.

Я также использую таблицы ha sh в этом примере, которые вы можете создать и использовать объект, но я союзник, как ха sh таблицы, и они иногда могут повысить скорость вашего кода. Я свяжу официальную документацию по MS, но я также перечислю более подробную статью в блог Кевина Маркетта, в котором есть масса примеров для таблиц ha sh.

about_Hash_Tables

Кевин Маркетт - PowerShell: все, что вы хотели знать о хеш-таблицах

$OU = 'OU=Company,DC=Domain,DC=local'

$users = Get-ADUser -Filter * -SearchBase $OU -Properties Department, Country | Where-Object {$_.Enabled -eq $true}

ForEach ($user in $users) {

    $groups = Get-ADPrincipalGroupMembership $user.SamAccountName

    $h = [ordered]@{
        'Name' = $user.SamAccountName
        'Department' = $user.Department
        'Location' = $user.Country
    }

    ForEach ($group in $groups) {
        $h.Add($group.Name,'Y')
    }

    $testObject = [pscustomobject]$h #Casting the hash table to a custom object

    $testObject | Export-Csv 'C:\test\test.csv' -Append -NoTypeInformation -Force
    #Must have append and force, just be sure to make a new csv file or delete the existing one when running this command multiple times since it will write the same info over and over again.

    $h.clear() #Cannot have duplicate values in hash tables so at the end of each loop through each user, we clear out the hash table so it can be rebuilt with the newly found user.
}
0 голосов
/ 07 января 2020

Это сработало, я изменил его, чтобы включить списки рассылки:

$OU = "OU=Company,DC=Domain,DC=local"
$out = @()
$lists = (Get-ADGroup -Filter "groupcategory -eq 'Distribution'" -SearchBase $OU).name
$obj = New-Object psobject
$obj | Add-Member -membertype noteproperty -name Name -Value Notset
$obj | Add-Member -membertype noteproperty -name Dept -Value Notset
$obj | Add-Member -membertype noteproperty -name Loc -Value Notset
$lists | ForEach-Object { 
    $obj | Add-Member -membertype noteproperty -name $_ -Value Notset
}
$out += $obj
$users = Get-aduser -filter * -SearchBase $OU -properties memberof | Where-Object { $_.enabled -eq "true" }
Foreach ( $user in $users ) {
    $group = ($user.memberof -replace 'CN=(.+?),(OU|DC|)=.+','$1') -split (", ")
    $obj = New-Object psobject
    $obj | Add-Member -membertype noteproperty -name Name -Value $user.name -force
    $obj | Add-Member -membertype noteproperty -name Dept -Value (($user.DistinguishedName -replace "CN=$($user.name),OU=") -replace ",OU(.+?),OU=Company,DC=Domain,DC=local") -force
    $obj | Add-Member -membertype noteproperty -name Loc -Value (($user.DistinguishedName -replace "CN=$($user.name),OU=(.+?),OU=") -replace ",OU=Company,DC=Domain,DC=local") -force
    $group | ForEach-Object { 
        $obj | Add-Member -membertype noteproperty -name $_ -Value "Y" -force 
    }
    $out += $obj
}

$out |export-csv C:\users.csv -NoTypeInformation
...