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.
Wir erhalten die User, welche jeden Monat das Unternehmen verlassen, als Liste. Diese sollen in eine OU verschoben werden. Die Definition erfolgt mit
Als Ergebnis habe ich das Array:
Wenn ich bei
die Zahl 11 für November eingebe, erhalte ich das folgende Ergebnis:
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
Antwort
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 ...
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"
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 ...
Please also mark the comments that contributed to the solution of the article
Content-Key: 511152
Url: https://administrator.de/contentid/511152
Printed on: April 26, 2024 at 14:04 o'clock
10 Comments
Latest comment
Zitat von @emeriks:
???
Solltest Du Intelligenz meinen, dann suche doch schon mal Deinen Besen. Denn ..
Aber sicherlich meinst Du Intellisense?
![face-wink face-wink](/images/icons/fa/light/face-laugh-wink.svg)
???
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?
Eigentlich meinte ich Intellisence, aber die automatische Korrektur auf dem mobile wusste es wieder mal besser
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 face-smile](/images/icons/fa/light/face-smile.svg)
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
Wer hat den gelästert? Naja! Vielleicht doch ein wenig!
Sorry dafür!
![Mitglied: 141575 Mitglied: 141575](/images/members/profile_male_64x64.png)
Hi,
dein Skript weist mehrere gravierende Fehler auf dir dir zum Verhängnis werden können.
Fangen wir an :
Außerdem ist das ganze Gebilde völlig überflüssig, da du ganz einfach an den Namen über die Property "Name" kommst![face-wink face-wink](/images/icons/fa/light/face-laugh-wink.svg)
Wenn man den Namen unbedingt aus dem DN extrahieren wollte könnte man das z.B. über Regex tun:
Dann zum nächsten
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
Da kann man echt nur hoffen das du das nicht schon produktiv irgendwo einsetzt ...
CW
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
$OU_Monate = Get-ADOrganizationalUnit -Filter '*' -SearchBase "OU=Mitarbeiter_Ausgetreten,OU=XYZ,DC=DOMAIN,DC=LÄNDERKÜRZEL" -SearchScope OneLevel | select -ExpandProperty Name
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
- 10 - Oktober
- 11 - November
- 12 - November
$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: 141575 Mitglied: 141575](/images/members/profile_male_64x64.png)
Zitat von @Nagus:
Allerdings bin ich bei dem Teil verloren:
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.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?
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.