Powershell’s Get-ADGroupMember
cmdlet 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-Member
zou 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-Member
is 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-PowerShell
en/of import-module activedirectory
dan 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 ActiveDirecotry
Module 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=""; `
}