none
Powershell AD-Abfrage wird erst beim dritten Versuch richtig ausgeführt RRS feed

  • Frage

  • Hallo

    Ich habe ein Script erstellt, welches mir Benutzer anzeigt die in einer Speziellen Gruppe nicht vorhanden sind. inkl Auswahlmenü.

    # Auswahlmenü erstellen.
    function Show-Menu
    {
         param (
               [string]$Title = 'Menu'
         )
         cls
         Write-Host "================ $Title ================"
        
         Write-Host "1: Alle Firmen."
         Write-Host "2: Eine Firma"
         Write-Host "Q: Beenden mit 'Q'."
    }
    
    do
    
    # Auswahl Abfrage 
    {
         Show-Menu
         $input = Read-Host "Bitte Auswählen"
         switch ($input)
         {
    # Alle Klinken OUs werden abgefragt, falls es eine neu OU geben sollte muss die hier eingetragen werden.
               '1' {
                    cls
                    $OU =
                    "OU=Firma,DC=test,DC=local",
                    "OU=Firma2,DC=test,DC=local",
                    "OU=Firma3,DC=test,DC=local"
                    
    
    # Alle Mitglieder der Gruppe Grupp1 werden ausgelesen
    
                    $Members = (Get-ADGroup 'Grupp1' -Properties member).member
    
    # Alle Mitglieder der OUs, siehe oben, werden ausgelesen.
    
                    $Users = $OU | ForEach-Object {Get-ADUser -SearchBase $PSItem -Filter * }  
    
    # Die Gruppe Members und Users werden verglichen und die Benutzer die nicht in der Grupp1 sind werden angezeigt.
    
                    Compare-Object -ReferenceObject $Users -DifferenceObject $Members  | Where-Object {$_.SideIndicator -eq '<='} 
    
    # Explisziet Abfrage auf eine Klinik bzw. OU
    
               } '2' {
                    cls
                    $OU = Read-Host -Prompt "Bitte OU eingeben. z.b Firma, Firma2, Firma3,."
    
                    $Members = (Get-ADGroup 'Grupp1' -Properties member).member
                    $Users = Get-ADUser -Filter *  -SearchBase "OU=$OU,DC=test,DC=local" 
                    Compare-Object -ReferenceObject $Users -DifferenceObject $Members  | Where-Object {$_.SideIndicator -eq '<='} 
            
               } 'q' {
                    return
               }
         }


    Direkt auf den AD Server funktioniert das Script auch einwandfrei.

    Wenn ich aber das Script als Admin in unserer Citrix Umgebung ausführe, habe ich folgendes verhalten.

    1) Das Abfragemenu kommt.

    2) Ich wähle z.B Punkt 2 aus.

    3) Gebe z.B Firma ein.

    4) Es wird kein Ergebnis angezeigt 

    5) Es erscheint "Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...:"  --> mach ich dann und das Menü erscheint        auch wieder.

    6) Ich wähle nochmals Punkt 2 aus.

    7) Gebe nochmals Firma ein.

    8) Das Ergebnis wird jetzt doppelt angezeigt.  z.B:

       CN=User1,OU=Firma,DC=test,DC=local

       CN=User1,OU=Firma,DC=test,DC=local

    9) Es erscheint "Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...:" 

    10) Ich wähle nochmals Punkt 2 aus.

    11) Gebe nochmals Firma ein.

    12) Ergebnis wird Richtig angezeigt.

         CN=User1,OU=Firma,DC=test,DC=local

    Hat wer einen Idee, warum das so ist ? Ich komme nicht dahinter.

    Danke

    Andi-Willi





    Dienstag, 5. November 2019 12:22

Antworten

  • Hallo,

    du schreibst das dein Code auf dem Domain Controller funktioniert, sich in der Citrix Umgebung aber merkwürdig verhält, du schreibst aber nicht um wie viele Objekte es geht usw. Aus der Ferne vermute ich mal dass da irgendwas verloren geht. Ich habe im Moment kein Zugriff auf ein AD um näher zu testen.

    In deiner Variablen $Members müssten die Gruppenmitglieder stehen in Form von ihren DistinguishedNames. Die Objekte in $Users enthalten unter anderem auch das Attribut DistinguishedName, aber auch ein paar mehr, die du für den Vergleich nicht brauchst, deshalb könntest Du die User Objekte auf den DistinguishedName beschränken.

    $Users = (Get-ADUser -Filter *  -SearchBase "OU=$OU,DC=test,DC=local").DistinguishedName

    Dann ist die zu vergleichende Datenmenge schon mal kleiner, vielleicht hilft es.

    Eine andere Idee ist es deinen Code mit 

    Invoke-Command -ComputerName DEINDC -ScriptBlock  {DEIN CODE}

    aus der Citrix Umgebung direkt auf dem DC auszuführen. Je nachdem brauchst Du beim Invoke auch noch den -Credential Parameter.

    Beste Gruesse
    brima

    Freitag, 8. November 2019 18:48

Alle Antworten

  • Hallo,

    dein Code ist schon mal nicht vollständig, die DO - Schleife ist nicht vollständig, die schließende geschweifte Klammer wie auch die Bedingung der Schleife fehlen.

    Beste Grüße 
    brima

    Dienstag, 5. November 2019 17:58
  • Hi,

    Mein Fehler hab die Zeilen beim kopieren vergessen.

    # Auswahlmenü erstellen.
    function Show-Menu
    {
         param (
               [string]$Title = 'Menu'
         )
         cls
         Write-Host "================ $Title ================"
        
         Write-Host "1: Alle Firmen."
         Write-Host "2: Eine Firma"
         Write-Host "Q: Beenden mit 'Q'."
    }
    
    do
    
    # Auswahl Abfrage 
    {
         Show-Menu
         $input = Read-Host "Bitte Auswählen"
         switch ($input)
         {
    # Alle Klinken OUs werden abgefragt, falls es eine neu OU geben sollte muss die hier eingetragen werden.
               '1' {
                    cls
                    $OU =
                    "OU=Firma,DC=test,DC=local",
                    "OU=Firma2,DC=test,DC=local",
                    "OU=Firma3,DC=test,DC=local"
                    
    
    # Alle Mitglieder der Gruppe Grupp1 werden ausgelesen
    
                    $Members = (Get-ADGroup 'Grupp1' -Properties member).member
    
    # Alle Mitglieder der OUs, siehe oben, werden ausgelesen.
    
                    $Users = $OU | ForEach-Object {Get-ADUser -SearchBase $PSItem -Filter * }  
    
    # Die Gruppe Members und Users werden verglichen und die Benutzer die nicht in der Grupp1 sind werden angezeigt.
    
                    Compare-Object -ReferenceObject $Users -DifferenceObject $Members  | Where-Object {$_.SideIndicator -eq '<='} 
    
    # Explisziet Abfrage auf eine Klinik bzw. OU
    
               } '2' {
                    cls
                    $OU = Read-Host -Prompt "Bitte OU eingeben. z.b Firma, Firma2, Firma3,."
    
                    $Members = (Get-ADGroup 'Grupp1' -Properties member).member
                    $Users = Get-ADUser -Filter *  -SearchBase "OU=$OU,DC=test,DC=local" 
                    Compare-Object -ReferenceObject $Users -DifferenceObject $Members  | Where-Object {$_.SideIndicator -eq '<='} 
            
               } 'q' {
                    return
               }
         }
         pause
    }
    until ($input -eq 'q')


    Freitag, 8. November 2019 09:38
  • Hallo,

    du schreibst das dein Code auf dem Domain Controller funktioniert, sich in der Citrix Umgebung aber merkwürdig verhält, du schreibst aber nicht um wie viele Objekte es geht usw. Aus der Ferne vermute ich mal dass da irgendwas verloren geht. Ich habe im Moment kein Zugriff auf ein AD um näher zu testen.

    In deiner Variablen $Members müssten die Gruppenmitglieder stehen in Form von ihren DistinguishedNames. Die Objekte in $Users enthalten unter anderem auch das Attribut DistinguishedName, aber auch ein paar mehr, die du für den Vergleich nicht brauchst, deshalb könntest Du die User Objekte auf den DistinguishedName beschränken.

    $Users = (Get-ADUser -Filter *  -SearchBase "OU=$OU,DC=test,DC=local").DistinguishedName

    Dann ist die zu vergleichende Datenmenge schon mal kleiner, vielleicht hilft es.

    Eine andere Idee ist es deinen Code mit 

    Invoke-Command -ComputerName DEINDC -ScriptBlock  {DEIN CODE}

    aus der Citrix Umgebung direkt auf dem DC auszuführen. Je nachdem brauchst Du beim Invoke auch noch den -Credential Parameter.

    Beste Gruesse
    brima

    Freitag, 8. November 2019 18:48