Hoe alle groepen te krijgen waarvoor een gebruiker lid is?

Powershell’s Get-ADGroupMembercmdlet retourneert leden van een specifiek groep. Is er een cmdlet of een eigenschap om alle groepen te krijgen waarvoor een bepaalde gebruiker lid is?


Ik heb mijn fout opgelost: Get-Memberzou moeten zijn Get-ADGroupMember.


Antwoord 1, Autoriteit 100%

Get-adprincipalgroupmeembershipe zal dit doen.

Get-ADPrincipalGroupMembership username | select name
name
----
Domain Users
Domain Computers
Workstation Admins
Company Users
Company Developers
AutomatedProcessingTeam

Antwoord 2, Autoriteit 32%

Enkele regel, geen modules nodig, gebruikt de huidige ingelogde gebruiker:

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

Kudos naar dit VBS / Powershell-artikel: http://technet.microsoft. COM / EN-US / Library / FF730963.aspx


Antwoord 3, Autoriteit 16%

Een meer beknopt alternatief voor degene die door CanoA’s is geplaatst, om een ​​groepslidmaatschap te krijgen voor de momenteel ingelogde gebruiker.

Ik kwam deze methode tegen in deze blog post: http: //www.travisrunyard.com/2013/03/26/Auto-create-outlook-mapi-user-profiles/

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

Een nog betere versie die een regex gebruikt om de LDAP-guff te verwijderen en alleen de groepsnamen laat:

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

Meer details over het gebruik van de [ADSISEARCHER]-type accelerator zijn te vinden op de blog van scripting guy: http://blogs.technet.com/b/heyscriptingguy/archive/2010/08/24/use-the-powershell- adsisearcher-type-accelerator-to-search-active-directory.aspx


Antwoord 4, autoriteit 12%

Ouderwetse manier van CMD:

net user mst999 /domain 

Antwoord 5, autoriteit 9%

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

Antwoord 6, autoriteit 3%

Als u Get-ADPrincipalGroupMembership niet kunt laten werken, kunt u proberen in te loggen als die gebruiker en vervolgens gebruiken.

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

Antwoord 7, autoriteit 3%

Dit zou u de details van de huidige gebruiker moeten geven. Powershell niet nodig.

whoami /groups


Antwoord 8, autoriteit 2%

Get-lid is niet voor het behalen van het lidmaatschap van de gebruiker. Als u een lijst met groepen wilt ontvangen, behoort een gebruiker van op het lokale systeem, kunt u dit doen op:

$query = "ASSOCIATORS OF {Win32_Account.Name='DemoUser1',Domain='DomainName'} WHERE ResultRole=GroupComponent ResultClass=Win32_Account"
Get-WMIObject -Query $query | Select Name

In de bovenstaande query, vervang Demousen1 door de gewenste gebruikersnaam en de domeinnaam met uw lokale computernaam of domeinnaam.


Antwoord 9, Autoriteit 2%

Get groepslidmaatschap voor een gebruiker:

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

Zie Get Group Lidmaatschap voor een gebruiker

Maar zie ook Quest’s gratis Powershell-opdrachten voor Active Directory .

[Bewerken : Get-adprincipalgroupmeembership opdracht is inbegrepen in Powershell sinds v2 met Windows 2008 R2. Zie het antwoord van Kstrauss hieronder.]


Antwoord 10

Get-Memberis een CMDLet voor het vermelden van de leden van een .NET object. Dit heeft niets te maken met het lidmaatschap van de gebruiker / groep. U kunt het huidige lidmaatschap van de huidige gebruiker als SO krijgen:

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

Als je toegang nodig hebt tot de groepsinformatie van willekeurige gebruikers, dan is de suggestie van @tiagoinu om de Quest AD-cmdlets te gebruiken een betere manier om te gaan.


Antwoord 11

Ik heb een PowerShell-functie geschreven met de naam Get-ADPrincipalGroupMembershipRecursive. Het accepteert de DSN van een gebruiker, computer, groep of serviceaccount. Het haalt een eerste lijst met groepen op uit het memberOf-attribuut van het account en controleert vervolgens recursief de lidmaatschappen van die groep. De verkorte code staat hieronder. De volledige broncode met opmerkingen vindt u hier.

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

Antwoord 12

Geen lange scripts nodig als het een simpele oneliner is..

QUEST-opdracht

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

MS AD-opdracht

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

Ik vind dat de MS AD cmd sneller is, maar sommige mensen vinden de Quest beter..

Steve


Antwoord 13

Gebruik:

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

Hiermee wordt de uitvoer van de opdracht naar een CSV-bestand geleid.


Antwoord 14

Importeer eerst de ActiveDirectory-module:

Import-Module ActiveDirectory

Geef vervolgens dit commando:

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

Hiermee worden de leden van de opgegeven groep weergegeven.


Antwoord 15

Het is maar één regel:

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

einde van 🙂


Antwoord 16

Het onderstaande werkt goed:

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

Als u een lijst met gebruikers heeft:

$list = 'administrator','testuser1','testuser2'
$list | `
    %{  
        $user = $_; 
        get-aduser $user -Properties memberof | `
        select -expand memberof | `
        %{new-object PSObject -property @{User=$user;Group=$_;}} `
    }

Antwoord 17

Hoewel er hier veel uitstekende antwoorden zijn, was er één waarnaar ik persoonlijk op zoek was en die ontbrak. Toen ik er eenmaal achter was – ik dacht dat ik het moest posten voor het geval ik het later wil vinden, of het op een gegeven moment iemand anders kan helpen:

Get-ADPrincipalGroupMembership username | Format-Table -auto

Een tweede manier om dit te presenteren is om de afzonderlijke kolommen waarin u geïnteresseerd bent te specificeren, bijvoorbeeld:

Get-ADPrincipalGroupMembership username | select name, GroupScope, GroupCategory

Dit geeft alle AD-groepen waartoe de gebruikersnaam behoort, maar presenteert ook alle standaardeigenschappen van elke groep netjes opgemaakt als een tabel.

Het belangrijkste voordeel dat dit u oplevert, is dat u in één oogopslag kunt zien welke distributielijsten & die beveiligingsgroepen zijn. U kunt verder in één oogopslag zien welke Universal zijn, welke DomainLocal & die wereldwijd zijn.
Waarom zou je om dit laatste geven?

  • Universele groep is een beveiligings- of distributiegroep die:
    gebruikers, groepen en computers van elk domein in het forest als
    leden. U kunt universele beveiligingsgroepen rechten geven en
    machtigingen voor resources in elk domein in het forest.
  • Globale groep is een groep die kan worden gebruikt in zijn eigen domein, in lid
    servers en in werkstations van het domein, en in vertrouwende domeinen.
    Op al die locaties kun je een wereldwijde groep rechten geven en
    machtigingen en de globale groep kan lid worden van lokale groepen.
    Een globale groep kan echter gebruikersaccounts bevatten die alleen afkomstig zijn van
    zijn eigen domein.
  • Domein lokale groep is een beveiligings- of distributiegroep die kan
    universele groepen, globale groepen, andere lokale domeingroepen bevatten
    van zijn eigen domein en accounts van elk domein in het forest. Jij
    kan domein lokale beveiligingsgroepen rechten en machtigingen geven op
    bronnen die zich alleen in hetzelfde domein bevinden als het lokale domein
    groep zich bevindt.

Antwoord 18

Get-QADUser -SamAccountName LoginID | % {$_.MemberOf } | Get-QADGroup | selecteer naam


Antwoord 19

  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. 

Antwoord 20

Ik kreeg het volgende niet werkend voor een bepaalde gebruiker:

Get-ADPrincipalGroupMembership username

Er is een fout opgetreden die ik niet wilde oplossen.

Ik heb echter een andere oplossing bedacht met Get-ADUser. Ik vind het een beetje beter, want als je de accountnaam niet weet, kun je deze krijgen op basis van een jokerteken op de werkelijke naam van de gebruiker. Vul gewoon PartOfUsersNamein en klaar.

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

Enorme rekwisieten voor Schmeckendeugler en 8dh om me naar deze oplossing te brengen. +1 aan jullie beiden.


Antwoord 21

Om het recursief te krijgen, kunt u gebruiken:

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

Antwoord 22

het bestuderen van alle gepresenteerde opmerkingen gaf me een startpunt (bedankt voor die) maar liet me met verschillende onopgeloste problemen. Als resultaat hier is mijn antwoord. Het aangeboden code Fragment heeft iets meer dan wat wordt gevraagd, maar het biedt nuttige foutopsporing in.

[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

Antwoord 23

Als je geen rechten hebt om andere ledengroepen te raadplegen, maar wel het recht om groepsleden te raadplegen, kun je het volgende doen om een kaart te maken van welke gebruiker toegang heeft tot welke groepen.

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

Antwoord 24

Voor LOKALE gebruikers en groepen (dwz niet in Active Directory), en als u RSAT niet wilt, of niet mag of niet kunt installeren en/of Install-WindowsFeature RSAT-AD-PowerShellen/of import-module activedirectorydan is hier een pure, vooraf geïnstalleerde powershell (5.1+) manier om dit te doen.

(Opmerking: Get-LocalGroup*die hieronder wordt gebruikt, is alleen beschikbaar in Powershell v5.1 en hoger. “…v5.1 is uitgebracht samen met de Windows 10-jubileumupdate op 2 augustus 2016 , en in Windows Server 2016. …[F]of Windows 7, Windows Server 2008, Windows Server 2008 R2, Windows Server 2012 en Windows Server 2012 R2 [it] werd uitgebracht op 19 januari 2017.” (wikipedia))

$username = "user002"
Get-LocalGroup | ForEach-Object {
    # the usernames are returned in the string form "computername\username"
    if (Get-LocalGroupMember -Group $_ | Where-Object name -like "*\$username") {
        $_.name
    } 
}

Voorbeelduitvoer:

Administrators
Users

Antwoord 25

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

Wijzig de waarde van -Searchbase om de ou te weerspiegelen die u nodig hebt om de gebruikers te vermelden van:)

Hiermee vermeldt u alle gebruikers in die ou en laat u zien welke groepen waar ze lid zijn van.


Antwoord 26

Get-adprincipalgroupmembership userlogon | Selecteer Naam


Antwoord 27

Dit is de eenvoudigste manier om de namen te krijgen:

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

Voeg een bepaalde verklaring toe om het antwoord in te korten of om elke gebruiker in een OU elke groep te krijgen die ze zijn van:

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


Antwoord 28

Bijna alle bovenstaande oplossingen gebruikten de ActiveDirecotryModule die in de meeste gevallen mogelijk niet standaard beschikbaar is.

Ik heb onderstaande methode gebruikt. Een beetje indirect, maar diende mijn doel.

Lijst alle beschikbare groepen

Get-WmiObject -Class Win32_Group

En vermeld dan de groepen waartoe de gebruiker behoort

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

Vergelijking kan dan worden gedaan door te controleren via de SIDs. Dit werkt voor de ingelogde gebruiker. Verbeter mij alsjeblieft als ik het fout heb. Volledig nieuw voor PowerShell, maar moest dit gedaan krijgen voor een werkverplichting.


Antwoord 29

Met gebruikersinvoer en fraaie uitvoeropmaak:

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

Antwoord 30

Ik plaats dit hier voor toekomstig gebruik. Ik zit midden in een e-mailmigratie. Ik moet elk gebruikersaccount en het respectieve groepslidmaatschap kennen, en ik moet ook elke groep en zijn respectieve leden kennen.

Ik gebruik het onderstaande codeblok om een CSV uit te voeren voor het groepslidmaatschap van elke gebruiker.

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

Het exportproces voor de groepen en hun respectievelijke leden was een beetje ingewikkeld, maar het onderstaande werkt. De uitvoerbestandsnamen bevatten het type groep. Daarom zijn de e-maildistributiegroepen die ik nodig heb de Universal en Global Distribution-groepen. Ik zou de resulterende TXT-bestanden die ik niet nodig heb gewoon kunnen verwijderen of verplaatsen.

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

Other episodes