nagus
Goto Top

PowerShell AD Struktur als Array ohne OU-Wert

Hi zusammen,

ich habe ein Script was eigentlich fast funktioniert, aber ich stolpere über einen Punkt und weiß nicht recht wie ich den lösen soll.
# Start Script
# Laden des ActiveDirectoryModuls
Import-Module ActiveDirectory

$OU_Monate = Get-ADOrganizationalUnit -Filter '*' -SearchBase "OU=Mitarbeiter_Ausgetreten,OU=XYZ,DC=DOMAIN,DC=LÄNDERKÜRZEL" -SearchScope OneLevel | select @{l='OU';e={$_.DistinguishedName.split(',').split('=')[1]}}  
$select = Read-Host -Prompt "Bitte den Monat als Zahl eingeben, für den das Script ausgeführt werden soll!"  
$OU_Monate -match "$select"  
"$MoveUserListe = Get-Content C:\Scripte\Powershell\Austritte_$OU_monat.txt"  
$MoveUserListe
# Script Ende 

Wir erhalten die User, welche jeden Monat das Unternehmen verlassen, als Liste. Diese sollen in eine OU verschoben werden. Die Definition erfolgt mit
$OU_Monate = Get-ADOrganizationalUnit -Filter '*' -SearchBase "OU=Mitarbeiter_Ausgetreten,OU=XYZ,DC=DOMAIN,DC=LÄNDERKÜRZEL" -SearchScope OneLevel | select @{l='OU';e={$_.DistinguishedName.split(',').split('=')[1]}}  

Als Ergebnis habe ich das Array:
OU            
--            
01 - Januar   
02 - Februar  
03 - Maerz    
04 - April    
05 - Mai      
06 - Juni     
07 - Juli     
08 - August   
09 - September
10 - Oktober  
11 - November

Wenn ich bei
$select = Read-Host -Prompt "Bitte den Monat als Zahl eingeben, für den das Script ausgeführt werden soll!"  

die Zahl 11 für November eingebe, erhalte ich das folgende Ergebnis:
OU           
--           
11 - November

Im nächsten Schritt soll das Script eine Textdatei einlesen, in der die User gespeichert sind und diese dann einzeln verschieben. Allerdings erhalte ich diese Ausgabe und komme hier nicht so recht weiter ....
Aufruf
"$MoveUserListe = Get-Content C:\Scripte\Powershell\Austritte_$OU_monat.txt"  
Antwort
OU           
--           
11 - November
 = Get-Content C:\Scripte\Powershell\Austritte_.txt

Erhalten möchte ich aber aber für $MoveUserListe nur den Wert C:\Scripte\Powershell\Austritte_11 - November.txt
Was mache ich falsch? Wie kann ich das ändern?
Thx
Nagus
PS: ein wirklich gescheiter Titel für meine Frage ist mir nicht eingefallen ...

Content-Key: 511152

Url: https://administrator.de/contentid/511152

Ausgedruckt am: 28.03.2024 um 18:03 Uhr

Mitglied: emeriks
emeriks 01.11.2019 um 15:40:18 Uhr
Goto Top
Hi,
$OU_Monate mit "e" am Ende!

E.
Mitglied: mayho33
mayho33 01.11.2019 um 19:18:30 Uhr
Goto Top
Zitat von @emeriks:

Hi,
$OU_Monate mit "e" am Ende!

E.

Intelligence ist nicht sein Freund face-wink

Nutze die ISE @Nagus. Dann passieren solche Fehler nicht.
Mitglied: emeriks
Lösung emeriks 01.11.2019 aktualisiert um 22:39:39 Uhr
Goto Top
Zitat von @mayho33:
Intelligence ist nicht sein Freund face-wink
???
Solltest Du Intelligenz meinen, dann suche doch schon mal Deinen Besen. Denn ..
Nutze die ISE @Nagus. Dann passieren solche Fehler nicht
..., nein, ganz sicher nicht. Warum auch?

Aber sicherlich meinst Du Intellisense? face-wink face-wink face-wink
Mitglied: mayho33
mayho33 01.11.2019 um 23:41:10 Uhr
Goto Top
Zitat von @emeriks:

Zitat von @mayho33:
Intelligence ist nicht sein Freund face-wink
???
Solltest Du Intelligenz meinen, dann suche doch schon mal Deinen Besen. Denn ..
Nutze die ISE @Nagus. Dann passieren solche Fehler nicht
..., nein, ganz sicher nicht. Warum auch?

Aber sicherlich meinst Du Intellisense? face-wink face-wink face-wink

Eigentlich meinte ich Intellisence, aber die automatische Korrektur auf dem mobile wusste es wieder mal besser face-wink
Mitglied: Nagus
Nagus 02.11.2019 um 03:01:37 Uhr
Goto Top
Danke für die Lösung - ich habe es nicht gesehen - und ich nutze die ISE!
Es ist immer einfach zu lästern, die Leute die einem helfen sind mir deswegen lieber!
Thx emeriks face-smile
Mitglied: mayho33
mayho33 02.11.2019 um 11:16:06 Uhr
Goto Top
Zitat von @Nagus:

Danke für die Lösung - ich habe es nicht gesehen - und ich nutze die ISE!
Es ist immer einfach zu lästern, die Leute die einem helfen sind mir deswegen lieber!
Thx emeriks face-smile

Wer hat den gelästert? Naja! Vielleicht doch ein wenig! face-wink liegt eventuell daran, dass meine Kollegen ständig mit dem gleichen Problem zu mir kommen. Die Scripten in in irgendeinem Editor und wundern sich dann, wenn sie den Fehler nicht finden.

Sorry dafür!
Mitglied: 141575
141575 02.11.2019 aktualisiert um 16:27:57 Uhr
Goto Top
Hi,
dein Skript weist mehrere gravierende Fehler auf dir dir zum Verhängnis werden können.

Fangen wir an :

$OU_Monate = Get-ADOrganizationalUnit -Filter '*' -SearchBase "OU=Mitarbeiter_Ausgetreten,OU=XYZ,DC=DOMAIN,DC=LÄNDERKÜRZEL" -SearchScope OneLevel | select @{l='OU';e={$_.DistinguishedName.split(',').split('=')[1]}}
Fehler hier: du splitest den CN der OU anhand des Kommas. Das ist falsch, denn ein OU Namen kann regulär ein Komma enthalten! Sollte also eine OU ein Komma im Namen haben was völlig legitim ist fällt dir das auf die Fresse.
Außerdem ist das ganze Gebilde völlig überflüssig, da du ganz einfach an den Namen über die Property "Name" kommst face-wink
$OU_Monate = Get-ADOrganizationalUnit -Filter '*' -SearchBase "OU=Mitarbeiter_Ausgetreten,OU=XYZ,DC=DOMAIN,DC=LÄNDERKÜRZEL" -SearchScope OneLevel | select -ExpandProperty Name
Wenn man den Namen unbedingt aus dem DN extrahieren wollte könnte man das z.B. über Regex tun:
Get-ADOrganizationalUnit -Filter * | select @{n='OU';e={[regex]::match($_.DistinguishedName,'(?is)(?<=OU=).*?(?=,(OU|DC))').Value}}

Dann zum nächsten
$OU_Monate -match "$select"
Das hier zeigt zwar deine Auswahl am Bildschirm an, die Auswahl wird aber nirgendwo gespeichert. $OU_Monate bleibt also ein ungefiltertes Array als ganzes.
Außerdem wird dir das falsche Ergebnisse liefern wenn du z.B. eine 1 ohne eine führende Null in der Eingabe eingibst dann matcht das (-match ist ja Regex!) außer dem
  • 01 - Januar
unter anderem auch diese
  • 10 - Oktober
  • 11 - November
  • 12 - November
Richtiger wäre hier also bspw.
$OU_Monate = Get-ADOrganizationalUnit -Filter '*' -SearchBase "OU=Mitarbeiter_Ausgetreten,OU=XYZ,DC=DOMAIN,DC=LÄNDERKÜRZEL" -SearchScope OneLevel | select -ExpandProperty Name  
$select = Read-Host -Prompt "Bitte den Monat als Zahl eingeben, für den das Script ausgeführt werden soll!"  
$OU_Monate | ?{$_ -like "$(([string]$select).padleft(2,'0'))*"} | %{  
    $liste = "C:\Scripte\Powershell\Austritte_$_.txt"  
    if (Test-Path $liste){
        $MoveUserListe = Get-Content $liste
    }
}

Da kann man echt nur hoffen das du das nicht schon produktiv irgendwo einsetzt ...

CW
Mitglied: Nagus
Nagus 04.11.2019 um 10:55:32 Uhr
Goto Top
Guten Morgen Chickenwing,
vielen Dank für Deine ausführliche und etwas niederschmetternde Rückmeldung.
Produktiv war bis jetzt immer nur ein Einzeiler, der das pro Monat erledigt hat und nicht von mir war. Da ich das als gute Gelegenheit gesehen habe, mich mal ein wenig mit PS auseinanderzusetzen habe ich das versucht generischer umzusetzen.

Allerdings bin ich bei dem Teil verloren:
$OU_Monate | ?{$_ -like "$(([string]$select).padleft(2,'0'))*"} | %{  
    $liste = "C:\Scripte\Powershell\Austritte_$_.txt"  
    if (Test-Path $liste){
        $MoveUserListe = Get-Content $liste

Was bewirkt das Fragezeichen nach der Pipe?
Was bewirkt das Prozent Zeichen nach der Pipe?
Beim padleft nimmst Du soweit ich das verstanden habe die ersten beiden Zeichen von Links zum vergleichen.
Was passiert hier? Test-Path $liste

Thx
Nagus
Mitglied: 141575
Lösung 141575 04.11.2019 aktualisiert um 11:21:22 Uhr
Goto Top
Zitat von @Nagus:
Allerdings bin ich bei dem Teil verloren:
$OU_Monate | ?{$_ -like "$(([string]$select).padleft(2,'0'))*"} | %{  
>     $liste = "C:\Scripte\Powershell\Austritte_$_.txt"  
>     if (Test-Path $liste){
>         $MoveUserListe = Get-Content $liste

Was bewirkt das Fragezeichen nach der Pipe?
Das ist ein Alias für ein Where-Object, es prüft also die Bedingung innerhalb der {} und filtert entsprechende Objekte aus der Pipeline heraus die der Bedingung entsprechen.
Was bewirkt das Prozent Zeichen nach der Pipe?
Das ist ein Alias für ein Foreach-Object, verarbeitet alle Objekte der Pipeline die vorher mit dem Where-Object (?{}) herausgefiltert wurden.
Beim padleft nimmst Du soweit ich das verstanden habe die ersten beiden Zeichen von Links zum vergleichen.
Das Padleft bewirkt das einstellige Eingaben des Users immer mit einer führenden 0 ergänzt werden. Eingaben mit 2 Zeichen werden damit nicht geändert da sie schon zweistellig sind, nur eben 1-9 werden jeweils um eine 0 ergänzt damit der Vergleich korrekt ist.
Was passiert hier? Test-Path $liste
Das prüft ob die Datei überhaupt im jeweiligen Pfad existiert. Würde sie das nicht würde das Auslesen des Pfades ja zu einer Fehlermeldung führen.
Mitglied: Nagus
Nagus 05.11.2019 um 20:12:55 Uhr
Goto Top
Vielen Dank! Verstanden und jetzt klappt das wie es soll!