2017-10-09 4 views
-1

Ich erstelle einen Code zum Öffnen einer Website, wenn sich ein Benutzer in einer bestimmten AD-Gruppe befindet und wenn er mit einem bestimmten Netzwerk verbunden ist. Dies ist, was ich bisher habe:Wie komprimiere ich dieses PowerShell-Skript?

$user = $env:username 
$group1 = "examplegroup1" 
$group2 = "examplegroup2" 

if (Test-Connection "examplenetwork" -Quiet) 
{  
$members1 = Get-ADGroupMember -Identity $group1 | Select -ExpandProperty 
SamAccountName 

$members2 = Get-ADGroupMember -Identity $group2 | Select -ExpandProperty 
SamAccountName 

If ($members1 -contains $user -or $members2 -contains $user) {Start-Process 
"examplewebsite"} 
} 

Es funktioniert, wie es soll, die Website zu öffnen, wenn der Benutzer in der richtigen Gruppe ist und im Netzwerk, jedoch war ich nur fragen, ob es ein Weg zu kondensieren der Code?

Es scheint eine Verschwendung zu sein, 2 '$groups' zu erstellen und dann wiederholen Sie die Get-ADGroupMember aswell. Ich habe mit "ForEach" herumgespielt, habe es aber nicht geschafft, es zur Arbeit zu bringen.

Irgendwelche Ideen, wie dies zu kondensieren? Vorzugsweise mit dem ForEach-Cmdlet.

+2

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

+1

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

Antwort

1

zu tun Obwohl meine andere Antwort ist ‚tun das nicht‘, wenn Sie Ihren Code nicht möchten, kondensiert:

$groups = 'group1', 'group2' 

if ((Test-Connection -ComputerName "examplenetwork" -Quiet) -and 
    ($env:USERNAME -in ($groups | Get-ADGroupMember -Recursive).SamAccountName)) 
{ 
    Start-Process "www.example.com" 
} 

Sie wirklich don brauche ich nicht foreach.

+1

Danke, TessellatingHeckler. Das ist, was ich gesucht habe. Ich bin sehr neu in Powershell (wie Sie wahrscheinlich sagen können) und die Pipeline ist eine Sache, auf die ich mein Wissen erweitern muss! Wie für das AD-Problem .... Ich werde das morgen ansprechen müssen! Danke noch einmal. – Powershelln00b

-1

Sie könnten eine foreach Schleife hinzufügen, aber würde komplizieren, was bereits ein sehr kleines und einfaches Skript ist.

Die meisten, die ich zusammen die Mitgliedschaften von beiden Gruppen hinzufügen tun würde ...

$user = $env:username 
$group1 = "examplegroup1" 
$group2 = "examplegroup2" 

if (Test-Connection "examplenetwork" -Quiet) 
{  
    $members = Get-ADGroupMember -Identity $group1 | Select -ExpandProperty SamAccountName 

    $members += Get-ADGroupMember -Identity $group2 | Select -ExpandPropertySamAccountName 

    If ($members -contains $user) {Start-Process "http://www.example.com"} 
} 
+0

Dies behebt nicht die "* Es scheint eine Verschwendung zu sein, den Get-ADGroupMember *" Teil zu wiederholen, aber es ändert sich so, dass es jetzt bricht, wenn Group1 nur ein Mitglied hat. – TessellatingHeckler

0
If (("examplegroup1", "examplegroup2" | % {Get-ADGroupMember -Identity $_} | Select -ExpandProperty SamAccountName) -Contains $env:username) {Start-Process "examplewebsite"} 
+0

Das könnte den Prozess zweimal starten, wenn der Benutzer in beiden Gruppen enthalten ist. – TToni

+0

@ TToni: Nein, das '-unique' Argument sollte das verhindern – iRon

+0

Tatsächlich ist das' -unique' nicht einmal erforderlich (ich habe es aus der Antwort entfernt) als 'If ( -enthält $ env : username) {} '' wird niemals die angegebene ' 'mehr als einmal ausführen, auch wenn die' 'doppelte Member enthält. – iRon

0

würde ich es wahrscheinlich tun rückwärts:

$user = $env:username 
$groups = "examplegroup1", "examplegroup1" 

$CheckMembership = Get-ADUser -Identity $user -Property MemberOf | Select-Object -ExpandProperty MemberOf | Where-Object { $_ -in $groups } 

if ($CheckMembership) { 
    Start-Process "http://www.example.com" 
} 

Sie wollen würde zu Stellen Sie sicher, dass Ihre Liste von Gruppen eine Liste von Distinguished Names ist, aber ansonsten reduziert dies die Anzahl der AD-Abfragen auf 1.

0

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) 
Verwandte Themen