none
Prüfen ob der eingeloggte User in einer AD-Gruppe Mitglied ist RRS feed

  • Frage

  • Hallo

    ich möchte beim Starten eines Scripts prüfen ob der angemeldete Benutzer Mitglied einer bestimmten AD-Gruppe ist, und Somit berechtigt ist das Script auszuführen


    Import-Module ActiveDirectory
    $gruppe = Get-ADGroupMember "Domain Admins" | FT Name
    
    $gruppe
    
    if ("Muster Hans" -match $gruppe)
    	{
    		"Script fortsetzen"
    	}
    	else
    	{
    		"MSG-Box und Script beenden"
    	}

     


    $gruppe sieht so aus:

     

    Name                                 
    ----                                                                                             
    Muster Hans

     

    Wenn ich es laufen lasse erschein immer die Ausgabe  "MSG-Box und Script beenden". Auch wenn ich anstatt -match -contain verwende.

    Das zweite Problem ist der Username. Wenn ich mit $env:Username den User auslese erscheint der sAMAccountName als z.B muh. Wie ändere ich den um das ich es überprüfen kann?

    Jemand einen Tipp?

     

    Gruss                                                                                                                  


    • Bearbeitet twisters77 Montag, 19. September 2011 08:33
    Montag, 19. September 2011 08:32

Antworten

  • Moin,

    da sind gleich mehrere Fehler drin:

    1. ALLES in der PowerShell ist ein Objekt. Auch die Rückgabe von format-table ist ein Objekt (genaugenommen sogar mehrere Objekte).

    Du vergleichst keinen Text, Du vergleichst Deinen "Muster Hans" mit einem Objekt. Das geht nicht.

    Teste selbst:
    $gruppe = Get-ADGroupMember "Domain Admins" | FT Name
    $gruppe | get-member

    -> KEIN String!

    2. -match ist der falsche Vergleich. -macht vergleicht mit regulären Ausdrücken, was i.d.R. nicht das erwartete Ergebnis bringt.

    Nimm stattdesse lieber "-like" oder noch besser "-ilike" und Platzhalter. -contains wäre auch möglich, aber hier schlägt der Fehler von #1 zu -> kein String zum vergleichen.

    Ich würde das sauber in einer Schleife machen:

    [code]
    Import-Module ActiveDirectory
    $gefunden = $false
    $gruppe = Get-ADGroupMember "Domain Admins"

    foreach-object {
        if ($_.SamAccountName -ilike "*muster hans*") {
            $gefunden = $true;
        }
    }

    if (!$gefunden) {
        "MSG-Box und Script beenden"
    }

    "Script fortsetzen"

    Das zweite Problem ist der Username. Wenn ich mit $env:Username den User auslese erscheint der sAMAccountName als z.B muh. Wie ändere ich den um das ich es überprüfen kann?

    Das ist doch kein Problem. Get-ADGroupMember liefert doch auch den SamAccountName zurück.

    Also eigentlich geht der Vergleich viel einfacher (und performanter) mit "-eq".

    Ach übrigens: Mit den Mitteln der PowerShell lässt sich das ganz viel eleganter lösen:

    if (Get-ADGroupMember "Domain Admins" | Where-Object {$_.SamAccountName -eq "USER" }) { "Gefunden!" }

    ;)


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    • Als Antwort markiert twisters77 Montag, 19. September 2011 12:59
    Montag, 19. September 2011 08:52
  • habs jetzt so gemacht. Das läuft soweit Problemlos.

     

    Import-Module ActiveDirectory
    
    $user = $env:Username
    
    if (Get-ADGroupMember "Domain Admins" | Where-Object {$_.SamAccountName -eq $user })
    	{ 
    	        #Script wird fortgesetzt	
    	}
    	else
    	{
    		[void] [Windows.Forms.MessageBox]::Show("Sie sind nicht Berechtigt diese Script auszuführen!", "Fehler", 
    	 		   [Windows.Forms.MessageBoxButtons]::ok, [Windows.Forms.MessageBoxIcon]::Error)
    		
    		break #Script wird beendet
    		
    	}
    Danke Robert

    • Als Antwort markiert Alex Pitulice Donnerstag, 22. September 2011 09:04
    Montag, 19. September 2011 13:04

Alle Antworten

  • Moin,

    da sind gleich mehrere Fehler drin:

    1. ALLES in der PowerShell ist ein Objekt. Auch die Rückgabe von format-table ist ein Objekt (genaugenommen sogar mehrere Objekte).

    Du vergleichst keinen Text, Du vergleichst Deinen "Muster Hans" mit einem Objekt. Das geht nicht.

    Teste selbst:
    $gruppe = Get-ADGroupMember "Domain Admins" | FT Name
    $gruppe | get-member

    -> KEIN String!

    2. -match ist der falsche Vergleich. -macht vergleicht mit regulären Ausdrücken, was i.d.R. nicht das erwartete Ergebnis bringt.

    Nimm stattdesse lieber "-like" oder noch besser "-ilike" und Platzhalter. -contains wäre auch möglich, aber hier schlägt der Fehler von #1 zu -> kein String zum vergleichen.

    Ich würde das sauber in einer Schleife machen:

    [code]
    Import-Module ActiveDirectory
    $gefunden = $false
    $gruppe = Get-ADGroupMember "Domain Admins"

    foreach-object {
        if ($_.SamAccountName -ilike "*muster hans*") {
            $gefunden = $true;
        }
    }

    if (!$gefunden) {
        "MSG-Box und Script beenden"
    }

    "Script fortsetzen"

    Das zweite Problem ist der Username. Wenn ich mit $env:Username den User auslese erscheint der sAMAccountName als z.B muh. Wie ändere ich den um das ich es überprüfen kann?

    Das ist doch kein Problem. Get-ADGroupMember liefert doch auch den SamAccountName zurück.

    Also eigentlich geht der Vergleich viel einfacher (und performanter) mit "-eq".

    Ach übrigens: Mit den Mitteln der PowerShell lässt sich das ganz viel eleganter lösen:

    if (Get-ADGroupMember "Domain Admins" | Where-Object {$_.SamAccountName -eq "USER" }) { "Gefunden!" }

    ;)


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    • Als Antwort markiert twisters77 Montag, 19. September 2011 12:59
    Montag, 19. September 2011 08:52
  • Hallo,

    So funktioniert es bei mir!

    Import-Module ActiveDirectory
    
    $Group = Get-ADGroupMember "Domain Admins" | Select-Object Name
    
    IF ( $Group -match "Max Mustermann" ) { 
    Write-Host "OK" 
    } else { 
    Write-Host "not OK" }
    
    

     


    • Bearbeitet Schlieng Montag, 19. September 2011 09:10
    Montag, 19. September 2011 09:06
  • >IF ( $Group -match "Max Mustermann" ) {
    -match bleibt trotzdem der falsche Vergleich. ;)


    Grüße aus Berlin schickt Robert
    MVP Exchange Server
    Montag, 19. September 2011 09:09
  • habs jetzt so gemacht. Das läuft soweit Problemlos.

     

    Import-Module ActiveDirectory
    
    $user = $env:Username
    
    if (Get-ADGroupMember "Domain Admins" | Where-Object {$_.SamAccountName -eq $user })
    	{ 
    	        #Script wird fortgesetzt	
    	}
    	else
    	{
    		[void] [Windows.Forms.MessageBox]::Show("Sie sind nicht Berechtigt diese Script auszuführen!", "Fehler", 
    	 		   [Windows.Forms.MessageBoxButtons]::ok, [Windows.Forms.MessageBoxIcon]::Error)
    		
    		break #Script wird beendet
    		
    	}
    Danke Robert

    • Als Antwort markiert Alex Pitulice Donnerstag, 22. September 2011 09:04
    Montag, 19. September 2011 13:04