Como obter todos os grupos de que um usuário é membro?

Powershell's Get-ADGroupMember o cmdlet devolve membros de um grupo específico. Existe um cmdlet ou propriedade para obter todos os grupos de que um usuário em particular é membro?


Corrigi o meu erro.: Get-Member deve ser {[[0]}.

Author: Peter Mortensen, 2011-02-22

30 answers

A Associação Get-Adciprincipal fará isto.
Get-ADPrincipalGroupMembership username | select name

name
----
Domain Users
Domain Computers
Workstation Admins
Company Users
Company Developers
AutomatedProcessingTeam
 295
Author: kstrauss, 2013-03-22 12:14:27

Uma única linha, sem módulos necessários, usa o utilizador logado actual:

(New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($env:username)))")).FindOne().GetDirectoryEntry().memberOf
Parabéns a este artigo vbs/powershell: http://technet.microsoft.com/en-us/library/ff730963.aspx
 92
Author: Canoas, 2021-01-14 13:14:06

Uma alternativa mais concisa para a postada por Canoas,para obter membros de grupo para o usuário atualmente conectado.

Encontrei este método neste post: http://www.travisrunyard.com/2013/03/26/auto-create-outlook-mapi-user-profiles/

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

Uma versão ainda melhor que usa um regex para remover o guff LDAP e deixa apenas os nomes dos grupos:

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

Mais detalhes sobre a utilização do acelerador do tipo [ADSISEARCHER] podem ser encontrados na programação blog do guy: http://blogs.technet.com/b/heyscriptingguy/archive/2010/08/24/use-the-powershell-adsisearcher-type-accelerator-to-search-active-directory.aspx

 47
Author: Daniel.S, 2014-05-28 03:19:37

À moda antiga do CMD:

net user mst999 /domain 
 34
Author: user4511672, 2015-01-30 14:00:40
(GET-ADUSER –Identity USERNAME –Properties MemberOf | Select-Object MemberOf).MemberOf
 25
Author: schmeckendeugler, 2012-05-01 19:26:07

Se você não consegue obter-ADPrincipalGroupMembership para trabalhar para você poderia tentar login como esse usuário então usar.

$id = [Security.Principal.WindowsIdentity]::GetCurrent()
$groups = $id.Groups | foreach-object {$_.Translate([Security.Principal.NTAccount])}
$groups | select *
 10
Author: andrew pate, 2018-10-04 11:09:47

Isto deve fornecer-lhe os detalhes para o utilizador actual. Powershell não precisa.

whoami /groups

 8
Author: Nayan, 2020-05-19 16:34:54

Obter membros de grupo para um utilizador:

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

Ver Obter a adesão do grupo para um utilizador

Mas também ver os comandos PowerShell livres do Quest para o directório activo .

[editar: o comando Get-ADPrincipalGroupMembership está incluído no Powershell desde v2 com o Windows 2008 R2. Veja a resposta de kstrauss abaixo.]

 5
Author: tiago2014, 2016-08-29 22:33:51

Get-Member é um cmdlet para listar os membros de uma. Net object. Isto não tem nada a ver com a adesão do utilizador/grupo. Você pode obter a adesão do grupo do usuário atual assim:

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 você precisa de acesso a informações arbitrárias do grupo de usuários, então a sugestão @tiagoinu de usar O Quest AD cmdlets é uma maneira melhor de ir.

 4
Author: Keith Hill, 2011-02-22 14:46:30

Primeiro, importar o módulo activedirectory:

import-module activedirectory

Então emite este comando:

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

Isto irá mostrar os membros do grupo indicado.

 4
Author: Jonathan Rioux, 2012-12-14 18:25:35
Escrevi uma função PowerShell chamada Get-Adprincipalroupmembership recursive. Ele aceita o DSN de uma conta de usuário, Computador, grupo ou serviço. Ele recupera uma lista inicial de grupos a partir do memberOf attribute da conta, em seguida, verifica recursivamente as adesões desses grupos. O código abreviado está abaixo. Full código fonte com comentários pode ser encontrado aqui .
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
 4
Author: Brian Reich, 2013-12-05 21:04:42

Não há necessidade de scripts longos quando é um simples liner..

Comando QUEST

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

Comando do MS AD

(GET-ADUSER –Identity john –Properties MemberOf | Select-Object MemberOf).MemberOf
Acho que o cmd do MS AD é mais rápido, mas algumas pessoas gostam mais dos Quest..

Steve

 4
Author: Steve Adkin, 2014-11-06 11:03:58
O membro do Get - Member não é para se tornar membro do grupo do utilizador. Se quiser obter uma lista de grupos a que um utilizador pertence no sistema local, pode fazê-lo por:
$query = "ASSOCIATORS OF {Win32_Account.Name='DemoUser1',Domain='DomainName'} WHERE ResultRole=GroupComponent ResultClass=Win32_Account"

Get-WMIObject -Query $query | Select Name

Na consulta acima, substitua o DemoUser1 pelo nome de utilizador que deseja e o DomainName pelo seu nome de computador local ou nome de domínio.

 4
Author: ravikanth, 2015-03-28 10:49:00

Utilizar:

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

Isto canaliza o resultado do comando para um ficheiroCSV .

 4
Author: Dee, 2016-03-04 22:38:06

É apenas uma linha:

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

Fim de:]

 3
Author: user4931356, 2016-03-04 22:37:06

O abaixo funciona bem:

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

Se tem uma lista de utilizadores:

$list = 'administrator','testuser1','testuser2'
$list | `
    %{  
        $user = $_; 
        get-aduser $user -Properties memberof | `
        select -expand memberof | `
        %{new-object PSObject -property @{User=$user;Group=$_;}} `
    }
 2
Author: JohnLBevan, 2015-02-16 17:25:18
Embora haja muitas respostas excelentes aqui, há uma que eu estava pessoalmente procurando que estava faltando. Uma vez que eu percebi - eu pensei que eu deveria postá-lo no caso de eu quero encontrá-lo mais tarde, ou ele realmente consegue ajudar alguém em algum momento:
Get-ADPrincipalGroupMembership username | Format-Table -auto

Uma segunda abordagem para apresentar isto é especificar as colunas individuais em que está interessado, por exemplo:

Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory

Isto dá a todos os grupos de anúncios o nome de utilizador pertence - mas também apresenta todos os predefinidos as propriedades de cada grupo formatadas como uma tabela.

O principal benefício que isto lhe dá é que você pode ver de relance quais são as listas de distribuição, & quais são os grupos de segurança. Você pode ver mais adiante num olhar que são universais, que são DomainLocal & que são globais.
Porque te importarias com esta última parte?

  • O Grupo Universal é um grupo de segurança ou distribuição que contém usuários, grupos e computadores de qualquer domínio em sua floresta como membro. Podes dar direitos dos grupos de segurança universal e permissões de recursos em qualquer domínio da floresta.
  • O Grupo Global é um grupo que pode ser usado no seu próprio domínio, em servidores e estações de trabalho do domínio, e em domínios confiantes. Em todos esses locais, você pode dar a um grupo global direitos e as permissões e o Grupo global podem se tornar membros de grupos locais. No entanto, um grupo global pode conter contas de utilizador que são apenas de o seu próprio domínio.
  • O Grupo local do domínio é um grupo de segurança ou distribuição que pode conter grupos universais, grupos globais, outros grupos locais de domínio de seu próprio domínio, e relatos de qualquer domínio na floresta. Você pode dar aos grupos de segurança locais do domínio direitos e permissões em recursos que residem apenas no mesmo domínio onde o domínio local o grupo está localizado.
 2
Author: kiltannen, 2018-12-12 22:20:26

Get-QADUser-SamAccountName LoginID | % {$_.MemberOf } / Get-QADGroup | select name

 1
Author: Sathish, 2014-03-20 21:22:50
   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. 
 1
Author: Sunil Aher, 2014-07-07 12:22:52

Não consegui que o seguinte funcionasse para um utilizador em particular:

Get-ADPrincipalGroupMembership username
Lançou um erro que eu não estava disposto a resolver.

No entanto, arranjei uma solução diferente usando o Get-ADUser. Eu gosto um pouco mais porque se você não sabe o nome da conta então você pode obtê-lo baseado em um wildcard no nome real do Usuário. Basta preencher o nome de Partofusers e lá vai ele.

#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
    }
Parabéns ao schmeckendeugler e ao 8DH por me fazerem solucao. +1 para ambos.
 1
Author: Adam, 2016-06-15 21:04:42

Para o tornar recursivo, pode usar:

<# 
    .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
 1
Author: DarkLite1, 2017-02-15 14:59:36
Estudar todos os comentários apresentados deu-me um ponto de partida (obrigado por isso), mas deixou-me com várias questões por resolver. Como resultado, eis a minha resposta. O excerto de código fornecido faz um pouco mais do que o que é pedido, mas fornece informações úteis de depuração.
[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
 1
Author: ES44AC SD70MAC, 2018-11-28 20:16:23

Quando você não tem privilégios para consultar outros grupos de membros, mas você tem o privilégio de consultar os membros do grupo, você pode fazer o seguinte para construir um mapa do qual o utilizador tem acesso a quais grupos.

$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)
    }
}
 1
Author: Nadzzz, 2019-03-01 01:29:55
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
    }
}

Alterar o valor da Base de pesquisa para reflectir a OU que necessita de listar os utilizadores a partir de:)

Isto irá listar todos os utilizadores nesse OU e mostrar-lhe quais os grupos de que são membros.

 0
Author: Stephen Galvin, 2013-07-18 16:59:30

Get-ADPrincipalGroupMembership USERLOGON / select name

 0
Author: Jacob Fischlein, 2014-04-30 12:05:50

Esta é a maneira mais simples de obter os nomes:

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

Adicione uma declaração de selecção para aparar a resposta ou para obter cada utilizador num OU de cada grupo de:

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

 0
Author: Stuart, 2014-07-15 16:22:18

Quase todas as soluções acima usaram o módulo ActiveDirecotry que pode não estar disponível por padrão na maioria dos casos.

Usei o método abaixo. Um pouco indireta, mas serviu o meu propósito.

Lista todos os Grupos Disponíveis

Get-WmiObject -Class Win32_Group

E depois listar os grupos a que o utilizador pertence

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

A comparação pode então ser feita através da verificação através do SIDs. Isso funciona para o usuário logado. Por favor, corrija-me se estiver errado. Completamente novo em PowerShell, mas teve que Faz isto por um compromisso de trabalho.

 0
Author: Ruifeng Ma, 2017-03-09 17:07:57

Com a formatação de entrada e de saída:

[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
Author: coinbird, 2017-06-16 16:04:30
Colocar isto aqui para referência futura. Estou no meio de uma migração de E-mail. Preciso de conhecer cada conta de utilizador e os respectivos membros do grupo, e também preciso de conhecer cada grupo e os respectivos membros.

Estou a usar o bloco de código abaixo para emitir um CSV para cada membro do grupo de cada utilizador.

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 ; `
  }
O processo de exportação para os grupos e seus respectivos membros foi um pouco complicado, mas o abaixo funciona. Os nomes dos ficheiros de saída incluem o tipo de grupo. Portanto, os grupos de distribuição de E-mail que eu preciso São/devem ser os grupos de distribuição Universal e Global. Eu deveria ser capaz de apagar ou mover os arquivos txt resultantes que eu não preciso.
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
Author: user208145, 2018-05-19 04:37:46

Uso este simples oneliner para procurar recursivamente todos os grupos de que um utilizador é membro:

Get-ADPrincipalGroupMembership $UserName | foreach-object { Get-ADPrincipalGroupMembership $_.SamAccountName | select SamAccountName }

Para filtrar os grupos para descobrir se o utilizador é membro de um grupo específico, eu uso isto:

if ( Get-ADPrincipalGroupMembership $UserName | foreach-object { Get-ADPrincipalGroupMembership $_.SamAccountName | select SamAccountName } | where-object {$_.SamAccountName -like "*$Groupname*"} ) { write-host "Found" } else { write-host "not a member of group $Groupname" }
 0
Author: Alex Flora, 2020-10-21 09:26:06