Come ottenere tutti i gruppi di cui un utente è membro?


135

Il Get-ADGroupMembercmdlet di PowerShell restituisce i membri di un gruppo specifico. Esiste un cmdlet o una proprietà per ottenere tutti i gruppi di cui un determinato utente è membro?


Ho corretto l'errore: Get-Memberdovrebbe essere Get-ADGroupMember.


La domanda non è chiara Puoi riformularlo o aggiungere un esempio?
Mohit Chakraborty,

1
Vedere stackoverflow.com/questions/668321/… e technet.microsoft.com/en-us/library/dd315351.aspx . Sei sicuro che Get-Member faccia quello che pensi che faccia?
tiago2014,

@Mohit Chakraborty È ora più chiaro?
Primoz,

1
velocemente puoi usare net user /domain username, controlla anche altri metodi su Ottieni gruppi di cui un utente è membro Uso di PowerShell
Mohamed

Risposte:


282

Get-ADPrincipalGroupMembership farà questo.

Get-ADPrincipalGroupMembership username | select name

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

1
Questo mi ha appena salvato dall'utilizzare il metodo più complicato e prolisso per trovarlo. Sapevo che PowerShell avrebbe avuto qualcosa del genere ma non riusciva a trovarlo da nessuna parte. +1
Tim Alexander,

7
Si noti che ciò dipende dalla disponibilità del modulo ActiveDirectory. Ciò non funzionerà necessariamente su un computer client su cui è in esecuzione uno script PowerShell o su client di livello inferiore. Se vuoi farlo, usa questa soluzione .
Daniel.S

5
Quanto sopra mi stava dando errori ("Il server non è stato in grado di elaborare la richiesta a causa di un errore interno" - presumibilmente funzionalità non disponibile sul server). get-aduser $username -Properties memberof | select -expand memberofha funzionato bene però.
JohnLBevan,

5
Se sei su una workstation Windows 10 piuttosto che su un server, installa RSAT da qui , quindi digita la import-module activedirectoryriga di comando PowerShell, quindi dovrebbe essere eseguito.
James Toomey,

3
Se il modulo non è installato: Install-Windows Funzionalità RSAT-AD-PowerShell
Preben Huybrechts

81

Linea singola, nessun modulo necessario, utilizza l'utente attualmente registrato:

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

Qudos a questo articolo vbs / powershell: http://technet.microsoft.com/en-us/library/ff730963.aspx


5
Grazie, apprezzo questa versione senza moduli. Ho semplicemente cambiato la variabile da $env:usernamea $usernamee impostato con $username = "testuser"per fare facilmente la sostituzione della variabile per le ricerche di altri utenti.
projectdp,

Sono appena tornato di nuovo su Google! Utile ancora in situazioni casuali in cui gli strumenti AD non sono disponibili.
Nathan,

43

Un'alternativa più concisa a quella pubblicata da Canoas, per ottenere l'appartenenza al gruppo per l'utente attualmente connesso.

Mi sono imbattuto in questo metodo in questo post del blog: http://www.travisrunyard.com/2013/03/26/auto-create-outlook-mapi-user-profiles/

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

Una versione ancora migliore che utilizza un regex per eliminare la guff LDAP e lascia solo i nomi dei gruppi:

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

Maggiori dettagli sull'uso dell'acceleratore di tipo [ADSISEARCHER] sono disponibili sul blog di scripting guy: http://blogs.technet.com/b/heyscriptingguy/archive/2010/08/24/use-the-powershell-adsisearcher-type -accelerator-to-ricerca-attiva-directory.aspx


1
Entrambi mi danno l'errore: Eccezione che chiama "FindOne" con argomenti "0": "Il nome account sam = filtro di ricerca non è valido."
Dallas,

Strano .... L'ho appena provato di nuovo, ma su Windows 7 in un ambiente completamente diverso, e funziona bene anche qui.
Daniel.S

Ho provato di nuovo proprio ora, sempre su Win 7, e funziona benissimo. Forse ho avuto un refuso al primo tentativo. Grazie per aver aggiunto il sostituto per eliminare la foresta "guff".
Dallas,

2
Funziona alla grande, aggiungi | Sort-Objectper renderlo ancora più leggibile.
Martin Hollingsworth,

31

Modo vecchia scuola da CMD:

net user mst999 /domain 

1
funziona anche su macchine client senza strumenti AD aggiuntivi
Rast

4
Sfortunatamente, se i nomi dei tuoi gruppi sono lunghi (ovvero> 21 caratteri), li
tronceranno

quello batte ogni altro modo! Bravo
StayCool

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

Grazie! questo ha funzionato. l'unico aspetto negativo è che il valore restituito è una stringa.
rasatura

3
| get-adgroup genererà gli oggetti del gruppo. Brillante!
8DH,

1
oppure usa $ env: USERNAME invece per afferrare il nome utente dell'utente attualmente connesso
Dave Lucre,

6

Se non riesci a far funzionare Get-ADPrincipalGroupMembership per te, potresti provare ad accedere come quell'utente, quindi utilizzare.

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

Non è necessario effettuare il login come utente se si utilizza qualcosa di simile$id = [Security.Principal.WindowsIdentity]("username")
Bitcoin Murderous Maniac

1
Questo accorcia piacevolmente al one-liner [System.Security.Principal.WindowsIdentity]::GetCurrent().Groups | % {$_.Translate([Security.Principal.NTAccount])}.
alx9r

5

Ottieni l'appartenenza al gruppo per un utente:

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

Vedi Ottieni l'appartenenza al gruppo per un utente

Ma vedi anche i comandi PowerShell gratuiti di Quest per Active Directory .

[ Modifica : il comando Get-ADPrincipalGroupMembership è incluso in Powershell dalla v2 con Windows 2008 R2. Vedi la risposta di kstrauss di seguito.]


2
In realtà c'è un modo più semplice con i cmdlet Quest: Get-QADGroup -Contains Primoz
fenster

18
Questa non è più la risposta migliore poiché Get-ADPrincipalGroupMembership è ora integrato in PowerShell
Rob Cannon,

1
Votato perché sarebbe molto meglio usare Get-ADPrincipalGroupMembership. Vorrei annullare questo voto negativo, ma non posso. Modificherò la risposta per sottolineare che l'opzione integrata esiste ora.
Abraham,

4

Get-Memberè un cmdlet per elencare i membri di un .NET object. Questo non ha nulla a che fare con l'appartenenza a utenti / gruppi. Puoi ottenere l'appartenenza al gruppo dell'utente corrente in questo modo:

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
...

Se hai bisogno di accedere a informazioni di gruppo di utenti arbitrari, il suggerimento di @tiagoinu di utilizzare i cmdlet di Quest AD è un modo migliore di procedere.


4

Innanzitutto, importa il modulo activedirectory:

import-module activedirectory

Quindi emettere questo comando:

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

Questo mostrerà i membri del gruppo specificato.


L'OP chiede il contrario. Ottieni tutti i gruppi di cui è membro un utente specificato.
8DH,

4

Non c'è bisogno di lunghi script quando si tratta di una semplice fodera ..

Comando QUEST

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

Comando MS AD

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

Trovo che il cmd di MS AD sia più veloce ma ad alcune persone piacciono quelle di Quest ..

Steve


4

Get-Member non è per ottenere l'appartenenza al gruppo dell'utente. Se si desidera ottenere un elenco di gruppi a cui appartiene un utente sul sistema locale, è possibile farlo:

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

Get-WMIObject -Query $query | Select Name

Nella query sopra, sostituire DemoUser1 con il nome utente desiderato e DomainName con il nome del computer locale o il nome del dominio.


Questa query richiede molto tempo e risponde molto lentamente quando ci sono più utenti e gruppi nell'ambiente
randeepsp

Chiunque stia modificando la risposta, assicurati di modificarla nel modo giusto. Stavo suggerendo all'OP di sostituire DemoUser1 con qualunque nome utente desiderasse. E hai completamente cambiato questo significato.
Ravikanth,

4

Uso:

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

Questo invia l'output del comando in un file CSV .


4

Questo dovrebbe fornire i dettagli per l'utente corrente. Powershell non necessario.

whoami /groups


3

È solo una riga:

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

fine di :)


Il piping a a select -expandproperty memberofrenderà l'output un po 'più leggibile / utile.
Ben giovedì

2

Ho scritto una funzione di PowerShell chiamata Get-ADPrincipalGroupMembershipRecursive. Accetta il DSN di un account utente, computer, gruppo o servizio. Recupera un elenco iniziale di gruppi dall'attributo memberOf dell'account, quindi controlla ricorsivamente le appartenenze a tali gruppi. Il codice abbreviato è di seguito. Il codice sorgente completo con commenti è disponibile qui .

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

Di seguito funziona bene:

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

Se hai un elenco di utenti:

$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 | seleziona il nome


1

Non riesco a far funzionare quanto segue per un determinato utente:

Get-ADPrincipalGroupMembership username

Ha generato un errore che non ero disposto a risolvere.

Tuttavia, ho trovato una soluzione diversa utilizzando Get-ADUser. Mi piace un po 'meglio perché se non conosci il nome dell'account, puoi ottenerlo in base a un carattere jolly sul nome effettivo dell'utente. Basta compilare PartOfUsersName e il gioco è fatto.

#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
    }

Enormi oggetti di scena per schmeckendeugler e 8DH per avermi portato a questa soluzione. +1 per entrambi.


1

Mentre ci sono molte risposte eccellenti qui, ce n'è una che cercavo personalmente che mancava. Una volta capito, pensavo di doverlo pubblicare nel caso in cui volessi trovarlo in un secondo momento, o riesca effettivamente ad aiutare qualcun altro a un certo punto:

Get-ADPrincipalGroupMembership username | Format-Table -auto

Un secondo approccio per presentare questo è quello di specificare le singole colonne che ti interessano ad esempio:

Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory

Ciò fornisce a tutti i gruppi AD a cui appartiene il nome utente, ma presenta anche tutte le proprietà predefinite di ciascun gruppo formattate come una tabella.

Il vantaggio principale che questo ti dà è che puoi vedere a colpo d'occhio quali sono le liste di distribuzione e quali sono i gruppi di sicurezza. Puoi inoltre vedere a colpo d'occhio quali sono Universal, quali DomainLocal e quali Global.
Perché dovresti preoccuparti di quest'ultima parte?

  • Il gruppo universale è un gruppo di sicurezza o distribuzione che contiene come membri utenti, gruppi e computer di qualsiasi dominio nella sua foresta. È possibile assegnare ai gruppi di sicurezza universali diritti e autorizzazioni sulle risorse in qualsiasi dominio della foresta.
  • Il gruppo globale è un gruppo che può essere utilizzato nel proprio dominio, nei server membri e nelle workstation del dominio e nei domini di fiducia. In tutte queste posizioni, è possibile assegnare a un gruppo globale diritti e autorizzazioni e il gruppo globale può diventare membro di gruppi locali. Tuttavia, un gruppo globale può contenere account utente che provengono solo dal proprio dominio.
  • Il gruppo locale di dominio è un gruppo di sicurezza o di distribuzione che può contenere gruppi universali, gruppi globali, altri gruppi locali di dominio del proprio dominio e account di qualsiasi dominio della foresta. È possibile assegnare diritti e autorizzazioni ai gruppi di sicurezza locali del dominio su risorse che risiedono solo nello stesso dominio in cui si trova il gruppo locale del dominio.

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
    }
}

Modifica il valore di -SearchBase per riflettere l'unità organizzativa di cui hai bisogno per elencare gli utenti :)

Questo elencherà tutti gli utenti in quell'unità organizzativa e ti mostrerà di quali gruppi sono membri.



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

Questo è il modo più semplice per ottenere solo i nomi:

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

Aggiungi un'istruzione select per tagliare la risposta o per ottenere tutti gli utenti di un'unità organizzativa in ogni gruppo di cui sono utenti:

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


0

Per farlo ricorsivo, puoi usare:

<# 
    .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

Quasi tutte le soluzioni di cui sopra hanno utilizzato il ActiveDirecotrymodulo che nella maggior parte dei casi potrebbe non essere disponibile per impostazione predefinita.

Ho usato il metodo seguente. Un po 'indiretto, ma è servito al mio scopo.

Elenca tutti i gruppi disponibili

Get-WmiObject -Class Win32_Group

E quindi elenca i gruppi a cui appartiene l'utente

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

Il confronto può quindi essere effettuato controllando tramite SIDs. Questo funziona per l'utente che ha effettuato l'accesso. Perfavore, correggimi se sbaglio. Completamente nuovo per PowerShell, ma è stato necessario farlo per un impegno lavorativo.


Se stai controllando un utente che è già membro del gruppo di amministratori, assicurati di avviare PowerShell tramite "Esegui come amministratore", altrimenti i gruppi non verranno elencati correttamente per il 2o comando ... ci è voluto un po 'di tempo per capire questo fuori ... windows ...
Ruifeng Ma

0

Con input dell'utente e formattazione di output sofisticata:

[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

Metterlo qui per riferimento futuro. Sono nel mezzo di una migrazione e-mail. Ho bisogno di conoscere ogni account utente e la sua appartenenza al gruppo e ho bisogno di conoscere ogni gruppo e i suoi rispettivi membri.

Sto usando il blocco di codice qui sotto per generare un CSV per l'appartenenza al gruppo di ciascun utente.

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 ; `
  }

Il processo di esportazione per i gruppi e i loro rispettivi membri è stato un po 'contorto, ma il seguito funziona. I nomi dei file di output includono il tipo di gruppo. Pertanto, i gruppi di distribuzione e-mail di cui ho bisogno sono / dovrebbero essere i gruppi di distribuzione universale e globale. Dovrei essere in grado di eliminare o spostare i file TXT risultanti che non mi servono.

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

Studiare tutti i commenti presentati mi ha dato un punto di partenza (grazie per questo) ma mi ha lasciato con diversi problemi irrisolti. Di conseguenza ecco la mia risposta. Lo snippet di codice fornito fa un po 'di più di quello che viene richiesto ma fornisce utili informazioni di debug.

[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

Scusa, ho dimenticato di chiarire. Per prima cosa: $ aduserDistinguishedName = "CN = name, OU = ..." $ aduser = Get-ADUser -Identity $ aduserDistinguishedName -Properties *
ES44AC SD70MAC

0

Quando non si dispone dei privilegi per consultare altri gruppi di membri ma si ha il privilegio di consultare i membri del gruppo, è possibile effettuare le seguenti operazioni per creare una mappa di quale utente ha accesso a quali gruppi.

$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)
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.