Як отримати всі групи, членами яких є користувач?


135

Командлет PowerShell Get-ADGroupMemberповертає членів певної групи. Чи є командлет або властивість отримувати всі групи, членами якого є певний користувач?


Я виправив свою помилку: Get-Memberмає бути Get-ADGroupMember.


Питання не ясно. Чи можете ви переробити це або додати приклад?
Мохіт Чакраборті

1
Див. Stackoverflow.com/questions/668321/… та technet.microsoft.com/en-us/library/dd315351.aspx . Ви впевнені, що Get-Member робить те, що, на вашу думку, робить?
tiago2014

@Mohit Chakraborty Це тепер зрозуміліше?
Примоз

1
як швидко ви можете скористатися net user /domain username, перевірте також інші методи на Get Групи, в якій є користувач, використовуючи PowerShell
Mohamed

Відповіді:


282

Get-ADPrincipalGroupMembership зробить це.

Get-ADPrincipalGroupMembership username | select name

name
----
Domain Users
Domain Computers
Workstation Admins
Company Users
Company Developers
AutomatedProcessingTeam

1
Це просто врятувало мене від використання найбільш перекрученого і довго звивистого методу пошуку цього. Знав, що повноваження мали б щось подібне, але не могли його знайти ніде. +1
Тім Олександр

7
Зауважте, що це залежить від наявного модуля ActiveDirectory. Це не обов'язково працює на клієнтській машині, де ви використовуєте сценарій PowerShell, або на клієнтах нижчого рівня. Якщо ви хочете це зробити, використовуйте це рішення .
Даніель.S

5
Вище сказане моє помилки ("Сервер не зміг обробити запит через внутрішню помилку" - імовірно функціональність недоступна на сервері). get-aduser $username -Properties memberof | select -expand memberofдобре працював, хоча.
JohnLBevan

5
Якщо ви працюєте на робочій станції Windows 10, а не на сервері, встановіть RSAT звідси , а потім введіть import-module activedirectoryкомандний рядок powershell, і це має бути запущено.
Джеймс Тумі

3
Якщо модуль не встановлено: Install-WindowsFeature RSAT-AD-PowerShell
Preben Huybrechts

81

Однорядковий, не потрібні модулі, використовує поточний користувач, який зареєстрований

(New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($env:username)))")).FindOne().GetDirectoryEntry().memberOf

Qudos до цієї статті vbs / powershell: http://technet.microsoft.com/en-us/library/ff730963.aspx


5
Дякую, я ціную цю версію без модулів. Я просто змінив змінну з $env:usernameна $usernameта встановив, $username = "testuser"щоб легко робити заміну змінної для інших пошукових запитів користувачів.
projectdp

Тільки гугл мій шлях сюди знову! Ще корисний у випадкових ситуаціях, коли інструменти AD недоступні.
Натан

43

Більш коротка альтернатива тій, яку опублікував Canoas, щоб отримати членство в групі для користувача, який зараз увійшов у систему.

Я натрапив на цей метод у цій публікації в блозі: http://www.travisrunyard.com/2013/03/26/auto-create-outlook-mapi-user-profiles/

([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof

Ще краща версія, яка використовує регулярний вираз, щоб зняти guff LDAP і залишає лише назви груп:

([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof -replace '^CN=([^,]+).+$','$1'

Більш детальну інформацію про використання прискорювача типу [ADSISEARCHER] можна знайти на блозі сценарію хлопців: http://blogs.technet.com/b/heyscriptingguy/archive/2010/08/24/use-the-powershell-adsisearcher-type -accelerator-to-search-active-directory.aspx


1
І те й інше дають мені помилку: виняток викликає "FindOne" з аргументами "0": "Сам рахунок акаунта = фільтр пошуку недійсний."
Даллас

Дивно .... Я просто тестував його ще раз, але на Windows 7 в абсолютно іншому середовищі, і він чудово працює і тут.
Даніель.S

Я знову спробував зараз, все ще на Win 7, і це працює чудово. Можливо, у мене був помилковий помилок, коли вперше спробував це. Дякуємо, що додали заміну, щоб викреслити лісовий "гуф".
Даллас

2
Чудово працює, додається, | Sort-Objectщоб зробити його ще читабельнішим.
Мартін Холлінгсворт

31

Старий шкільний шлях від CMD:

net user mst999 /domain 

1
він також працює на клієнтських машинах без додаткових інструментів AD
Rast

4
На жаль - якщо назви ваших груп довгі (тобто> 21 символ), то вони будуть
усікати

що б'ється кожен інший шлях! Браво
StayCool

24
(GET-ADUSER Identity USERNAME Properties MemberOf | Select-Object MemberOf).MemberOf

Дякую! це спрацювало. єдиний мінус - це значення, що повертається - це рядок.
шейс

3
| get-adgroup виведе об'єкти групи. Блискуче!
8DH

1
або скористайтеся замість $ env: USERNAME, щоб схопити ім'я користувача поточно зареєстрованого користувача
Дейв Лукре

6

Якщо ви не можете змусити Get-ADPrincipalGroupMembership працювати для вас, ви можете спробувати увійти в систему, як цей користувач.

$id = [Security.Principal.WindowsIdentity]::GetCurrent()
$groups = $id.Groups | foreach-object {$_.Translate([Security.Principal.NTAccount])}
$groups | select *

Вам не потрібно входити в систему як користувач, якщо ви використовуєте щось на кшталт$id = [Security.Principal.WindowsIdentity]("username")
Bitcoin Murderous Maniac

1
Це красиво скорочується до однолінійного [System.Security.Principal.WindowsIdentity]::GetCurrent().Groups | % {$_.Translate([Security.Principal.NTAccount])}.
alx9r

5

Отримати членство в групі для користувача:

$strUserName = "Primoz"
$strUser = get-qaduser -SamAccountName $strUserName
$strUser.memberof

Див. Розділ Отримання членства в групі для користувача

Але також дивіться Quest's безкоштовні команди PowerShell для Active Directory .

[ Редагувати : Команда Get-ADPrincipalGroupMembership включена в Powershell з v2 з Windows 2008 R2. Дивіться відповідь kstrauss нижче.]


2
Насправді є легший спосіб з командлетами Quest: Get-QADGroup -Contains Primoz
fenster

18
Це вже не найкраща відповідь, оскільки Get-ADPrincipalGroupMembership тепер вбудований у PowerShell
Роб Кеннон

1
Проголосували за те, що було б набагато краще використовувати Get-ADPrincipalGroupMembership. Я б хотів скасувати цю антену, але не можу. Я відредагую відповідь, щоб зазначити, що вбудована опція зараз існує.
Авраам

4

Get-Memberє командлетом для переліку членів .NET object. Це не має нічого спільного з членством користувача / групи. Ви можете отримати членство в групі поточного користувача так:

PS> [System.Security.Principal.WindowsIdentity]::GetCurrent().Groups | 
         Format-Table -auto

BinaryLength AccountDomainSid    Value
------------ ----------------    -----
          28 S-1-5-21-...        S-1-5-21-2229937839-1383249143-3977914998-513
          12                     S-1-1-0
          28 S-1-5-21-...        S-1-5-21-2229937839-1383249143-3977914998-1010
          28 S-1-5-21-...        S-1-5-21-2229937839-1383249143-3977914998-1003
          16                     S-1-5-32-545
...

Якщо вам потрібен доступ до довільної інформації про групу користувачів, тоді @tiagoinu пропозиція використовувати командлети Quest AD - це кращий шлях.


4

Спочатку імпортуємо модуль activedirectory:

import-module activedirectory

Потім видайте цю команду:

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

Це відобразить членів зазначеної групи.


ОП просить навпаки. Отримати всі групи, до яких вказаний користувач.
8DH

4

Немає необхідності у довгих сценаріях, коли це простий один вкладиш ..

КВІТКА Команда

(Get-QADUser -Identity john -IncludedProperties MemberOf | Select-Object MemberOf).MemberOf

Команда MS AD

(GET-ADUSER Identity john Properties MemberOf | Select-Object MemberOf).MemberOf

Я знаходжу MSD MSD швидше, але деяким людям подобаються квести краще ..

Стів


4

Get-Member не для отримання членства в групі користувача. Якщо ви хочете отримати список груп, до яких належить користувач у локальній системі, ви можете зробити це:

$query = "ASSOCIATORS OF {Win32_Account.Name='DemoUser1',Domain='DomainName'} WHERE ResultRole=GroupComponent ResultClass=Win32_Account"

Get-WMIObject -Query $query | Select Name

У наведеному вище запиті замініть DemoUser1 на потрібне ім’я користувача, а DomainName - на ім’я вашого локального комп'ютера або ім'я домену.


Цей запит займає багато часу і відповідає дуже повільно, коли в оточенні є кілька користувачів та груп
randeepsp

Хто редагує відповідь, переконайтесь, що ви її правильно відредагували. Я пропонував ОП замінити DemoUser1 будь-яким ім'ям користувача, який він захоче. І ви цілком змінили це значення.
ravikanth

4

Використання:

Get-ADPrincipalGroupMembership username | select name | export-CSV username.csv

Це передає висновок команди у файл CSV .


4

Це має надати вам інформацію про поточного користувача. Потужність не потрібна.

whoami /groups


3

Це лише один рядок:

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

кінець :)


Передача цього запиту select -expandproperty memberofзробить результат трохи читабельнішим / кориснішим.
Бен Тул

2

Я написав функцію PowerShell під назвою Get-ADPrincipalGroupMembershipRecursive. Він приймає DSN облікового запису користувача, комп'ютера, групи або послуги. Він отримує початковий список груп з атрибута accountOf акаунта, а потім рекурсивно перевіряє членство цих груп. Скорочений код знаходиться нижче. Повний вихідний код із коментарями можна знайти тут .

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

Нижче добре працює:

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=$_;}} `
    }

1

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


1

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

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 для вас обох.


1

Хоча тут є багато відмінних відповідей, є одна, яку я особисто шукав, що не було. Одного разу я зрозумів це - я подумав, що мені слід його опублікувати на випадок, якщо я захочу його знайти пізніше, або він справді вдається допомогти комусь іншому в якийсь момент:

Get-ADPrincipalGroupMembership username | Format-Table -auto

Другий підхід для його представлення полягає у визначенні окремих стовпців, які вас цікавлять, наприклад:

Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory

Це дає всі групи AD, яким належить ім'я користувача, - а також представлені всі властивості за замовчуванням кожної групи, добре відформатовані у вигляді таблиці.

Основна перевага, яку ви отримуєте від вас, - ви можете побачити, які списки розповсюдження та які - групи безпеки. Далі ви можете з першого погляду побачити, які універсальні, які доменні та доменні глобальні.
Чому б ти дбав про цей останній шматочок?

  • Універсальна група - це група безпеки або розповсюдження, яка містить користувачів, груп та комп'ютери з будь-якого домену в її лісі в якості членів. Ви можете надати універсальним групам безпеки права та дозволи на ресурси в будь-якій галузі лісу.
  • Глобальна група - це група, яку можна використовувати у власному домені, на серверах-членах та на робочих станціях домену та довірчих доменах. У всіх цих місцях ви можете надати права та дозволи глобальній групі, і глобальна група може стати членом локальних груп. Однак глобальна група може містити облікові записи користувачів, які є лише з її власного домену.
  • Локальна група доменів - це група безпеки або розповсюдження, яка може містити універсальні групи, глобальні групи, інші локальні групи доменів із власного домену та рахунки з будь-якого домену в лісі. Ви можете надати правам і дозволам місцевих груп безпеки домену на ресурси, які перебувають лише в тому самому домені, де знаходиться локальна група домену.

0
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, щоб відобразити НУ, з якого потрібно перелічити користувачів :)

Це перерахує всіх користувачів у цьому ОУ та покаже вам, до яких груп вони належать.



0
   Get-ADUser -Filter { memberOf -RecursiveMatch "CN=Administrators,CN=Builtin,DC=Fabrikam,DC=com" } -SearchBase "CN=Administrator,CN=Users,DC=Fabrikam,DC=com"  -SearchScope Base
                  ## NOTE: The above command will return the user object (Administrator in this case) if it finds a match recursively in memberOf attribute. 

0

Це найпростіший спосіб просто отримати імена:

Get-ADPrincipalGroupMembership "YourUserName"

# Returns distinguishedName : CN=users,OU=test,DC=SomeWhere GroupCategory : Security GroupScope : Global name : testGroup objectClass : group objectGUID : 2130ed49-24c4-4a17-88e6-dd4477d15a4c SamAccountName : testGroup SID : S-1-5-21-2114067515-1964795913-1973001494-71628

Додайте заявку вибору, щоб обрізати відповідь або отримати кожного користувача в ОУ кожну групу, якої він є користувачем:

foreach ($user in (get-aduser -SearchScope Subtree -SearchBase $oupath -filter * -Properties samaccountName, MemberOf | select samaccountName)){ Get-ADPrincipalGroupMembership $user.samaccountName | select name}


0

Щоб отримати рекурсивний характер, ви можете використовувати:

<# 
    .SYNOPSIS   
        Get all the groups that a user is MemberOf.

    .DESCRIPTION
        This script retrieves all the groups that a user is MemberOf in a recursive way.

    .PARAMETER SamAccountName
        The name of the user you want to check #>

Param (
    [String]$SamAccountName = 'test',
    $DomainUsersGroup = 'CN=Domain Users,CN=Users,DC=domain,DC=net'
)


Function Get-ADMemberOf {
    Param (
        [Parameter(ValueFromPipeline)]
        [PSObject[]]$Group,
        [String]$DomainUsersGroup = 'CN=Domain Users,CN=Users,DC=grouphc,DC=net'
    )
    Process {
        foreach ($G in $Group) {
            $G | Get-ADGroup | Select -ExpandProperty Name
            Get-ADGroup $G -Properties MemberOf| Select-Object Memberof | ForEach-Object {
                Get-ADMemberOf $_.Memberof
            }
        }
    }
}


$Groups = Get-ADUser $SamAccountName -Properties MemberOf | Select-Object -ExpandProperty MemberOf
$Groups += $DomainUsersGroup
$Groups | Get-ADMemberOf | Select -Unique | Sort-Object

0

Майже у всіх вищезазначених рішеннях використовується ActiveDirecotryмодуль, який може бути недоступним за замовчуванням у більшості випадків.

Я використовував нижче метод. Трохи непрямий, але послужив моєму призначенню.

Список усіх доступних груп

Get-WmiObject -Class Win32_Group

А потім перерахуйте групи, до яких належить користувач

[System.Security.Principal.WindowsIdentity]::GetCurrent().Groups

Порівняння може бути здійснено шляхом перевірки через SIDs. Це працює для зареєстрованого користувача. Будь ласка, виправте мене, якщо я помиляюся. Зовсім новий для PowerShell, але йому довелося це зробити для виконання робочих зобов'язань.


Якщо ви перевіряєте користувача, який уже є членом групи адміністраторів, переконайтеся, що запустіть PowerShell з "Запустити як адміністратор", інакше групи не будуть вказані правильно для другої команди ... знадобилося досить багато часу, щоб визначити це ... вікна ...
Ruifeng Ma

0

З введенням користувача та фантазійним форматуванням виводу:

[CmdletBinding(SupportsShouldProcess=$True)] 
Param( 
    [Parameter(Mandatory = $True)] 
    [String]$UserName 
) 
Import-Module ActiveDirectory 
If ($UserName) { 
    $UserName = $UserName.ToUpper().Trim() 
    $Res = (Get-ADPrincipalGroupMembership $UserName | Measure-Object).Count 
    If ($Res -GT 0) { 
        Write-Output "`n" 
        Write-Output "$UserName AD Group Membership:" 
        Write-Output "===========================================================" 
        Get-ADPrincipalGroupMembership $UserName | Select-Object -Property Name, GroupScope, GroupCategory | Sort-Object -Property Name | FT -A 
    } 
}

0

Розміщуючи це тут для подальшого ознайомлення. Я в розпал міграції електронної пошти. Мені потрібно знати кожен обліковий запис користувача та його належне членство в групі, а також мені потрібно знати кожну групу та її членів.

Я використовую блок коду нижче, щоб вивести CSV для кожного учасника групи.

Get-ADUser -Filter * |`
  ForEach-Object { `
    $FileName = $_.SamAccountName + ".csv" ; `
    $FileName ; `
    Get-ADPrincipalGroupMembership $_ | `
      Select-Object -Property SamAccountName, name, GroupScope, GroupCategory | `
        Sort-Object -Property SamAccountName | `
          Export-Csv -Path $FileName -Encoding ASCII ; `
  }

Процес експорту для груп та їх відповідних членів був дещо складним, але нижче працює. Вихідні назви файлів включають тип групи. Тому групи, які мені потрібні, повинні / повинні бути універсальними та глобальними групами розповсюдження. Я повинен мати змогу просто видалити або перемістити отримані файли TXT, які мені не потрібні.

Get-ADGroup -Filter * | `
 Select-Object -Property Name, DistinguishedName, GroupScope, GroupCategory | `
  Sort-Object -Property GroupScope, GroupCategory, Name | `
   Export-Csv -Path ADGroupsNew.csv -Encoding ASCII

$MyCSV = Import-Csv -Path .\ADGroupsNew.csv -Encoding ASCII

$MyCSV | `
 ForEach-Object { `
  $FN = $_.GroupScope + ", " + $_.GroupCategory + ", " + $_.Name + ".txt" ; `
  $FN ; `
  Get-ADGroupMember -Identity $_.DistinguishedName | `
   Out-File -FilePath $FN -Encoding ASCII ; $FN=""; `
  }

0

Вивчення всіх поданих коментарів дало мені вихідну точку (спасибі за такі), але залишило у мене кілька невирішених питань. Як результат ось моя відповідь. Наданий фрагмент коду робить трохи більше, ніж просять, але він надає корисну інформацію про налагодження.

[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

Вибачте, я забув уточнити. Зробіть це спочатку: $ aduserDistinguishedName = "CN = ім'я, OU = ..." $ aduser = Get-ADUser -Identity $ aduserDistinguishedName -Properties *
ES44AC SD70MAC

0

Якщо у вас немає привілеїв консультувати інші групи членів, але ви маєте привілей консультувати членів групи, ви можете зробити наступне, щоб створити карту, користувач якої має доступ до яких груп.

$groups = get-adgroup -Filter * | sort name | select Name
$users = @{}
foreach($group in $groups) {
    $groupUsers = @()
    $groupUsers = Get-ADGroupMember -Identity $group.Name | Select-Object SamAccountName
    $groupUsers | % {
        if(!$users.ContainsKey($_.SamAccountName)){
            $users[$_.SamAccountName] = @()
        }
        ($users[$_.SamAccountName]) += ($group.Name)
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.