Как получить все группы, в которые входит пользователь? - PullRequest
106 голосов
/ 22 февраля 2011

Командлет PowerShell Get-ADGroupMember возвращает членов определенной группы. Существует ли командлет или свойство для получения всех групп, в которые входит конкретный пользователь?

<Ч />

Я исправил свою ошибку: Get-Member должно быть Get-ADGroupMember.

Ответы [ 28 ]

3 голосов
/ 23 мая 2015

Это всего одна строка:

(get-aduser joe.bloggs -properties *).memberof

конец:)

2 голосов
/ 16 февраля 2015

ниже работает хорошо:

get-aduser $username -Properties memberof | select -expand memberof

Если у вас есть список пользователей:

$list = 'administrator','testuser1','testuser2'
$list | `
    %{  
        $user = $_; 
        get-aduser $user -Properties memberof | `
        select -expand memberof | `
        %{new-object PSObject -property @{User=$user;Group=$_;}} `
    }
2 голосов
/ 04 октября 2018

Если вы не можете заставить Get-ADPrincipalGroupMembership работать на вас, попробуйте войти в систему под этим пользователем, затем используйте.

$id = [Security.Principal.WindowsIdentity]::GetCurrent()
$groups = $id.Groups | foreach-object {$_.Translate([Security.Principal.NTAccount])}
$groups | select *
2 голосов
/ 06 декабря 2013

Я написал функцию PowerShell под названием Get-ADPrincipalGroupMembershipRecursive.Он принимает DSN учетной записи пользователя, компьютера, группы или службы.Он извлекает начальный список групп из атрибута memberOf учетной записи, а затем рекурсивно проверяет членство этих групп.Сокращенный код ниже.Полный исходный код с комментариями можно найти здесь .

function Get-ADPrincipalGroupMembershipRecursive( ) {

    Param(
        [string] $dsn,
        [array]$groups = @()
    )

    $obj = Get-ADObject $dsn -Properties memberOf

    foreach( $groupDsn in $obj.memberOf ) {

        $tmpGrp = Get-ADObject $groupDsn -Properties memberOf

        if( ($groups | where { $_.DistinguishedName -eq $groupDsn }).Count -eq 0 ) {
            $groups +=  $tmpGrp           
            $groups = Get-ADPrincipalGroupMembershipRecursive $groupDsn $groups
        }
    }

    return $groups
}

# Simple Example of how to use the function
$username = Read-Host -Prompt "Enter a username"
$groups   = Get-ADPrincipalGroupMembershipRecursive (Get-ADUser $username).DistinguishedName
$groups | Sort-Object -Property name | Format-Table
2 голосов
/ 14 декабря 2012

Сначала импортируйте модуль activedirectory:

import-module activedirectory

Затем выполните эту команду:

Get-ADGroupMember -Identity $group | foreach-object {
    Write-Host $_.SamAccountName
}

Это отобразит членов указанной группы.

1 голос
/ 21 марта 2014

Get-QADUser -SamAccountName LoginID | % {$ _. MemberOf} | Get-QADGroup | выберите имя

1 голос
/ 24 апреля 2015

Я не могу заставить следующее работать для конкретного пользователя:

Get-ADPrincipalGroupMembership username

Вышла ошибка, которую я не хотел устранять.

Я, однако, придумалдругое решение с использованием Get-ADUser.Мне нравится это немного лучше, потому что, если вы не знаете имя учетной записи, вы можете получить его, используя подстановочный знак на фактическом имени пользователя.Просто заполните PartOfUsersName и все готово.

#Get the groups that list of users are the member of using a wildcard search

[string]$UserNameLike = "*PartOfUsersName*" #Use * for wildcards here
[array]$AccountNames = $(Get-ADUser -Filter {Name -like $UserNameLike}).SamAccountName

ForEach ($AccountName In $AccountNames) {
Write-Host "`nGETTING GROUPS FOR" $AccountName.ToUpper() ":"
(Get-ADUser -Identity $AccountName -Properties MemberOf|select MemberOf).MemberOf|
    Get-ADGroup|select Name|sort name
    }

Огромные реквизиты для schmeckendeugler и 8DH за то, что я познакомился с этим решением.+1 вам обоим.

0 голосов
/ 13 декабря 2018

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

Get-ADPrincipalGroupMembership username | Format-Table -auto

Второй подход к представлению этого - указать отдельные интересующие вас столбцы, например:

Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory

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

Ключевое преимущество, которое это дает вам, это то, что вы можете сразу увидеть списки рассылки и группы безопасности. Кроме того, вы можете сразу увидеть универсальные, доменные и глобальные.
Почему вы заботитесь об этом последнем бите?

  • Универсальная группа - это группа безопасности или рассылки, которая содержит пользователи, группы и компьютеры из любого домена в его лесу, как члены. Вы можете предоставить универсальным группам безопасности права и разрешения на ресурсы в любом домене в лесу.
  • Глобальная группа - это группа, которая может использоваться в своем собственном домене, в члене. серверы и на рабочих станциях домена, и в доверенных доменах. Во всех этих местах вы можете дать глобальную группу прав и разрешения и глобальная группа могут стать членами локальных групп. Однако глобальная группа может содержать учетные записи пользователей только из свой собственный домен.
  • Локальная группа домена - это группа безопасности или распределения, которая может содержат универсальные группы, глобальные группы, другие доменные локальные группы из собственного домена и учетных записей из любого домена в лесу. Вы может дать домену локальные группы безопасности прав и разрешений на ресурсы, которые находятся только в том же домене, где локальный домен группа находится.
0 голосов
/ 28 ноября 2018

Изучение всех представленных комментариев дало мне отправную точку (спасибо за это), но оставило меня с несколькими нерешенными проблемами.В результате вот мой ответ.Предоставленный фрагмент кода делает немного больше, чем запрашивается, но предоставляет полезную информацию об отладке.

[array] $script:groupsdns = @()
function Get-ADPrincipalGroupMembershipRecursive() 
{
  Param( [string] $dn, [int] $level = 0, [array] $groups = @() )

  #if(($groupsdns | where { $_.DistinguishedName -eq $dn }).Count -ne 0 ) { return $groups } # dependency on next statement
  #$groupsdns += (Get-ADObject $dn -Properties MemberOf) # Get-ADObject cannot find an object with identity
  if ($script:groupsdns.Contains($dn)) { return $groups }
  $script:groupsdns += $dn
  $mo = $Null
  $mo = Get-ADObject $dn -Properties MemberOf # Get-ADObject cannot find an object with identity
  $group = ($dn + " (" + $level.ToString())
  if ($mo -eq $Null) { $group += "!" }
  $group += ")"
  $groups += $group
  foreach( $groupdn in $mo.MemberOf )
  {
    $groups = Get-ADPrincipalGroupMembershipRecursive -dn $groupdn -level ($level+1) -groups $groups
  }
  if ($level -le 0) 
  { 
    $primarygroupdn = (Get-ADUser -Identity $dn -Properties PrimaryGroup).PrimaryGroup 
    $groups = Get-ADPrincipalGroupMembershipRecursive -dn $primarygroupdn -level ($level+1) -groups $groups
  }
  return $groups
}
$adusergroups = Get-ADPrincipalGroupMembershipRecursive -dn $aduser.DistinguishedName
$adusergroups | ft -AutoSize | `
              Out-File -Width 512 Get-ADPrincipalGroupMembershipRecursive.txt #-Append #-Wrap # | Sort-Object -Property Name
0 голосов
/ 18 июля 2013
Import-Module ActiveDirectory
Get-ADUser -SearchBase "OU=Users,DC=domain,DC=local" -Filter * | foreach-object {
write-host "User:" $_.Name -foreground green
    Get-ADPrincipalGroupMembership $_.SamAccountName | foreach-object {
        write-host "Member Of:" $_.name
    }
}

Измените значение -SearchBase, чтобы отразить OU, из которого необходимо составить список пользователей:)

Это перечислит всех пользователей в этом OU и покажет, к каким группам они относятся.из.

...