Powershell - how can i list both username and group membership for users of a named group?

I am relatively new to powershell and I have two statements on the cmd line:

get-adgroupmember | select-object name,samaccountname

To produce a nicely formatted table with two columns of a persons real name and their username.

get-adgroupmember | get-adprincipalgroupmembership | select-object name

To produce list of groups that each user in a named group belongs to.

I would like to combine these so that I have a users real name + username and then the groups they belong to for each user например,

name                samaccountname          memberof
----                --------------          --------
joe bloggs          jbloggs                 group1
                                            group2
                                            groupq

bob laithwaite      blaithwaite             group2
                                            groupm
                                            groupp
                                            groupq

или, может быть,

joe bloggs          jbloggs
group1
group2
groupq

bob laithwaite      blaithwaite
group2
groupm
groupp
groupq

Есть какой-нибудь простой способ создать это? Меня не слишком беспокоит то, что это красиво.

Если нет простого способа, может ли кто-нибудь дать мне какие-нибудь указания, как я могу создать этот сложный способ? Если есть только трудный путь, тогда, хотя рабочий ответ был бы неплохим, я бы скорее имел указатели, с которых можно было бы начать, чтобы увидеть, могу ли я что-то создать сам. В конце концов, я все еще учусь.

Мой первоначальный поиск в Google обнаружил https://gallery.technet.microsoft.com/scriptcenter/Powershell-Get-users-who-b0420fe1 , но не смог найти работать со строкой cmd, заменяя переменные жестко закодированными строками. Это то, чего я в конечном итоге хочу достичь, но всего с двумя группами, однако в первую очередь я хочу начать с чего-то вроде результата, приведенного выше.

Я также обнаружил Как я могу создать список групп безопасности, к которым принадлежит набор пользователей? в процессе написания этого вопроса, но похоже, что это создает список, аналогичный тому, который я создал в вторая строка cmd, которая использует get-adprincipalgroupmembership.

0
задан 13 April 2017 в 15:14
3 ответа

В своем сообщении вы не указали, откуда исходит ваш список пользователей. Похоже, вы получаете пользователей одной группы и видите, членами каких еще они являются. Это в значительной степени не имеет отношения к решению, поэтому я предполагаю, что у вас есть список $ users , и вы можете перейти оттуда.

Что вы хотите сделать, так это объединить свойства из двух команд в один выходной поток. Этого можно добиться, используя Расчетные свойства , например, так ...

$Users | %{Select DisplayName,SamAccountName,@{N="Groups";E={(Get-ADuser $_.SamAccountName -Properties memberof).memberof}}}

Вы также можете использовать подход, подобный этому:

Get-ADGroupMember $GroupName | %{Get-ADUser $_.SamAccountName -Properties memberof | Select Name, SamAccountName, memberof} 
0
ответ дан 5 December 2019 в 10:10

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

ipmo activedirectory

$searchBase = "OU=someOU,DC=yourdomain,DC=com"

$userlist = Get-ADUser -Filter * -SearchBase $searchBase -Properties memberOf

$report = @()

Foreach ($user in $userlist)
{
    $name = $user.Name
    $SAM = $user.SAMAccountName
    $memberOf = $user.memberOf

    $i = 0 #if you only want the user and SAMAccountName to appear once you will need a counter like this, it'se easier to just display it on every row


    Foreach($Group in $memberOf)
    {
        $GroupName = $Group.Replace('CN=','')
        $rowGroup = $GroupName -replace ",.*"

        if($i -eq 0) #if you're happy to have username and SAMAccountName on each row you can skip this bit
        {
            $rowName = $name
            $rowSAM = $SAM
        }
        else
        {
            $rowName = ""
            $rowSAM = ""
        }

        $objRow = New-Object System.Object
        $objRow | Add-Member -MemberType NoteProperty -Name Name -Value $rowName
        $objRow | Add-Member -MemberType NoteProperty -Name SAMAccountName -Value $rowSAM
        $objRow | Add-Member -MemberType NoteProperty -Name GroupName -Value $rowGroup

        $report += $objRow

        $i++

    }

}

$report | ft
0
ответ дан 5 December 2019 в 10:10

Вы можете попробовать таким образом, это даст вам список пользователей со всеми группами, которые находятся в

$users = get-content \\filepath.txt
foreach($u in $users){
  $report += Get-Aduser $u -properties memberof| Get-ADGroup |select-object @{N="GroupName";E={$_.samaccountname}},@{N="username";E={$u}}
}

$report | Export-csv \\filepath.csv
0
ответ дан 21 April 2020 в 09:33

Теги

Похожие вопросы