none
Windows Powershell Script Probleme mit "import-csv" und "foreach"

    คำถาม

  • Windows Powershell Script Probleme mit "import-csv" und "foreach"

    Hallo Leute,

    Ich wäre euch sehr verbunden wenn ihr mir weiter helft und zwar geht es um einen script an dem ich gerade arbeite probleme habe ich mit dem teil wo die csv importiert wird ier der auszug:

    Import-Csv -Path C:\temp\ps\Scripts\PSscript\Data\pa_test_run.csv | Select-Object GROUP,OU | foreach -Process {

    $checkg = [ADSI]::Exists('LDAP://CN=GROUP,OU=D,OU=KL,OU=Users,OU=Gruppen,OU=OU,DC=kl,DC=int')

    if ($checkg -eq $false)
        {
         #creating new group
         Write-Host "worked"
         #New-QADGroup -Name GROUP -DisplayName GROUP -Description GROUP -GroupScope Global -GroupType Security -ParentContainer ('OU=KL-Group,OU=D,OU=KL,OU=Users,OU=Gruppen,OU=OU,DC=kl,DC=int')
        }
    else
        {
         #continueing if group allready exists
         Write-Host "false"
         Write-Error -Message "wrong"
         #continue
        }
    }

    Der Script soll mit dieser csv:

    OU                                     GROUPDESCRIPTION                       GROUPNAME                              USER                                 
    --                                     ----------------                       ---------                              ----                                 
    fs01                                   /fs01/Sparte-F/F ALLE                  ACF-KL-F_F ALLE-W                      HegedisT                             
    fs01                                   /fs01/Sparte-F/F ALLE                  ACF-KL-F_F ALLE-W                      Jahnke                               
    fs01                                   /fs01/Sparte-F/F ALLE                  ACF-KL-F_F ALLE-W                      MeyerU                               
    fs01                                   /fs01/Sparte-F/F ALLE                  ACF-KL-F_F ALLE-W                      Praktikant1                          
    fs01                                   /fs01/Sparte-F/F ALLE                  ACF-KL-F_F ALLE-W                      sys_mfp_printer                      
    fs01                                   /fs01/Sparte-F/F ALLE/$ Archiv/Umst... ACF-KL-F_F ALLE_$ Archiv_Umstellung... HaasC

    jeweils eine AD DS Gruppe erstellen die gruppendescription einfügen und das ganze in der genanten OU.

    Mein Problem ist das ich es nicht hinbekomme die GROUP und die OU in dem AD DS Part zu verwenden d.h. das hier:

    $checkg = [ADSI]::Exists('LDAP://CN=GROUP,OU=D,OU=KL,OU=Users,OU=Gruppen,OU=OU,DC=kl,DC=int')

    die GRUPPE und die OU eingefügt werden die in der CSV stehen und das selbe in dem Teil darunter usw.

    Weiß jemand wie ich die Daten die ich benötige in den Script bekomme?

    Danke schon einmal im vorraus

    10 พฤษภาคม 2556 6:46

คำตอบ

  • Brima hat recht mit der Punkt Notation!

    Und

    Select-Object ist nicht Nötig!

    # Import-CSV Produziert für jede Zeile ein Objekt
    # Das Nutzen von Select-Objekt ist hier NICHT nötig!
    Import-Csv -Path C:\temp\ps\Scripts\PSscript\Data\pa_test_run.csv | Foreach-Object {
    
            # Das Aktuelle CSV Objekt wird mit $_ angesprochen
        
            # GROUPNAME  des Aktuellen Objektes benutzen
            # Doppelten anführungszeichen müssen dazu genutzt werden! (Expandieren von Variablen in einem String)
            # Ich vermute hier willst du auch die OU benutzen !?
            $checkg = [ADSI]::Exists("LDAP://CN=($_.GROUPNAME),OU=$($_.OU),OU=KL,OU=Users,OU=Gruppen,OU=OU,DC=kl,DC=int")
            
            if ($checkg -eq $false)
                {
                 #creating new group
                 Write-Host "worked"
                 # Ich vermute hier willst du auch die OU benutzen !?
                 New-QADGroup -Name $_.GROUPNAME -DisplayName $_.GROUPNAME -Description $_.GROUPDESCRIPTION -GroupScope Global -GroupType Security -ParentContainer "OU=KL-Group,OU=$($_.OU),OU=KL,OU=Users,OU=Gruppen,OU=OU,DC=kl,DC=int" -Whatif
                }
            else
                {
                 #continueing if group allready exists
                 Write-Host "false"
                 Write-Error -Message "wrong"
                 #continue
                }
    }


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    • แก้ไขโดย Peter Kriegel 10 พฤษภาคม 2556 8:03
    • ทำเครื่องหมายเป็นคำตอบโดย Domeniccc 10 พฤษภาคม 2556 8:11
    • ยกเลิกการทำเครื่องหมายเป็นคำตอบโดย Domeniccc 10 พฤษภาคม 2556 8:11
    • ทำเครื่องหมายเป็นคำตอบโดย Domeniccc 10 พฤษภาคม 2556 8:11
    • ยกเลิกการทำเครื่องหมายเป็นคำตอบโดย Domeniccc 10 พฤษภาคม 2556 8:32
    • ทำเครื่องหมายเป็นคำตอบโดย Domeniccc 10 พฤษภาคม 2556 8:42
    10 พฤษภาคม 2556 8:02

ตอบทั้งหมด

  • Hallo,

    in der ForEach Schleife kannst Du deine mit Select-Object gewaehlten Objekte nicht dirket mit ihrem Namen ansprechen, sondern du musst ein $_. davorsetzen, also z.B.: anstelle von Group $_.Group

    Beste Gruesse
    brima

    10 พฤษภาคม 2556 7:29
  • Brima hat recht mit der Punkt Notation!

    Und

    Select-Object ist nicht Nötig!

    # Import-CSV Produziert für jede Zeile ein Objekt
    # Das Nutzen von Select-Objekt ist hier NICHT nötig!
    Import-Csv -Path C:\temp\ps\Scripts\PSscript\Data\pa_test_run.csv | Foreach-Object {
    
            # Das Aktuelle CSV Objekt wird mit $_ angesprochen
        
            # GROUPNAME  des Aktuellen Objektes benutzen
            # Doppelten anführungszeichen müssen dazu genutzt werden! (Expandieren von Variablen in einem String)
            # Ich vermute hier willst du auch die OU benutzen !?
            $checkg = [ADSI]::Exists("LDAP://CN=($_.GROUPNAME),OU=$($_.OU),OU=KL,OU=Users,OU=Gruppen,OU=OU,DC=kl,DC=int")
            
            if ($checkg -eq $false)
                {
                 #creating new group
                 Write-Host "worked"
                 # Ich vermute hier willst du auch die OU benutzen !?
                 New-QADGroup -Name $_.GROUPNAME -DisplayName $_.GROUPNAME -Description $_.GROUPDESCRIPTION -GroupScope Global -GroupType Security -ParentContainer "OU=KL-Group,OU=$($_.OU),OU=KL,OU=Users,OU=Gruppen,OU=OU,DC=kl,DC=int" -Whatif
                }
            else
                {
                 #continueing if group allready exists
                 Write-Host "false"
                 Write-Error -Message "wrong"
                 #continue
                }
    }


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    • แก้ไขโดย Peter Kriegel 10 พฤษภาคม 2556 8:03
    • ทำเครื่องหมายเป็นคำตอบโดย Domeniccc 10 พฤษภาคม 2556 8:11
    • ยกเลิกการทำเครื่องหมายเป็นคำตอบโดย Domeniccc 10 พฤษภาคม 2556 8:11
    • ทำเครื่องหมายเป็นคำตอบโดย Domeniccc 10 พฤษภาคม 2556 8:11
    • ยกเลิกการทำเครื่องหมายเป็นคำตอบโดย Domeniccc 10 พฤษภาคม 2556 8:32
    • ทำเครื่องหมายเป็นคำตอบโดย Domeniccc 10 พฤษภาคม 2556 8:42
    10 พฤษภาคม 2556 8:02
  • Also danke schonmal für die schnellen Antworten,

    nun bekomme ich allerdings beim ausführen folgende Fehlermeldung..

    worked
    New-QADGroup : Cannot resolve directory
    object for the given identity:
    'OU=KL-Group,OU=D,OU=KL,OU=Users,OU=Gruppen,OU=(@{OU=fs01;

    GROUPDESCRIPTION=/fs01/S
    parte-F/F ALLE; GROUPNAME=ACF-KL-F_F ALLE-W; USER=HegedisT}.OU),DC=kl,DC=int'.
    Bei C:\temp\ps\Scripts\PSscript\Script_modules\csv_Foreach.ps1:16 Zeichen:26
    +             
    New-QADGroup <<<<  -Name $_.GROUPNAME -DisplayName
    $_.GROUPNAME -Description $_.GROUPDESCRIPTION -GroupScope Global
    -GroupType Security -Pa

    rentContainer "OU=KL-Group,OU=D,OU=KL,OU=Users,OU=Gruppen,OU=($_.OU),DC=kl,DC=int"
        + CategoryInfo          : NotSpecified: (:) [New-QADGroup], ObjectNotFoundException
       
    + FullyQualifiedErrorId :
    Quest.ActiveRoles.ArsPowerShellSnapIn.DirectoryAccess.ObjectNotFoundException,Quest.ActiveRoles.ArsPowerShellSnapIn.Powersh

       ell.Cmdlets.NewGroupCmdlet

    Ausnahme beim Aufrufen von "Exists" mit 1 Argument(en):  "Unknown error (0x80005000)"
    Bei C:\temp\ps\Scripts\PSscript\Script_modules\csv_Foreach.ps1:9 Zeichen:33
    +        
    $checkg = [ADSI]::Exists <<<<
    ("LDAP://CN=($_.GROUPNAME),OU=D,OU=KL,OU=Users,OU=Gruppen,OU=($_.OU),DC=kl,DC=int")

        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : DotNetMethodException

    und um sicher zu gehen, es reicht doch die csv am Anfang des scripts
    zu importieren danach kann ich sie belibig of aufrufen oder?
    10 พฤษภาคม 2556 8:41
  • Mach mal folgendes vielleict wird es denn klarer:

    # Import-CSV Produziert für jede Zeile ein Objekt
    Import-Csv -Path C:\temp\ps\Scripts\PSscript\Data\pa_test_run.csv | Foreach-Object {
         # Das Aktuelle CSV Objekt wird mit $_ angesprochen
        
        "-------- Objekt: --------"
        $_.OU
        $_.GROUPNAME
        $_.GROUPDESCRIPTION
    }

    Du musst das $($_.OU) natürlich ander richtigen Stelle in deinem AD Pfad einfügen!
    Wir können das nicht wissen!

    $checkg = [ADSI]::Exists <<<<
    ("LDAP://CN=($_.GROUPNAME),OU=D,OU=KL,OU=Users,OU=Gruppen,OU=($_.OU),DC=kl,DC=int")

    Hast du meinen Code abgetippt oder Kopiert unfd eigefügt?

    Hier hat du anscheinend das Führende $ Vergessen, dies ist hier nötig!

    $checkg = [ADSI]::Exists ("LDAP://CN=$($_.GROUPNAME),OU=D,OU=KL,OU=Users,OU=Gruppen,OU=$($_.OU),DC=kl,DC=int")

    >>> und um sicher zu gehen, es reicht doch die csv am Anfang des scripts
    >>> zu importieren danach kann ich sie belibig of aufrufen oder?

    kommt darauf an wie du das meinst!?
    Was willst du damit erreichen?


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    10 พฤษภาคม 2556 10:33
  • mir ist jetzt klar das ich das $($_.) vergessen habe,

    hiermit wäre das import-csv problem, samt foreach-object eigentlich gelöst.

    danke dir Peter Kriegel!

    der script überprüft im ersten schritt ob die gruppe bereits existiert ist das nicht der fall wird diese erstellt, danach im zweiten schritt wird überprüft ob der user der in der zeile der gruppe steht deaktiviert ist, falls nicht wird er mitglied der gruppe falls doch wird er wenn die gruppe bereits existierte als mitglied entfernt

    des weiteren habe ich jetzt allerdings mit der if funktion ein problem hier der ausschnitt

    Import-Csv -Path C:\temp\ps\Scripts\PSscript\Data\pa_test_run.csv | Foreach-Object {
    
    $checkg = [ADSI]::Exists("LDAP://CN=$($_.GROUPNAME),OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int")
            
           if ($checkg -eq $false)
                {
                 #creating new group
                 New-QADGroup -Name $_.GROUPNAME -DisplayName $_.GROUPNAME -Description $_.GROUPDESCRIPTION -GroupScope Global -GroupType Security -ParentContainer "OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int"
                }
           else
                {
                 #continueing if group allready exists
                 Write-Error -Message "continueing if group allready exists" -ErrorAction SilentlyContinue
                }
    }
    
    Write-Host "done, next step"

    beim ausführen bekomme ich diesen fehler:

    Name                           Type            DN                                                                                                
    ----                           ----            --                                                                                                
    ACF-KL-F_F ALLE-W              group           CN=ACF-KL-F_F ALLE-W,OU=fs01,OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int              
    New-QADGroup : Das Objekt ist bereits vorhanden.
    
    Bei C:\Users\goseind\AppData\Local\Temp\1c565018-f336-4200-9d00-7b696d344208.ps1:8 Zeichen:26
    +              New-QADGroup <<<<  -Name $_.GROUPNAME -DisplayName $_.GROUPNAME -Description $_.GROUPDESCRIPTION -GroupScope Global -GroupType Sec
    urity -ParentContainer "OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int"
        + CategoryInfo          : NotSpecified: (CN=ACF-KL-F_F A...up,DC=kl,DC=int:String) [New-QADGroup], ObjectAlreadyExistsException
        + FullyQualifiedErrorId : Quest.ActiveRoles.ArsPowerShellSnapIn.Powershell.Cmdlets.NewGroupCmdlet
    

    das sieht zwar auf den ersten blick richtig aus da die gruppe bereits einmal erstellt worden ist, allerdings soll in diesem fall nicht nocheinmal die if ausgefürt werden sondern direkt zur else bzw. zum schritt zwei gewechselt werden sprich der user der Zeile soll der Gruppe der Zeile hinzugefügt werden

    hat da jemand eine idee wie ich diese Fehlermeldung umgehen kann?

    10 พฤษภาคม 2556 11:46
  • Hallo,

    das sieht richtig aus. Es gibt mehrere Attribute, die den Gruppenamen beinhalten, die Attribute CN, SAMACCOUNTNAME, moeglicheweise auch noch NAME nicht gleich sind, die ADSI Pruefung mit dem CN areitet, das Quest Cmdelet aber mit dem SAMACCOUNTNAME arbeitet? Ich kenne die Quest CMdlets nicht naeher.

    Beispiel:
    CN = ABCDEF
    SAMACCOUNTNAME = ABC

    In deriner Datei steht der Name ABC fuer die Gruppe, somit liefert der ADSI Befehl False, weil ABC != ABCDEF ist, das Quest Cmdlet will nun aber mit ABC die Gruppe anlegen.

    Beste Gruesse
    brima



    • แก้ไขโดย brima 10 พฤษภาคม 2556 12:38
    10 พฤษภาคม 2556 12:27
  • d.h. das problem müsste behoben sein wenn ich den parameter -sameaccountname noch mit einbinde?

    das habe ich nämlich getan bringt allerdings nichts

    des weiteren habe ich den script allerdings getestet und er läuft einwandfrei bis auf die sache in der if anweisung

    10 พฤษภาคม 2556 13:08
  • Hallo,

    New-QADGroup -Name

    es ist zu klaeren auf wekches Attribut sich der Parameter -Name des Cmdlet bezieht.

    Mit den MS eigenen AD-Cmdlest kannst Du dir mit
    Get-ADGroup Groupname -Properties *
    die Attribute einer Gruppe ansehen, und dort musst Du dann pruefen, ob CN, SAMACCOUNTNAME usw. gleich sind oder dein Scritp anpassen.
    Denn die Pruefung mit ADSI EXISTS ergibt ja einedeutig ein False, was dazu fuehrt, dass der If Zweig der Pruefung ausgefuehrt wird, dort soll die Gruppe neu angelegt werden, was auf einen Fehler laueft, weil die Gruppe schon da ist. Somit muss es unterschiede in den Attributen geben.

    Ich denke mal es gibt auch von Quest ein Cmdlet, dass dir die Properties einer Gruppe anzeigt.

    Beste Gruesse
    brima


    • แก้ไขโดย brima 10 พฤษภาคม 2556 13:25
    10 พฤษภาคม 2556 13:23
  • Hallo,

    so habe mal nachfeorscht, der Parameter -Name des QuestCmdlets bezieht scih auf den CN. Somit sollte alles funktionieren.

    Somit liegt das Problem hier.

    $checkg = [ADSI]::Exists("LDAP://CN=$($_.GROUPNAME),OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int")
      
    Was passiert wenn Du in der Zeile die Variablen direkt mit Werten aufrufst, also

    $checkg = [ADSI]::Exists("LDAP://CN=ACF-KL-F_F ALLE-W,OU=fs01,OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int")
    True oder False?


     


    • แก้ไขโดย brima 10 พฤษภาคม 2556 13:39
    10 พฤษภาคม 2556 13:39
  • Hallo,

    danke für die Antwort

    das cmdlet new-qadgroup setzt als -name den CN für die Gruppe

    bei deinem bsp. sagt er false da die gruppe nicht existiert

    allerdings habe ich nun auch den sameaccount name gleich gesetzt dort dürfte es jetzt keine Probleme mehr geben.

    14 พฤษภาคม 2556 8:59