Powershell: Script funktioniert nach Einteilung in Funktionen nicht mehr richtig...
Hallo Zusammen
Ich habe ja in letzter Zeit häufiger was wegen Powershell gepostet. Grundsätzlich funktioniert das Script, nur wollte ich jetzt noch alles in Funktionen zusammenfassen, damit ich eine bessere Übersicht habe um dann das Script zu erklären usw...nur leider werden wie es scheint gewisse globale Variabeln nicht so weitergegeben wie gewollt, denn das löschen der Benutzer (DeleteUser) und das erstellen der Log-Datei funktioniert nicht mehr richtig (CreateLog). Ich vermute, dass die Variabeln nicht mehr richtig erkannt werden und deshalb die Funktion nicht richtig ausgegeben wird.
Es ist hier nicht gerade übersichtlich, deswegen habe ich noch die eigentliche PS-1-Datei auf Dropbox freigegeben, dann könnt ihr es schön formatiert im Editor ansehen:
https://www.dropbox.com/s/bsb69u8evv425ny/MAC_Benutzerverwaltung1.1.ps1
Es ist ein ziemlich grosses Script, aber ich habe es versucht möglichst gut zu formatieren:
(die *-Zeichen waren in schönen reihen, als ich es im Editor erstellt habe *hust*^^)
Vielleicht seht ihr ja, wo genau der Fehler liegt.
Besten Dank für das Überprüfen.
Gruss
gabeBU
Ich habe ja in letzter Zeit häufiger was wegen Powershell gepostet. Grundsätzlich funktioniert das Script, nur wollte ich jetzt noch alles in Funktionen zusammenfassen, damit ich eine bessere Übersicht habe um dann das Script zu erklären usw...nur leider werden wie es scheint gewisse globale Variabeln nicht so weitergegeben wie gewollt, denn das löschen der Benutzer (DeleteUser) und das erstellen der Log-Datei funktioniert nicht mehr richtig (CreateLog). Ich vermute, dass die Variabeln nicht mehr richtig erkannt werden und deshalb die Funktion nicht richtig ausgegeben wird.
Es ist hier nicht gerade übersichtlich, deswegen habe ich noch die eigentliche PS-1-Datei auf Dropbox freigegeben, dann könnt ihr es schön formatiert im Editor ansehen:
https://www.dropbox.com/s/bsb69u8evv425ny/MAC_Benutzerverwaltung1.1.ps1
Es ist ein ziemlich grosses Script, aber ich habe es versucht möglichst gut zu formatieren:
<#***********************************************************************************************************************************************************************************************************************************
*Titel: MAC Benutzerverwaltung
*Ersteller: Gabriel Buehler
*Erstellungsdatum: 26.02.2014
*Bearbeitungsdatum:
*Beschreibung: Mit diesem Script ist es möglich, alle MAC-Adressbenutzer zu verwalten und auch gleich automatisch zu löschen.
*Version: 1.1
***********************************************************************************************************************************************************************************************************************************#>
#Importierung des Moduls für das Arbeiten mit Active Directory
Import-Module ActiveDirectory
#Gruppenrichtlinie Updaten
#gpupdate /force
#******************************Funktion: Hauptmenü***************************************************************************************************************************************************************************************
#
function Menue
{
Write-host "*******************HAUPTMENÜ******************************";
Write-host "Willkommen zur MAC Benutzerverwltung. *";
write-host "*1. Benutzer aus der CSV erstellen *";
write-host "*2. Erklaerung des Ablaufes *";
write-host "*3. Programm beenden *";
write-host "**********************************************************";
$global:Eingabe = read-host "Eingabe";
}
function Variabeln
{
#******************************Importierung***********************************************************************************************************************************************************************************
#Importierung der CSV-Datei
$global:Import = @(Import-CSV \\IPASRV01\Transfer\MACAdresslist.csv)
#******************************Importierung***********************************************************************************************************************************************************************************
#******************************Pfad*******************************************************************************************************************************************************************************************
#HIER EINZIGE ÄNDERUNG VORNEHMEN Stammpfad der uebergeordneten Organisationseinheiten
$global:OUPath = "OU=Machines,OU=IPA,DC=IPA,DC=LOKAL";
#*****************************************************************************************************************************************************************************************************************************
#*********************************Benutzername********************************************************************************************************************************************************************************
#Zaehler fuer das Abfragen jeder Reihe
$global:Zaehler = 0;
#Reihenzaehler fuer das Zaehlen der Reihen
$global:Reihenzaehler = Import-CSV \\IPASRV01\Transfer\MACAdresslist.csv | Measure-Object
$global:Reihenzaehler.Count
#Benutzername fuer die Passwortzuweisung
#Jede Zeile mit der Zahl Zaehler (Zahl, die in einer DO-While-Schleife hochgezaehlt wird) den Wert "SamAccontName" (Kontoname)
$global:Benutzername = $global:Import[$global:Zaehler].SamAccountName
#*********************************************************************************************************************************************************************************************************************************
#******************************1. Teil Vergleichsvariabeln************************************************************************************************************************************************************************
#Alle ADUser auswerfen für den direkten Vergleich mit der CSV-Datei
$global:allADUsers = Get-ADUser -Filter * -SearchBase $global:OUPath | select -ExpandProperty SamAccountName
#Der Anzeigename (fuer die Log-Dateien)
$global:allAdusersgiven = Get-ADUser -Filter * -SearchBase $global:OUPath | select -ExpandProperty GivenName
#Alle Benutzer der CSV-Datei
#Der Anzeigename der Nutzer, die in der CSV eingetragen sind
$global:allCSVUsersgiven = $global:Import | select -ExpandProperty GivenName
#*********************************************************************************************************************************************************************************************************************************
#******************************Importierung***************************************************************************************************************************************************************************************
#Importierung der CSV-Datei
$global:Import = @(Import-CSV \\IPASRV01\Transfer\MACAdresslist.csv)
#******************************Importierung***************************************************************************************************************************************************************************************
#******************************Pfad***********************************************************************************************************************************************************************************************
#HIER EINZIGE ÄNDERUNG VORNEHMEN Stammpfad der uebergeordneten Organisationseinheiten
$global:OUPath = "OU=Machines,OU=IPA,DC=IPA,DC=LOKAL";
#*********************************************************************************************************************************************************************************************************************************
#*********************************Benutzername************************************************************************************************************************************************************************************
#Zaehler fuer das Abfragen jeder Reihe
$global:Zaehler = 0;
#Reihenzaehler fuer das Zaehlen der Reihen
$global:Reihenzaehler = Import-CSV \\IPASRV01\Transfer\MACAdresslist.csv | Measure-Object
$global:Reihenzaehler.Count
#Benutzername fuer die Passwortzuweisung
#Jede Zeile mit der Zahl Zaehler (Zahl, die in einer DO-While-Schleife hochgezaehlt wird) den Wert "SamAccontName" (Kontoname)
$global:Benutzername = $global:Import[$global:Zaehler].SamAccountName
#*********************************************************************************************************************************************************************************************************************************
#******************************1. Teil Vergleichsvariabeln************************************************************************************************************************************************************************
#Alle ADUser auswerfen für den direkten Vergleich mit der CSV-Datei
$global:allADUsers = Get-ADUser -Filter * -SearchBase $global:OUPath | select -ExpandProperty SamAccountName
#Der Anzeigename (fuer die Log-Dateien)
$global:allAdusersgiven = Get-ADUser -Filter * -SearchBase $global:OUPath | select -ExpandProperty GivenName
#Alle Benutzer der CSV-Datei
$global:allCSVUsers = $global:Import | select -ExpandProperty SamAccountName
#Der Anzeigename der Nutzer, die in der CSV eingetragen sind
$global:allCSVUsersgiven = $global:Import | select -ExpandProperty GivenName
#*********************************************************************************************************************************************************************************************************************************
#******************************2. Teil Vergleichsvariabel zwischen AD und CSV*****************************************************************************************************************************************************
#Try-Funktion, damit kein Fehler ausgegeben wird (falls sich kein Benutzer in der Active Directory oder im CSV befinden sollte).
#try
#{
#Vergleich zwischen der CSV und der AD, damit später alle Benutzer gelöscht werden, die sich nicht in der AD befinden.
#Compare-Object Vergleich
#Referenz: Alle Benutzer in der CSV
#Differenz: Alle Benutzer die in der CSV sind
#?{$global:_.SideIndicator -eq "<="} : Speichere diese Nutzer in der Variabel, die zwar in der ersten Variabel enthalten sind, aber NICHT in der zweiten
#select -ExpandProperty InputObject: Wähle das Input-Object (also das Objekt, dass in die Pipeline für das Auswaehlen gebracht wurde, hier die Variable allusernotincsv
#Erroraction Silently-Continue: Keine Fehlermeldung ausgeben
#*****************************************************************************************************************************************************************************************************************************
#AllusersnotinCSV der sAMAccountname entspricht der MAC-Adresse (der Kontonname). Dieser Vergleich wird fuer das eigentliche loeschen Verwendet.
$global:allUsersNotInCSV = Compare-Object -ReferenceObject $global:allADUsers -DifferenceObject $global:allCSVUsers | ?{$global:_.SideIndicator -eq "<="} | select -ExpandProperty InputObject -erroraction SilentlyContinue
#AllusersnotinCSVgiven mit dem givenName wird fuer die Ausgabe der Anzeigename verwendet damit man weiss, welche Maschinen gelöscht werden.
$global:allUsersNotInCSVgiven = Compare-Object -ReferenceObject $global:allADUsersgiven -DifferenceObject $global:allCSVUsersgiven | ?{$global:_.SideIndicator -eq "<="} | select -ExpandProperty InputObject -erroraction SilentlyContinue
# }
#Catch Abfangen und Ausgabe der Fehlermeldung (falls gewünscht)
#catch
#{
#}
# finally
#{
#}
}
#*****************************************************************************************************************************************************************************************************************************************************
function CreateUser
{
#******************************Benutzer wird erstellt*********************************************************************************************************************************************************************************************
#-i: Importmodus, Benutzer wird Importiert und nicht exportiert, deswegen muss der -i Parameter angegeben werden
#-k: Keine Fehlermeldung angeben
#-f: Dateiname der zu Importierenden Datei (hier: MACAdresslist.csv)
#-j: Log-Datei erstellen.
##******************************Benutzer wird erstellt********************************************************************************************************************************************************************************************
#Benutzer wird aus der CSV erstellt, mit
csvde -i -k -f \\IPASRV01\Transfer\MACAdresslist.csv -j C:\
#Erstelle eine Log-Datei und exportiere sie in eine CSV, damit sie später weiterverarbeitet werden kann.
$global:importcsvdelog = import-csv C:\csv.log | export-csv \\IPASRV01\Transfer\logs\csvde.csv
#Importiere direkt die exportierte CSV.
$global:importcsvde = import-csv \\IPASRV01\transfer\logs\csvde.csv
}
#******************************************************************************************************************************************************************************************************************************************************
function Createlog
{
#*******************************************Log-Dateien schreiben ************************************************************************************************************************************************************
$global:log = @()
#foreach($global:line in $global:importcsvde)
#{
# $global:log += New-Object PSObject -Property @{Titel="Neue User";Wert=$global:line}
#}
$global:log += New-Object PSObject -Property @{Titel = "Geloeschte User `n"; Wert = "$global:allusersnotincsvgiven"}
$global:log += New-Object PSObject -Property @{Titel = "MAC-Adresse `n"; Wert = "$global:allusersnotincsv"}
$global:log | select Titel,Wert | export-csv -Path "\\IPASRV01\Transfer\logs\MACLog.csv" -NoTypeInformation -Delimiter ";"
}
#***************************************************************************************************************************************************************************************************************************************************
function CreatePassword
{
#If-Abfrage, falls die CSV-Datei leer sein sollte.
if ($global:Reihenzaehler.count -ne 0)
{
#Do-While-Schleife fuer das Abzaehlen der Reihen und der Zuweisung des Passwortes
do
{
write-host "bisch sogar id schleife vom PW cho^^";
#Passwort setzen. Identity ist der Benutzername, das Passwort ist auch der Benutzername (MAC-Adresse).
try
{
Set-AdAccountPassword -Identity $global:Benutzername -PassThru -Reset -Newpassword (ConvertTo-Securestring $global:Benutzername -Asplaintext -force)
}
catch
{
}
#Weiterführung des Scriptes
finally
{
}
#Zaehler wird erhöht um 1
$global:Zaehler = $global:Zaehler + 1
#Führe die Schleife solange aus, bis alle Reihen durch sind.
}while($global:Zaehler -ne $global:Reihenzaehler.Count)
}
}
#****************************************************************************************************************************************************************************************************************************************************
function DeleteUser
{
#********************Benutzer werden gelöscht die sich nicht in der CSV-Datei befinden.*****************************************************************************************************************************************************************************************
#Alle Benutzer, die sich nicht in der CSV befinden, aber in der Active Directory vorhanden sind.
foreach ($line in $global:allUsersNotInCSV)
{
#Try-Funktion, damit kein Fehler ausgegeben wird.
try
{
write-host "hoi";
echo "Lösche Benutzer: $global:line ..."
Remove-ADUser -Identity $global:line -Confirm:$global:false
}
#Catch Abfangen und Ausgabe der Fehlermeldung (falls gewünscht)
catch
{
}
#Weiterführung des Scriptes
finally
{
}
}
}
#Do-while Schleife die solange ausgeführt wird, eine 3 eingegeben wird.
Do
{
#Führe die Funktion "Menue" aus
Menue;
if ($global:Eingabe -eq 1)
{
#Fuehre die Funktion Variables aus
variabeln;
#Führe die Funtkion "create user" aus
#CreateUser;
#Führe die Funktion "create log" aus
CreateLog;
#Führe die Funktion "create Password" aus
CreatePassword;
#Führe die Funktion "Delete User" aus
DeleteUser;
}
#********************************************************************************************************************************************************************************************************************************
if($global:Eingabe -eq 2)
{
write-host "*******************Ablauf**********************************************************************************************";
write-host "*Die MAC Benutzerverwaltung erstellt mit Hilfe von einer CSV-Datei Benutzer und löscht gleich auch automatisch diese, *";
write-host "*die nicht in der Liste eingetragen sind / bzw. sich auch in der Active Directory befinden. *";
write-host "*Beachten Sie die Kommentare im Script fuer weitere Informationen. Bei Fragen wenden Sie sich an Gabriel Bühler *";
write-host "***********************************************************************************************************************";
}
#Fuehre die Schleife solange aus, bis das Programm mit der Eingabe 3 beendet werden soll.
}while($global:Eingabe -ne 3)
(die *-Zeichen waren in schönen reihen, als ich es im Editor erstellt habe *hust*^^)
Vielleicht seht ihr ja, wo genau der Fehler liegt.
Besten Dank für das Überprüfen.
Gruss
gabeBU
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 233175
Url: https://administrator.de/forum/powershell-script-funktioniert-nach-einteilung-in-funktionen-nicht-mehr-richtig-233175.html
Ausgedruckt am: 04.04.2025 um 01:04 Uhr
3 Kommentare
Neuester Kommentar
Hallo gabe,
du mischst hier globale und lokale Variablen. Einer der Fehler in DeleteUser:
$line ist eine lokale Variable der Schleife und bekommt deshalb kein $global. Und was soll das $global:false ? hier reicht ein einfaches $false.
Also wirklich nur die Variablen global definieren die du wirklich außerhalb einer Funktion weiter benötigst. Einfach vor alles $global zu setzen bringt nur Fehler.
Hier hilft nur Schritt für Schritt noch mal alles durchzugehen.
Grüße Uwe
du mischst hier globale und lokale Variablen. Einer der Fehler in DeleteUser:
Remove-ADUser -Identity $global:line -Confirm:$global:false
Also wirklich nur die Variablen global definieren die du wirklich außerhalb einer Funktion weiter benötigst. Einfach vor alles $global zu setzen bringt nur Fehler.
Hier hilft nur Schritt für Schritt noch mal alles durchzugehen.
Grüße Uwe