none
Daten aus Powershell-Abfrage filtern RRS feed

  • Frage

  • Guten Morgen zusammen,

    ich möchte aus folgender Abfrage eine CSV-Datei erstellen, die alle Werte ausser "ABC" enthält.

    Get-ADComputer -SearchBase "xx=ads,DC=xx,DC=xx" -filter * -properties ManagedBy,extensionAttribute4,sAMAccountName,DistinguishedName,displayName | Where-Object { $_.DistinguishedName -notlike 'ABC' } | Select-Object sAMAccountName, DisplayName, extensionAttribute4, DistinguishedName  | Export-Csv C:\Temp\test.csv -UseCulture

    Irgendwie klappt das nicht, aber es wird auch kene Fehlermeldung ausgegeben.

    Alle Werte werden angezeigt, aber auch die DNM und die brauche ich nicht ;-)))

    Bis vor zwei Tagen wusste ich aber auch gerade mal, wie Powershell geschrieben wird, ggg

    Vielen Dank für Eure Hilfe und viele Grüsse

    Olli

    Freitag, 8. November 2013 09:09

Antworten

  • fast, da fehlt noch ein wenig im Muster, mach es so:

    Get-ADComputer -SearchBase "DC=ads,DC=xx,DC=xx"  -filter * -properties ManagedBy,extensionAttribute4,sAMAccountName,DistinguishedName,displayName |
    	Where-Object { $_.DistinguishedName -notmatch '.*,OU=dnm,.*' } |
    	Select-Object sAMAccountName, DisplayName, extensionAttribute4, DistinguishedName |
    	Export-Csv C:\Temp\test.csv -UseCulture -NoTypeInformation

    Das Muster  .*,OU=dnm,.* ist so zu deuten, es kommen beliebige Zeichen in beliebiger Anzahl, dann muss auf jedenfall die Zeichenfolge ,OU=dnm, kommen der wiederum beliebige Zeichen in beliebiger Anzahl folgen.

    Es besteht die Moeglichkeit das auch noch weiter zu verfeinern, in dem Fall heir sollte es aber so ausreichen.

    Beste Gruesse
    brima







    • Bearbeitet brima Freitag, 8. November 2013 11:13
    • Als Antwort markiert Olli72 Freitag, 8. November 2013 11:19
    Freitag, 8. November 2013 10:23
  • Achtung,

    notmatch, nicht NoMatch...

    Grüsse

    Florian


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...

    • Als Antwort markiert Olli72 Freitag, 8. November 2013 11:19
    Freitag, 8. November 2013 10:26
  • So, hab's mal kurz debugged, hatte noch ein paar Typos drin:

    $import = @() # Initialisieren Array
    $Samaccountname = $null # Variable resetten
    $EX4 = $null # Variable resetten
    $importfile = "c:\temp\import.csv" # Pfad zum Importfile angeben
    
    
    
    $import = Import-Csv -Path $importfile -Delimiter ";" # Einlesen der Computer und Kostenstellen / Abfüllen Array
    
    	foreach ($line in $import) # solange das Array nicht fertig ist
    	{
    	$targetobject = $null
    	$Samaccountname = $line.SAmaccountname # Zuweisen des Servernamen an separate Variable
    	$ID =$line.extensionAttribute4  # Zuweisen der Kostenstelle an separate Variable
    	$targetobject = get-aduser -Identity $Samaccountname
    	if ($? -eq $true)
    	{
    	Set-ADObject $targetobject -replace @{"extensionattribute4" = $ID} -WhatIf
    	}
    	}

    Das geht bei mir jedenfalls, der Inhalt meines csv sieht so aus:

    SamAccountname;extensionAttribute4
    florian.reck;12345

    Beim definitiven Abdrücken -whatif entfernen

    Grüsse

    Florian


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...




    • Bearbeitet Florian Reck Montag, 25. November 2013 12:12
    • Als Antwort markiert Olli72 Montag, 25. November 2013 13:52
    Montag, 25. November 2013 12:06
  • Ja, da deine csv Zitat:

    SamAccountname,extensionAttribute4

    holger.meier,dnm

    statt

    SamAccountname;extensionAttribute4

    holger.meier;dnm

    Falscher delimiter?

    Grüsse

    Florian


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...

    • Als Antwort markiert Olli72 Montag, 25. November 2013 13:52
    Montag, 25. November 2013 12:42
  • Hallo Olli,

    ist es nicht. Wenn es korrekt wäre, wurde in der Spalte A der Name und in der Spalte B das EX4 angezeigt. Mach das CSV mit dem Notepad auf, da wird es vermutlich so aussehen:

    "samaccountName;extensionattribute14" statt  samaccountName;extensionattribute14

    Die Anführungszeichen müssen weg...

    Somit heisst der Parameter Identity im Moment bei dir Holger.meier;1234 , und den gibt's im AD nicht..

    Bei mir sieht's aus

     

    Grüsse

    Florian


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...

    • Als Antwort markiert Olli72 Montag, 25. November 2013 13:52
    Montag, 25. November 2013 12:58
  • @Brima hast du herausgefunden was der Olli meint? Respekt !

    Es ist immer besser den Fragenden komplett fertigen Code zu liefern (dann bekommst du auch die Markierung als Antwort ;-) ) .
    Viele wissen nicht was du mit dieser aussage meinst.

    Also Olli meinst du das so?

    Get-ADComputer -SearchBase "xx=ads,DC=xx,DC=xx"  -filter * -properties ManagedBy,extensionAttribute4,sAMAccountName,DistinguishedName,displayName |
    	Where-Object { $_.DistinguishedName -notlike '*DNM*' } |
    	Select-Object sAMAccountName, DisplayName, extensionAttribute4, DistinguishedName |
    	Export-Csv C:\Temp\test.csv -UseCulture -NoTypeInformation


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    • Als Antwort markiert Olli72 Freitag, 8. November 2013 11:21
    Freitag, 8. November 2013 10:11

Alle Antworten

  • Bei mir Funktioniert alles!

    Du solltest dir aber angewöhnen, bei Export-Csv immer den Parameter -NoTypeInformation zu benutzen. Die Typinformationen des Objektes braucht meistens niemand!

    Get-ADComputer -SearchBase "xx=ads,DC=xx,DC=xx"  -filter * -properties ManagedBy,extensionAttribute4,sAMAccountName,DistinguishedName,displayName |
    	Where-Object { $_.DistinguishedName -notlike 'ABC' } |
    	Select-Object sAMAccountName, DisplayName, extensionAttribute4, DistinguishedName |
    	Export-Csv C:\Temp\test.csv -UseCulture -NoTypeInformation


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    Freitag, 8. November 2013 09:30
  • Danke für die Antwort.

    Wenn ich das Script so ausführe, bekomme ich als Ergebnis die csv-Datei, die aber

    CN=NMREN203,OU=dnm,DC=ads,DC=xxx,DC=de

    enthält, also ist dnm NICHT ausgefiltert.

    Freitag, 8. November 2013 09:35
  • Hallo Olli,

    vielleicht hilft dir dieser Link weiter:

    http://stackoverflow.com/questions/11531694/powershell-filtering-ous-while-using-get-adcomputer

    $Computers = Get-ADComputer -SearchBase "xx=ads,DC=xx,DC=xx" -filter * -properties ManagedBy,extensionAttribute4,sAMAccountName,DistinguishedName,displayName
    
    $goodOU = $computers| ? {$_.DistinguishedName -notlike "*ou=abc,*"}
    
    
    Dann müssten im $goodOU alle Server mit Ausnahme der ABC-OU drin sein...

    Grüsse

    Florian


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...


    Freitag, 8. November 2013 09:38
  • Ah, ginge das?

    ($_.DistinguishedName -notlike 'ABC') -or ($_.DistinguishedName -notlike 'DNM')

    Grüsse

    Florian 


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...


    • Bearbeitet Florian Reck Freitag, 8. November 2013 09:44 Typo
    Freitag, 8. November 2013 09:44
  • Schau dir den Unterschied an:

    PS C:\> "CN=NMREN203,OU=dnm,DC=ads,DC=xxx,DC=de" -notlike "dnm"
    True
    PS C:\> "CN=NMREN203,OU=dnm,DC=ads,DC=xxx,DC=de" -notlike "*dnm*"
    False
    Weil LIKE/NOTLIKE aber schwammig ist koennte z.B.: der heir durch die Lappen gehen, weil zufaellig dnm wo anders auftaucht.

    PS C:\> "CN=dnm,OU=abc,DC=ads,DC=xxx,DC=de" -notlike "*dnm*"
    False

    Deshalb besster MATCH/NOMATCH verwenden, denn damit kannst Du per Muster das ganze feiner filten. Stichwort: Regulaere Ausdruecke

    PS C:\> 'CN=dnm,OU=abc,DC=ads,DC=xxx,DC=de' -notmatch '.*OU=dnm.*'
    True
    PS C:\> 'CN=dnm,OU=dnm,DC=ads,DC=xxx,DC=de' -notmatch '.*OU=dnm.*'
    False



    Beste Gruesse
    brima
    • Bearbeitet brima Freitag, 8. November 2013 10:09
    Freitag, 8. November 2013 09:46
  • wenn ich das einfüge, bekomme ich den Fehler: Where-Object : Der Parameter "FilterScript" kann nicht gebunden werden. Der Wert "True" kann nicht in den Typ "System.Management.Automation.ScriptBlock" konvertiert werden. Fehler: "Ungültige Umwandlung von "System.Boolean"
    in "System.Management.Automation.ScriptBlock"."
    Freitag, 8. November 2013 10:02
  • also muss es so aussehen?

    Get-ADComputer -SearchBase "xx=ads,DC=xx,DC=xx"  -filter * -properties ManagedBy,extensionAttribute4,sAMAccountName,DistinguishedName,displayName |Where-Object { $_.DistinguishedName -notlike '*ABC*' } | Select-Object sAMAccountName, DisplayName, extensionAttribute4, DistinguishedName | t-Csv C:\Temp\test.csv -UseCulture -NoTypeInformation

    Freitag, 8. November 2013 10:06
  • muss ich das an mein Script anhängen??? Wenn ja, wo??

    Sorry.....

    Freitag, 8. November 2013 10:07
  • @Brima hast du herausgefunden was der Olli meint? Respekt !

    Es ist immer besser den Fragenden komplett fertigen Code zu liefern (dann bekommst du auch die Markierung als Antwort ;-) ) .
    Viele wissen nicht was du mit dieser aussage meinst.

    Also Olli meinst du das so?

    Get-ADComputer -SearchBase "xx=ads,DC=xx,DC=xx"  -filter * -properties ManagedBy,extensionAttribute4,sAMAccountName,DistinguishedName,displayName |
    	Where-Object { $_.DistinguishedName -notlike '*DNM*' } |
    	Select-Object sAMAccountName, DisplayName, extensionAttribute4, DistinguishedName |
    	Export-Csv C:\Temp\test.csv -UseCulture -NoTypeInformation


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    • Als Antwort markiert Olli72 Freitag, 8. November 2013 11:21
    Freitag, 8. November 2013 10:11
  • genau so meinte ich das:

    Ich soll alle Computernamen einer Domäne auslesen mit Ausnahme der OU DNM bzw. möchte ich diese Objekte NICHT in meiner Datei haben.

    @Brima: Also muss ich notlike durch -nomatch ersetzen?

    Get-ADComputer -SearchBase "DC=ads,DC=xx,DC=xx"  -filter * -properties ManagedBy,extensionAttribute4,sAMAccountName,DistinguishedName,displayName |
    	Where-Object { $_.DistinguishedName -nomatch'*DNM*' } |
    	Select-Object sAMAccountName, DisplayName, extensionAttribute4, DistinguishedName |
    	Export-Csv C:\Temp\test.csv -UseCulture -NoTypeInformation

    Freitag, 8. November 2013 10:19
  • fast, da fehlt noch ein wenig im Muster, mach es so:

    Get-ADComputer -SearchBase "DC=ads,DC=xx,DC=xx"  -filter * -properties ManagedBy,extensionAttribute4,sAMAccountName,DistinguishedName,displayName |
    	Where-Object { $_.DistinguishedName -notmatch '.*,OU=dnm,.*' } |
    	Select-Object sAMAccountName, DisplayName, extensionAttribute4, DistinguishedName |
    	Export-Csv C:\Temp\test.csv -UseCulture -NoTypeInformation

    Das Muster  .*,OU=dnm,.* ist so zu deuten, es kommen beliebige Zeichen in beliebiger Anzahl, dann muss auf jedenfall die Zeichenfolge ,OU=dnm, kommen der wiederum beliebige Zeichen in beliebiger Anzahl folgen.

    Es besteht die Moeglichkeit das auch noch weiter zu verfeinern, in dem Fall heir sollte es aber so ausreichen.

    Beste Gruesse
    brima







    • Bearbeitet brima Freitag, 8. November 2013 11:13
    • Als Antwort markiert Olli72 Freitag, 8. November 2013 11:19
    Freitag, 8. November 2013 10:23
  • Achtung,

    notmatch, nicht NoMatch...

    Grüsse

    Florian


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...

    • Als Antwort markiert Olli72 Freitag, 8. November 2013 11:19
    Freitag, 8. November 2013 10:26
  • danke schön....

    nun bekomme ich folgende Meldung:

    Where-Object : Es wurde kein Positionsparameter gefunden, der das Argument "Select-Object" akzeptiert.
    Bei Zeile:1 Zeichen:165
    + Get-ADComputer -SearchBase "DC=ads,DC=xxx,DC=de"  -filter * -properties ManagedBy,extensionAttribute4,sAMAccountName,DistinguishedName,displayName | Where-Object <<<<  { $_.DistinguishedName -notmatch '.*OU=dnm.*' } Sel
    ect-Object sAMAccountName, DisplayName, extensionAttribute4, DistinguishedName | Export-Csv C:\Temp\test.csv -UseCulture -NoTypeInformation
        + CategoryInfo          : InvalidArgument: (:) [Where-Object], ParameterBindingException
        + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.WhereObjectCommand

    Viele Grüsse

    Olli

    Freitag, 8. November 2013 10:33
  • danke schön....

    nun bekomme ich folgende Meldung:

    Where-Object : Es wurde kein Positionsparameter gefunden, der das Argument "Select-Object" akzeptiert.
    Bei Zeile:1 Zeichen:165
    + Get-ADComputer -SearchBase "DC=ads,DC=xxx,DC=de"  -filter * -properties ManagedBy,extensionAttribute4,sAMAccountName,DistinguishedName,displayName | Where-Object <<<<  { $_.DistinguishedName -notmatch '.*OU=dnm.*' } Sel
    ect-Object sAMAccountName, DisplayName, extensionAttribute4, DistinguishedName | Export-Csv C:\Temp\test.csv -UseCulture -NoTypeInformation
        + CategoryInfo          : InvalidArgument: (:) [Where-Object], ParameterBindingException
        + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.WhereObjectCommand

    Viele Grüsse

    Olli


    habes gefunden....Hatte ein| vergessen
    Freitag, 8. November 2013 10:43
  • geil.....jetzt funktioniert es.....

    Lieben Dank an alle... und schönes WE Olli

    .....und bis bald

    Freitag, 8. November 2013 10:43
  • Olli lies bitte noch das hier und Markiere alle richtigen Antworten ;-)

    Wozu Antworten markieren und für Beiträge abstimmen?

    Schönes Wochenende!


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    Freitag, 8. November 2013 11:11
  • danke für den Hinweis Peter.

    Habe ich gemacht.

    Dir auch ein schönes WE

    Freitag, 8. November 2013 11:22
  • Hallo und guten Morgen,

    muss nochmal auf das Thema zurückkommen.

    Nun habe ich in der CSV das extensionAttribute4 bei einigen Usern geändert und würde das Ganze gerne per CSV wieder ins Active Directory importieren.

    Wie bekomme ich das hin, dass es nur bei den Usern geändert wird, bei denen es in der CSV gesetzt ist?

    Wenn ich manuell einen User nehmen, mache ich es so:

    Get-ADUser -SearchBase "XX=ads,DC=XX,DC=XX" -filter * | Set-ADUser -Identity "Olli" -Add @{extensionattribute4="dnm"}

    Das funktioniert.

    Vielen Dank für eure Unterstützung und viele Grüsse

    Olli

    Mittwoch, 20. November 2013 07:14
  • Hallo Olli,

    CSV einlesen, prüfen, ob im CSV die Spalte beim User für das extensionattribute4 nicht $null ist, dann User suchen, dann prüfen ob das Attribut beim ausgelesenen User gleich ist, wenn nicht, Attribut mit -replace setzen (-add geht nicht, da schon ein Wert drinsteht, dann vorher -clear verwenden).

    Viel Spass beim tüfteln, hier ein Beispiel für Computer...

    #*************************************************************************** 
    # ***** Script Header ***** 
    # 
    # Lösung für: Setzen der Kostenstelle anhand eines CSV-Files
    # Dateiname:  SetExtensionAttributeComputer.ps1     
    # 
    # Zweck: Setzen der Kostenstelle
    # 
    # Verwendung / Syntax: -
    # 
    # Parameter: -
    # 
    # Rückgabewert: -
    # 
    # History:
    # Version      	Author         	Datum      	Kommentar 
    # 1.0.0        	FinalRocker    	03.10.2013	Skript erstellt
    # 1.0.1			FinalRocker		03.10.2013	Hinweis bereits belegtes Attribut
    #  
    # 
    # ***** End Header ***** 
    #***************************************************************************
    cls
    #Set-StrictMode -Version 2
    Import-Module ActiveDirectory
    #***************************************************************************
    # Global constant and variable declarations
    #***************************************************************************
    
    $import = @() # Initialisieren Array
    $Servername = $null # Variable resetten
    $ServernameFunc = $null # Variable resetten
    $IDFunc = $null # Variable resetten
    $ID = $null # Variable resetten
    $Today = Get-Date # Heutiges Datum auslesen
    $log = "c:\temp\EX6Set.log"	# Pfad zum Log angeben
    $importfile = "c:\temp\Enummer.csv" # Pfad zum Importfile angeben
    
    #***************************************************************************
    # functions
    #***************************************************************************
    
    function SetExtensionAttribute ($ServernameFunc, $IDFunc) {
    
    	Set-ADComputer -Identity $ServernameFunc -Add @{extensionAttribute6=$IDFunc} # Setzen des ExtensionAttribut 6 beim entsprechenden Server
    							if ($? -eq "True")
    							{
    							"OK; $ServernameFunc, ID $IDFunc setzen erfolgreich" | Out-File -FilePath $log -Append # Ausgabe an Log
    							}
    							else
    							{
    							"Error; $ServernameFunc, ID $IDFunc setzen nicht erfolgreich" | Out-File -FilePath $log -Append # Ausgabe an Log
    							}
    }
    
    
    
    #***************************************************************************
    # Import File
    #***************************************************************************
    
    $import = Import-Csv -Path $importfile -Delimiter ";" # Einlesen der Computer und Kostenstellen / Abfüllen Array
    "*******************************************************************" | Out-File -FilePath $log -Append # Header Log mit Datum
    "Skript neu gestartet am $today" | Out-File -FilePath $log -Append # Header Log mit Datum
    "*******************************************************************" | Out-File -FilePath $log -Append # Header Log mit Datum
    	foreach ($line in $import) # solange das Array nicht fertig ist
    	{
    	$Servername = $line.computername # Zuweisen des Servernamen an separate Variable
    	$ID =$line.BereichID  # Zuweisen der Kostenstelle an separate Variable
    	
    		if ($Servername -eq "") #prüfen ob der Servername leer ist
    		{
    		"Error; Kein Servername" | Out-File -FilePath $log -Append # Ausgabe an Log
    		}
    		else # sonst 
    		{
    	
    			if ($ID -eq "") # Prüfen ob die ID leer ist
    			{
    			"Warning; Keine Kostenstelle für $Servername" | Out-File -FilePath $log -Append # Ausgabe an Log
    			}
    			else # sonst
    			{
    	
    				$CheckServer = Get-ADComputer -Identity $Servername  -Properties Enabled, extensionattribute6 # prüfen ob Server im AD vorhanden
    				if ($? -eq "True") # Abfragen der Fehlervariable ob Prüfung erfolgreich
    				{
    					if ($CheckServer.extensionattribute6 -ne $null)#Prüfen, ob das Attribute6 leer ist
    					{
    						$PrevValue = $CheckServer.extensionattribute6
    						if ($PrevValue -eq $ID) # Prüfung, ob der ausgelesene Wert gleich wie der im Import-File ist
    						{
    						"OK; Wert im ExtensionAttribute 6 bei Server $Servername ist gleich, keine Aktualisierung" | Out-File -FilePath $log -Append
    						}
    						else
    						{
    						"Warning; ExtensionAttribute6 bei Server $Servername bereits mit Wert $PrevValue belegt, wird aktualisiert!" | Out-File -FilePath $log -Append
                            
    						Set-ADComputer -Identity $Servername -clear extensionAttribute6
                            Set-ADComputer -Identity $Servername -Add @{extensionAttribute6=$ID} # Setzen des ExtensionAttribut 6 beim entsprechenden Server
    							if ($? -eq "True")
    							{
    							"OK; $Servername, ID $ID setzen erfolgreich" | Out-File -FilePath $log -Append # Ausgabe an Log
    							}
    							else
    							{
    							"Error; $Servername, ID $ID setzen nicht erfolgreich" | Out-File -FilePath $log -Append # Ausgabe an Log
    							}						
    						}
    					}
    					else
    					{
    					
    						#SetExtensionAttribute $Servername $ID
                            Set-ADComputer -Identity $Servername -Add @{extensionAttribute6=$ID} # Setzen des ExtensionAttribut 6 beim entsprechenden Server
    							if ($? -eq "True")
    							{
    							"OK; $Servername, ID $ID setzen erfolgreich" | Out-File -FilePath $log -Append # Ausgabe an Log
    							}
    							else
    							{
    							"Error; $Servername, ID $ID setzen nicht erfolgreich" | Out-File -FilePath $log -Append # Ausgabe an Log
    							}		
    					}
    				}
    				else
    				{
    					"Error; Server $Servername im AD nicht gefunden oder disabled" | Out-File -FilePath $log -Append # Ausgabe an Log
    				}
    			}
    		}
    
    	}
    
    
    

    Grüsse

    Florian


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...


    Mittwoch, 20. November 2013 08:14
  • oh mein Gott ;-))
    Mittwoch, 20. November 2013 08:26
  • Bitte, du darfst mich auch Florian nennen...

    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...

    Mittwoch, 20. November 2013 08:45
  • danke Florian.

    Mal sehen, ob ich das umsetzen kann....

    Mittwoch, 20. November 2013 09:02
  • Hmmmm.... geht das auch einfacher ;-)))

    so ähnlich ;-)))

    Import-Csv E:\test.csv -delimiter ";" | ForEach-Object {Set-ADUser $_.samAccountName} -ObjectAttributes @{ExtensionAttribute4=($_.ExtensionAttribute4)}

    Dann kommt allerdings das:

    ForEach-Object : Der Parameter "Process" kann nicht gebunden werden. Der Wert "-ObjectAttributes" vom Typ "System.String" kann nicht in den Typ "System.Management.Automation.ScriptBlock" konvertiert werden.
    Bei Zeile:1 Zeichen:90
    + Import-Csv E:\test.csv -delimiter ";" | ForEach-Object <<<<  {Set-ADUser $_.samAccountName} -ObjectAttributes @{ExtensionAttribute4=($_.ExtensionAttribute4)}
        + CategoryInfo          : InvalidArgument: (:) [ForEach-Object], ParameterBindingException
        + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.ForEachObjectCommand

    Ich drehe noch durch.

    Möchte doch nur aus der CSV die Accounts ansprechen und dort einen Wert im extensionAttribute4 setzen.

    Könnte man das nicht so machen?

    Set-ADUSer -Identity $SamAccountname -clear extensionAttribute4 | Set-ADUSer -Identity $SamAccountname -Add @{extensionAttribute4=$ID}

    Meine CSV sieht so aus:

    SamAccountname,extensionAttribute4

    holger.meier,dnm

    Vielen Dank schon mal vorab und viele Grüsse

    Olli

    Montag, 25. November 2013 08:51
  • Ok, hier mal ganz einfach:

    $import = @() # Initialisieren Array
    $Samaccountname = $null # Variable resetten
    $EX4 = $null # Variable resetten
    $Today = Get-Date # Heutiges Datum auslesen
    $log = "c:\temp\EX6Set.log"	# Pfad zum Log angeben
    $importfile = "c:\temp\Enummer.csv" # Pfad zum Importfile angeben
    
    #***************************************************************************
    # Import File
    #***************************************************************************
    
    $import = Import-Csv -Path $importfile -Delimiter ";" # Einlesen der Computer und Kostenstellen / Abfüllen Array
    "*******************************************************************" | Out-File -FilePath $log -Append # Header Log mit Datum
    "Skript neu gestartet am $today" | Out-File -FilePath $log -Append # Header Log mit Datum
    "*******************************************************************" | Out-File -FilePath $log -Append # Header Log mit Datum
    	foreach ($line in $import) # solange das Array nicht fertig ist
    	{
    	$Samaccountname = $line.SAmaccounname # Zuweisen des Servernamen an separate Variable
    	$ID =$line.extensionAttribute4  # Zuweisen der Kostenstelle an separate Variable
    	$targetobject=get-aduser $Samaccountname
    	Set-ADObject $targetobject -replace @{"extensionattribute4" = $ID}
    	
    	}

    Achtung, ist ungetestet.... Nur so dahergekritzelt...

    Grüsse

    Florian


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...





    Montag, 25. November 2013 10:01
  • Vielen lieben Dank Florian,

    den oben Teil mit der Definiation des Arrays habe ich einfach kopiert. Das ging.

    Mit dem unteren Teil habe ich mehr Probleme. Muss ich das am Stück eingeben, also so?

    $import = Import-Csv -Path $importfile -Delimiter ";" | Out-File -FilePath $log -Append  | Out-File -FilePath $log -Append | Out-File -FilePath $log -Append | foreach ($line in $import)  {$Samaccountname = $line.SAmaccounname $ID =$line.extensionAttribute4 | Set-ADObject $Samaccountname -replace @{"extensionattribute4" = $ID}}

    Dann kommt das:

    Unerwartetes Token "in" im Ausdruck oder in der Anweisung.
    Bei Zeile:1 Zeichen:177
    + $import = Import-Csv -Path $importfile -Delimiter ";" | Out-File -FilePath $log -Append  | Out-File -FilePath $log -Append | Out-File -FilePath $log -Append | foreach ($line in <<<<  $import)  {$Samaccountname = $line.SAma
    ccounname $ID =$line.extensionAttribute4 | Set-ADObject $Samaccountname -replace @{"extensionattribute4" = $ID}}
        + CategoryInfo          : ParserError: (in:String) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : UnexpectedToken

    Viele Grüsse

    Olli

    Montag, 25. November 2013 10:34
  • Hallo Olli,

    sollte eigentlich aus dem Skriptblock 1:1 übernommen werden können, auf einer Linie wird wohl nicht passen..

    $import = @() # Initialisieren Array
    $Samaccountname = $null # Variable resetten
    $EX4 = $null # Variable resetten
    $importfile = "c:\temp\Enummer.csv" # Pfad zum Importfile angeben
    
    
    
    $import = Import-Csv -Path $importfile -Delimiter ";" # Einlesen der Computer und Kostenstellen / Abfüllen Array
    
    	foreach ($line in $import) # solange das Array nicht fertig ist
    	{
    	$Samaccountname = $line.SAmaccounname # Zuweisen des Servernamen an separate Variable
    	$ID =$line.extensionAttribute4  # Zuweisen der Kostenstelle an separate Variable
    	$targetobject=get-aduser $Samaccountname
    	Set-ADObject $targetobject -replace @{"extensionattribute4" = $ID}
    	}

    Habs noch etwas gekürzt..

      

    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...

    Montag, 25. November 2013 10:48
  • ups...sorry.

    wenn ich das 1:1 übernehme, kommt folgendes raus:

    PS C:\Users\olli> $import = @() # Initialisieren Array
    PS C:\Users\olli> $Samaccountname = $null # Variable resetten
    PS C:\Users\olli> $EX4 = $null # Variable resetten
    PS C:\Users\olli> $importfile = "c:\temp\Enummer.csv" # Pfad zum Importfile angeben
    PS C:\Users\olli>
    PS C:\Users\olli>
    PS C:\Users\olli>
    PS C:\Users\olli> $import = Import-Csv -Path $importfile -Delimiter ";" # Einlesen der Computer und Kostenstellen / Abfüllen Array
    PS C:\Users\olli>
    PS C:\Users\olli>     foreach ($line in $import) # solange das Array nicht fertig ist
    >>     {
    >>     $Samaccountname = $line.SAmaccounname # Zuweisen des Servernamen an separate Variable
    >>     $ID =$line.extensionAttribute4  # Zuweisen der Kostenstelle an separate Variable
    >>     $targetobject=get-aduser $Samaccountname
    >>     Set-ADObject $targetobject -replace @{"extensionattribute4" = $ID}
    >>     }
    >>

    irgendwas mag er da noch, oder?

    Gruss Olli

    Montag, 25. November 2013 10:56
  • Ahhh, ok, Kopier den Inhalt des Skriptblocks in ein Notepad und nenne es SetEX4byUser.ps1 oder so ähnlich... Mach dann rechtsklick -> edit -> mit Powershell ISE oder lade dir mal das powergui herunter, das hilft extrem beim Skripten und debuggen...

    http://community-downloads.quest.com/powergui/Release/3.8/PowerGUI.3.8.0.129.msi

    Edit: aaargh -> schreib mal am Anfang import-module activedirectory rein, das brauchst du auch..

    Grüsse

    Florian


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...


    Montag, 25. November 2013 11:26
  • danke schön. Das Ganze habe das nun so eingefügt: Die Klammern >>     { und >>     } habe ich rausgeno mmen. Das Notepad++ fand die nicht so toll ;-)))

    import-module activedirectory
    $import = @() # Initialisieren Array
    $Samaccountname = $null # Variable resetten
    $EX4 = $null # Variable resetten
    $importfile = "c:\temp\Enummer.csv" # Pfad zum Importfile angeben



    $import = Import-Csv -Path $importfile -Delimiter ";" # Einlesen der Computer und Kostenstellen / Abfüllen Array

        foreach ($line in $import) # solange das Array nicht fertig ist
        $Samaccountname = $line.SAmaccounname # Zuweisen des Servernamen an separate Variable
        $ID =$line.extensionAttribute4  # Zuweisen der Kostenstelle an separate Variable
        $targetobject=get-aduser $Samaccountname
        Set-ADObject $targetobject -replace @{"extensionattribute4" = $ID}
       

    Nun kommt die Meldung: Fehlender Anweisungstext in der foreach-Schleife.
    At line:12 char:2

    Montag, 25. November 2013 11:56
  • Hallo Olli,

    die brauchts aber :-) { vor $Samaccountname und } nach =$ID} ,sonst wird die Schlaufe nicht korrekt abgearbeitet.

    Grüsse

    Florian

     


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...

    Montag, 25. November 2013 12:01
  • So, hab's mal kurz debugged, hatte noch ein paar Typos drin:

    $import = @() # Initialisieren Array
    $Samaccountname = $null # Variable resetten
    $EX4 = $null # Variable resetten
    $importfile = "c:\temp\import.csv" # Pfad zum Importfile angeben
    
    
    
    $import = Import-Csv -Path $importfile -Delimiter ";" # Einlesen der Computer und Kostenstellen / Abfüllen Array
    
    	foreach ($line in $import) # solange das Array nicht fertig ist
    	{
    	$targetobject = $null
    	$Samaccountname = $line.SAmaccountname # Zuweisen des Servernamen an separate Variable
    	$ID =$line.extensionAttribute4  # Zuweisen der Kostenstelle an separate Variable
    	$targetobject = get-aduser -Identity $Samaccountname
    	if ($? -eq $true)
    	{
    	Set-ADObject $targetobject -replace @{"extensionattribute4" = $ID} -WhatIf
    	}
    	}

    Das geht bei mir jedenfalls, der Inhalt meines csv sieht so aus:

    SamAccountname;extensionAttribute4
    florian.reck;12345

    Beim definitiven Abdrücken -whatif entfernen

    Grüsse

    Florian


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...




    • Bearbeitet Florian Reck Montag, 25. November 2013 12:12
    • Als Antwort markiert Olli72 Montag, 25. November 2013 13:52
    Montag, 25. November 2013 12:06
  • ups....habe ich gerade erst gesehen.....sorry

    Wenn ich das so mache, kommt:

    Get-ADUser : Das Argument für den Parameter "Identity" kann nicht überprüft werden. Das Argument ist NULL. Geben Sie ein Argument an, das nicht NULL ist, und führen Sie dann den Befehl erneut aus.
    Bei Zeile:15 Zeichen:38
    +     $targetobject = get-aduser -Identity <<<<  $Samaccountname
        + CategoryInfo          : InvalidData: (:) [Get-ADUser], ParameterBindingValidationException
        + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.GetADUser

    Liegt das evtl. an meiner CSV???

    Montag, 25. November 2013 12:34
  • Ja, da deine csv Zitat:

    SamAccountname,extensionAttribute4

    holger.meier,dnm

    statt

    SamAccountname;extensionAttribute4

    holger.meier;dnm

    Falscher delimiter?

    Grüsse

    Florian


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...

    • Als Antwort markiert Olli72 Montag, 25. November 2013 13:52
    Montag, 25. November 2013 12:42
  • ok...habe den Delimiter auf "," geändert und in der CSV die Trennung mit einem Semikolon vorgenommen.

    Die CSV habe ich mit Excel gemacht und alles in insgesamtZelleuntergebracht. Ist doch ok?

    Trotzdem kommt noch:

    Get-ADUser : Das Argument für den Parameter "Identity" kann nicht überprüft werden. Das Argument ist NULL. Geben Sie ein Argument an, das nicht NULL ist, und führen Sie dann den Befehl erneut aus.
    Bei Zeile:16 Zeichen:38
    +     $targetobject = get-aduser -Identity <<<<  $Samaccountname
        + CategoryInfo          : InvalidData: (:) [Get-ADUser], ParameterBindingValidationException
        + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.GetADUser

    Montag, 25. November 2013 12:52
  • Hallo Olli,

    ist es nicht. Wenn es korrekt wäre, wurde in der Spalte A der Name und in der Spalte B das EX4 angezeigt. Mach das CSV mit dem Notepad auf, da wird es vermutlich so aussehen:

    "samaccountName;extensionattribute14" statt  samaccountName;extensionattribute14

    Die Anführungszeichen müssen weg...

    Somit heisst der Parameter Identity im Moment bei dir Holger.meier;1234 , und den gibt's im AD nicht..

    Bei mir sieht's aus

     

    Grüsse

    Florian


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...

    • Als Antwort markiert Olli72 Montag, 25. November 2013 13:52
    Montag, 25. November 2013 12:58
  • Hallo Florian oder besser Oh Gott ;-)))

    das war es....es klappt.

    Noch eine letzte Frage: wenn ich den Wert wieder auf 0 bzw. nicht vorhanden setzen möchte, welchen Wert nehme ich dann in der csv?

    Vielen Dank und viele Grüsse

    Olli

    • Als Antwort markiert Olli72 Montag, 25. November 2013 13:52
    • Tag als Antwort aufgehoben Olli72 Montag, 25. November 2013 13:52
    Montag, 25. November 2013 13:34
  • Hallo Olli,

    du kannst die Spalte im csv leer lassen, dann abfragen:

    if ($ID -eq "") # Prüfen ob die ID leer ist
    			{
    			Set-ADObject $targetobject -Clear @{"extensionattribute4"}
    			}
    			else # sonst
    			{
    			Set-ADObject $targetobject -replace @{"extensionattribute4" = $ID}
    			}

    So in etwa....

    Grüsse

    Florian


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...

    Montag, 25. November 2013 13:40
  • und das baue ich dann statt diesem Block ein:

    if ($? -eq $true)
    	{
    	Set-ADObject $targetobject -replace @{"extensionattribute4" = $ID} -WhatIf
    	}
    	}

    Montag, 25. November 2013 13:54
  • und das baue ich dann statt diesem Block ein:

    if ($? -eq $true)
    	{
    	Set-ADObject $targetobject -replace @{"extensionattribute4" = $ID} -WhatIf
    	}
    	}

    mag er nicht:

    Fehlender Operator "=" nach einem Schlüssel im Hashliteral.
    Bei E:\testimportleer.ps1:19 Zeichen:62
    +             Set-ADObject $targetobject -Clear @{"extensionattribute4"} <<<<
        + CategoryInfo          : ParserError: (:) [], ParseException
        + FullyQualifiedErrorId : MissingEqualsInHashLiteral

    Hier das Gesamtwerk:

    Import-Module ActiveDirectory
    $import = @() # Initialisieren Array
    $Samaccountname = $null # Variable resetten
    $EX4 = $null # Variable resetten
    $importfile = "c:\temp\import.csv" # Pfad zum Importfile angeben



    $import = Import-Csv -Path $importfile -Delimiter ";" # Einlesen der Computer und Kostenstellen / Abfüllen Array

        foreach ($line in $import) # solange das Array nicht fertig ist
        {
        $targetobject = $null
        $Samaccountname = $line.SAmaccountname # Zuweisen des Servernamen an separate Variable
        $ID =$line.extensionAttribute4  # Zuweisen der Kostenstelle an separate Variable
        $targetobject = get-aduser -Identity $Samaccountname
        if ($ID -eq "") # Prüfen ob die ID leer ist
                {
                Set-ADObject $targetobject -Clear @{"extensionattribute4"}
                }
                else # sonst
                {
                Set-ADObject $targetobject -replace @{"extensionattribute4" = $ID}
                }}
           

    • Bearbeitet Olli72 Montag, 25. November 2013 14:18
    Montag, 25. November 2013 14:17
  • Hallo Olli,

    geht's jetzt?

    if ($? -eq $true)
    	{
    	if ($ID -eq "") # Prüfen ob die ID leer ist
    			{
    			Set-ADObject $targetobject -clear extensionattribute4			}
    			else # sonst
    			{
    			Set-ADObject $targetobject -replace @{"extensionattribute4" = $ID}
    			}
    	}

    Hätte es auch so eingebaut.

    Grüsse

    Florian


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...




    Montag, 25. November 2013 14:25
  • nein....er meckert noch:

    Fehlender Operator "=" nach einem Schlüssel im Hashliteral.
    Bei E:\testimportleer.ps1:19 Zeichen:62
    +             Set-ADObject $targetobject -Clear @{"extensionattribute4"} <<<<
        + CategoryInfo          : ParserError: (:) [], ParseException
        + FullyQualifiedErrorId : MissingEqualsInHashLiteral

    nach der Abschlussklammer: Set-ADObject $targetobject -Clear @{"extensionattribute4"}

    ist eine rote welle, als ob da was fehlt.

    Montag, 25. November 2013 14:35
  • nein....er meckert noch:

    Fehlender Operator "=" nach einem Schlüssel im Hashliteral.
    Bei E:\testimportleer.ps1:19 Zeichen:62
    +             Set-ADObject $targetobject -Clear @{"extensionattribute4"} <<<<
        + CategoryInfo          : ParserError: (:) [], ParseException
        + FullyQualifiedErrorId : MissingEqualsInHashLiteral

    nach der Abschlussklammer: Set-ADObject $targetobject -Clear @{"extensionattribute4"}

    ist eine rote welle, als ob da was fehlt.


    Montag, 25. November 2013 14:36
  • So, das sollte passen:

    $import = @() # Initialisieren Array
    $Samaccountname = $null # Variable resetten
    $EX4 = $null # Variable resetten
    $importfile = "c:\temp\import.csv" # Pfad zum Importfile angeben
    cls
    
    
    $import = Import-Csv -Path $importfile -Delimiter ";" # Einlesen der Computer und Kostenstellen / Abfüllen Array
    
    	foreach ($line in $import) # solange das Array nicht fertig ist
    {
    	$targetobject = $null
    	$Samaccountname = $line.SAmaccountname # Zuweisen des Servernamen an separate Variable
    	$ID =$line.extensionAttribute4  # Zuweisen der Kostenstelle an separate Variable
    	$targetobject = get-aduser -Identity $Samaccountname
    	if ($? -eq $true)
    	{
    	if ($ID -eq $null) # Prüfen ob die ID leer ist
    			{
    			Set-ADObject $targetobject -Clear extensionattribute4 -WhatIf
    			}
    			else # sonst
    			{
    			Set-ADObject $targetobject -replace @{"extensionattribute4" = $ID} -WhatIf
    			}
    	}
    	else
    	{
    	Write-Host "Benutzer $samaccountname nicht gültig"
    	}

    Grüsse

    Florian


    Schaue auf niemanden herab, es sei denn, du willst ihm aufhelfen...

    Montag, 25. November 2013 14:42
  • HI Florian,

    danke schön...werde es soäter bzw. morgen ausprobieren.

    Habe gleich noch ein Meeting.

    Danke schön schon mal und bis morgen

    Olli

    Montag, 25. November 2013 14:53