Alles, was verlässt sich auf Get-AD___
benötigt die RSAT-Tools, um das ActiveDirectory-Modul zu erhalten, das ist eine unwahrscheinliche Annahme für Endbenutzer-Workstations wie @Rohin Sidharth Kommentare.
@James C. Die derzeit akzeptierte Antwort behandelt keine rekursive Gruppenmitgliedschaft (würde den Parameter -Recursive
benötigen), beinhaltet aber auch die Auflistung aller Mitglieder beider Gruppen - stellen Sie sich vor, wenn das eine Milliarde Mitglieder für jede Gruppe ist - und es hat die schlechte Angewohnheit der Array-Zugabe.
@Bacon Bits Antwort erhält die Gruppenmitgliedschaft des Benutzers, die besser ist für "weniger Daten erhalten", aber immer noch nicht rekursive Gruppenmitgliedschaft und immer noch auf das ActiveDirectory-Modul.
Um RSAT zu vermeiden, könnte etwas wie ADSI verwendet werden - das von System.DirectoryServices.AccountManagement umschlossen wird. Diskutiert here von Richard Siddaway.
, das eine nette Methode die Gruppenmitglieder für einen Benutzer zur Liste hat, die gebrochen zu sein scheint - Einklemmen von Terry Tsay der C# Antwort auf eine ähnliche Frage here, ich Port seinen Code zu diesem, aber ich habe auf dem aktuellen fokussiert Benutzer und eingeschlossene Verteilergruppen standardmäßig:
Add-Type -AssemblyName System.DirectoryServices.AccountManagement
Function IsUserInGroup([string] $groupName)
{
# Remove DOMAIN\ from the start of the groupName.
$groupName = $groupName -replace '^.*\\'
# Get an AD context for the current user's domain
$context = New-Object -TypeName System.DirectoryServices.AccountManagement.PrincipalContext -ArgumentList 'Domain', $ENV:USERDOMAIN
# Find the current user account in AD, and refresh the security and distribution groups
$user = [System.DirectoryServices.AccountManagement.UserPrincipal]::FindByIdentity($context, 'SAMAccountName', $env:USERNAME)
$userEntry = [System.DirectoryServices.DirectoryEntry] $user.GetUnderlyingObject()
$userEntry.RefreshCache(@('tokenGroupsGlobalAndUniversal'))
# Get all the security and distribution groups the user belongs to, including nested memberships
$usersGroupSIDs = foreach ($sid in $userEntry.Properties.tokenGroupsGlobalAndUniversal.Value)
{
New-Object System.Security.Principal.SecurityIdentifier -ArgumentList $sid, 0
}
# Get the AD details for the group to test, and test membership
$group = [System.DirectoryServices.AccountManagement.GroupPrincipal]::FindByIdentity($context, 'SamAccountName', $groupName)
$usersGroupSIDs.Contains($group.Sid)
}
z
PS C:\> IsUserInGroup 'parent-nested-group-here'
True
Welche nicht kondensiert oder einfacher, aber es sollte Overhead insbesondere als Mitglied Anzahl der Gruppen zunimmt, und weniger Bedarf an zusätzlichen Modulen, nur das .NET Framework Bedingungen mit weniger AD Anschluss behandeln.
Dann könnten Sie ändern, dass
$group2 = [System.DirectoryServices.AccountManagement.GroupPrincipal]::FindByIdentity($context, 'SamAccountName', $group2Name)
$usersGroupSIDs.Contains($group.Sid) -or $usersGroupSIDs.Contains($group2.Sid)
Ich stimme für das Schließen dieser Frage als Off-Topic ab, weil der Arbeitscode nicht im Thema ist, und die SE-Site zum Überprüfen/Vorschlagen von Änderungen am Arbeitscode ist https://codereview.stackexchange.com/ – TessellatingHeckler
Sie gehen auch davon aus dass auf dem Computer des Endbenutzers ein AD-Modul installiert ist. Wenn Sie es als Anmeldeskript entwerfen, werden Sie auf dieses Problem stoßen. –