JensGoro 0 Geschrieben 2. März 2022 Melden Geschrieben 2. März 2022 (bearbeitet) Hi zusammen, wir haben ein Script zum auswählen eines Standard Drucker, welches leider mittlerweile einen Fehler auswirft. Fehler: <# Automatisierung Export. Werte aus der Active Directory in die config_file exportieren. Syntax config_file [username];[printername] #> ### Parameter ### $config_file = "\\SERVER\NETLOGON\default_printers\default_printer.txt" $config_file_temp = "\\SERVER\NETLOGON\default_printers\default_printer_temp.txt" $ADAttribut = "extensionAttribute13" ### Code ### import-module ActiveDirectory $t = ';' $Users = get-aduser -Filter * foreach($User in $Users) { $attribut = Get-ADUser $User.SamAccountName -Properties * | select -Property $ADAttribut $username = $User.SamAccountName $parameter = $username + $t + $attribut $parameter = $parameter.TrimEnd('}') $parameter = $parameter -replace ‘@{extensionAttribute13=’,'' If(!$parameter.Split(";")[1]) { $parameter = "" } else { $parameter | Out-File -FilePath $config_file_temp -Append } } Copy-Item $config_file_temp $config_file Remove-Item $config_file_temp Exit Anbei der Code: <# GUI für die Automatisierung des Standarddruckers #> ### Parameter ### $printer_list_file = "\\SERVER\NETLOGON\default_printers\printers.txt" $dir = "\\SERVER\NETLOGON\default_printers\" ### LOAD ### [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") import-module ActiveDirectory $printers = Get-Content -Path $printer_list_file -Encoding UTF8 ### CODE ### #------------------------------------------------------------------------------------------- # Fenster 1 $objForm = New-Object System.Windows.Forms.Form $objForm.Text = "Standarddrucker setzten" $objForm.Size = New-Object System.Drawing.Size(300,600) $objForm.StartPosition = "CenterScreen" $objForm.KeyPreview = $True $objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") {$x=$objListBox.SelectedItem;$objForm.Close()}}) $objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") {$objForm.Close()}}) $OKButton = New-Object System.Windows.Forms.Button $OKButton.Location = New-Object System.Drawing.Size(60,540) $OKButton.Size = New-Object System.Drawing.Size(75,23) $OKButton.Text = "OK" $OKButton.Add_Click({$username=$objListBox.SelectedItem;$objForm.Close()}) $objForm.Controls.Add($OKButton) $CancelButton = New-Object System.Windows.Forms.Button $CancelButton.Location = New-Object System.Drawing.Size(150,540) $CancelButton.Size = New-Object System.Drawing.Size(75,23) $CancelButton.Text = "Abbrechen" $CancelButton.Add_Click({$objForm.Close() $username = ""}) $objForm.Controls.Add($CancelButton) $objLabel = New-Object System.Windows.Forms.Label $objLabel.Location = New-Object System.Drawing.Size(10,20) $objLabel.Size = New-Object System.Drawing.Size(280,20) $objLabel.Text = "Bitte einen Benutzer auswählen:" $objForm.Controls.Add($objLabel) $objListBox = New-Object System.Windows.Forms.ListBox $objListBox.Location = New-Object System.Drawing.Size(10,40) $objListBox.Size = New-Object System.Drawing.Size(260,20) $objListBox.Height = 480 # Fenster 1 CODE $Users = get-aduser -Filter * foreach($User in ($Users|sort)) { $username_blank = $User.Name $username_logon = $User.SamAccountName [void] $objListBox.Items.Add($username_blank + " " +"(" + $username_logon + ")") } $objForm.Controls.Add($objListBox) $objForm.Topmost = $True $objForm.Add_Shown({$objForm.Activate()}) [void] $objForm.ShowDialog() #------------------------------------------------------------------------------------------- # Fenster 2 $objForm = New-Object System.Windows.Forms.Form $objForm.Text = "Standarddrucker setzten" $objForm.Size = New-Object System.Drawing.Size(300,600) $objForm.StartPosition = "CenterScreen" $objForm.KeyPreview = $True $objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") {$x=$objListBox.SelectedItem;$objForm.Close()}}) $objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") {$objForm.Close()}}) $OKButton = New-Object System.Windows.Forms.Button $OKButton.Location = New-Object System.Drawing.Size(60,540) $OKButton.Size = New-Object System.Drawing.Size(75,23) $OKButton.Text = "OK" $OKButton.Add_Click({$printername=$objListBox.SelectedItem;$objForm.Close()}) $objForm.Controls.Add($OKButton) $CancelButton = New-Object System.Windows.Forms.Button $CancelButton.Location = New-Object System.Drawing.Size(150,540) $CancelButton.Size = New-Object System.Drawing.Size(75,23) $CancelButton.Text = "Abbrechen" $CancelButton.Add_Click({$objForm.Close() $printername = ""}) $objForm.Controls.Add($CancelButton) $objLabel = New-Object System.Windows.Forms.Label $objLabel.Location = New-Object System.Drawing.Size(10,20) $objLabel.Size = New-Object System.Drawing.Size(280,20) $objLabel.Text = "Bitte einen Drucker auswählen:" $objForm.Controls.Add($objLabel) $objListBox = New-Object System.Windows.Forms.ListBox $objListBox.Location = New-Object System.Drawing.Size(10,40) $objListBox.Size = New-Object System.Drawing.Size(260,20) $objListBox.Height = 480 # Fenster 2 CODE [void] $objListBox.Items.Add("< Löschen >") $Users = get-aduser -Filter * foreach($printer in ($printers|sort)) { [void] $objListBox.Items.Add($printer) } $objForm.Controls.Add($objListBox) $objForm.Topmost = $True $objForm.Add_Shown({$objForm.Activate()}) [void] $objForm.ShowDialog() #------------------------------------------------------------------------------------------- # CODE $username = $username.TrimEnd(')') $username_blank = $username.Split("(")[0] $username_blank = $username_blank.Trim() $username = $username.Split("(")[1] If($username -and $printername) { $switch = 1 } If($printername -eq "< Löschen >") { $switch = 2 } If(!$username -or !$printername) { $switch = 3 } switch ($switch) { 1 { Set-ADUser $username –replace @{extensionAttribute13=$printername} $dir = $dir + "default_printer_Export.ps1" & $dir $ausgabe = "Der Standardrucker des Benutzers $username_blank wurde auf den Drucker `"$printername`" geändert." } 2 { Set-ADUser $username –replace @{extensionAttribute13="0"} Set-ADUser $username –remove @{extensionAttribute13="0"} $dir = $dir + "default_printer_Export.ps1" & $dir $ausgabe = "Der Standardrucker des Benutzers $username_blank wurde gelöscht." } 3 { $ausgabe = "Kein Wert angegeben" } default { $ausgabe = "Fehler" } } #------------------------------------------------------------------------------------------- # Fenster 3 $objForm = New-Object System.Windows.Forms.Form $objForm.Text = "Standarddrucker setzten" $objForm.Size = New-Object System.Drawing.Size(300,160) $objForm.StartPosition = "CenterScreen" $objForm.KeyPreview = $True $objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") {$x=$objListBox.SelectedItem;$objForm.Close()}}) $objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") {$objForm.Close()}}) $OKButton = New-Object System.Windows.Forms.Button $OKButton.Location = New-Object System.Drawing.Size(108,100) $OKButton.Size = New-Object System.Drawing.Size(75,23) $OKButton.Text = "OK" $OKButton.Add_Click({$objForm.Close()}) $objForm.Controls.Add($OKButton) $objLabel = New-Object System.Windows.Forms.Label $objLabel.Location = New-Object System.Drawing.Size(10,20) $objLabel.Size = New-Object System.Drawing.Size(280,60) $objLabel.Text = $ausgabe $objForm.Controls.Add($objLabel) $objForm.Topmost = $True $objForm.Add_Shown({$objForm.Activate()}) [void] $objForm.ShowDialog() Exit Kann mir jemand helfen, den Fehler zu fixen? :) bearbeitet 3. März 2022 von JensGoro Zitieren
BOfH_666 585 Geschrieben 2. März 2022 Melden Geschrieben 2. März 2022 Jens, Willkommen im MSCEboard. Bevor wir richtig loslegen - könntest Du bitte den Code als Code formatieren? Einfach auf das entsprechende Symbol ( </> ) in der Bearbeitungsleiste klicken und den Code dann darüber einfügen. Danke schon mal im Voraus. Am 2.3.2022 um 15:06 schrieb JensGoro: wir haben ein Script zum auswählen eines Standard Drucker, welches leider mittlerweile einen Fehler auswirft. Mehr ... wir? ... mittlerweile? ... das klingt für mich danach, als wäre das Script nicht von Dir und als hätte es vorher funktioniert, richtig? Was hat sich geändert? Und kannst Du den Autor des Scriptes nicht um Hilfe bitten? Davon mal abgesehen, sind die Fehlermeldungen ziemlich eindeutig. Am 2.3.2022 um 15:06 schrieb JensGoro: In \\herakles\NETLOGON\default_printers\Standdarddrucker_Setzten.ps1:137 Mehr Am 2.3.2022 um 15:06 schrieb JensGoro: In \\herakles\NETLOGON\default_printers\Standdarddrucker_Setzten.ps1:139 Mehr In den Zeilen 137 und 139 wird versucht eine Methode - in beiden Fällen .Split() - auf ein Objekt anzuwenden, welches den Wert Null hat ... also vermutlich leer ist. In beiden Fällen ist es die Variable $username. 1 Zitieren
Sunny61 820 Geschrieben 2. März 2022 Melden Geschrieben 2. März 2022 Am 2.3.2022 um 15:06 schrieb JensGoro: Standdarddrucker_Setzten.ps1 Mehr BTW: Da ist ein t zu viel, es heißt Setzen. ;) Zitieren
cj_berlin 1.409 Geschrieben 2. März 2022 Melden Geschrieben 2. März 2022 Am 2.3.2022 um 17:04 schrieb Sunny61: BTW: Da ist ein t zu viel, es heißt Setzen. ;) Mehr ...und auch 2x d zuviel 2 Zitieren
MurdocX 965 Geschrieben 2. März 2022 Melden Geschrieben 2. März 2022 Hallo JensGoro, willkommen an/im Board. Am 2.3.2022 um 15:06 schrieb JensGoro: {$x=$objListBox.SelectedItem;$objForm.Close()}}) Mehr $objListBox wurde vorher nicht definiert. Es existiert also nicht. Am 2.3.2022 um 15:06 schrieb JensGoro: $objListBox = New-Object System.Windows.Forms.ListBox $objListBox.Location = New-Object System.Drawing.Size(10,40) $objListBox.Size = New-Object System.Drawing.Size(260,20) $objListBox.Height = 480 Mehr Das ist der Grund warum das Object oben nicht existiert, denn es kommt erst ab Zeile 53, aufgerufen wird es schon in Zeile 28. Das funktioniert so nicht. Das muss < Zeile 27. Vermeide Abkürzungen, wie z.B. "sort". Es sollte heißen Sort-Object. Das macht den Code lesbarer und weniger fehleranfällig. $switch - ist eine Iterationsvariable, die Powershell ohne wenn und aber überschreiben kann. Verwende einen treffenderen Namen. $printername - ist eine Variable die gesetzt, aber nie definiert wird. Sie ist also immer $null. Sie überschreibt sogar immer das Attribute extensionAttribute13 im AD. $x - ist eine Variable die zwar in der Zeile 36 definiert, aber nie genutzt wird. Alles was also in der ListBox ausgewählt wird, geht ins Nirvana. Das übrigens 2x. Das Skript sollte dringend überarbeitet werden. 2 Zitieren
Sunny61 820 Geschrieben 2. März 2022 Melden Geschrieben 2. März 2022 Am 2.3.2022 um 18:59 schrieb MurdocX: Vermeide Abkürzungen, wie z.B. "sort". Es sollte heißen Sort-Object. Das macht den Code lesbarer und weniger fehleranfällig. $printername - ist eine Variable die gesetzt, aber nie definiert wird. Sie ist also immer $null. $x - ist eine Variable die zwar in der Zeile 36 definiert, aber nie genutzt wird. Alles was also in der ListBox ausgewählt wird, geht ins Nirvana. Das übrigens 2x. Mehr Genau deshalb empfehle ich uneingeschränkt Visual Studio Code als Editor für Powershell Scripte. Da wird man auf viele solche Fehler hingewiesen, incl. Korrekturmaßnahmen. 1 Zitieren
JensGoro 0 Geschrieben 3. März 2022 Autor Melden Geschrieben 3. März 2022 Am 2.3.2022 um 18:59 schrieb MurdocX: Hallo JensGoro, willkommen an/im Board. $objListBox wurde vorher nicht definiert. Es existiert also nicht. Das ist der Grund warum das Object oben nicht existiert, denn es kommt erst ab Zeile 53, aufgerufen wird es schon in Zeile 28. Das funktioniert so nicht. Das muss < Zeile 27. Vermeide Abkürzungen, wie z.B. "sort". Es sollte heißen Sort-Object. Das macht den Code lesbarer und weniger fehleranfällig. $switch - ist eine Iterationsvariable, die Powershell ohne wenn und aber überschreiben kann. Verwende einen treffenderen Namen. $printername - ist eine Variable die gesetzt, aber nie definiert wird. Sie ist also immer $null. Sie überschreibt sogar immer das Attribute extensionAttribute13 im AD. $x - ist eine Variable die zwar in der Zeile 36 definiert, aber nie genutzt wird. Alles was also in der ListBox ausgewählt wird, geht ins Nirvana. Das übrigens 2x. Das Skript sollte dringend überarbeitet werden. Mehr Vielen lieben dank erst einmal an alle, es ist korrekt, dass das Script nicht von mir stammt, ich habe es auch nur übernommen und habe nur eingeschränkt erfahrung mit Scripten. Könnte mir jemand den Code ggf. überarbeiten? Ich weiß, es klingt frech, aber ich bin etwas hilflos :( Zitieren
cj_berlin 1.409 Geschrieben 3. März 2022 Melden Geschrieben 3. März 2022 Am 3.3.2022 um 06:29 schrieb JensGoro: Ich weiß, es klingt frech, aber ich bin etwas hilflos :( Mehr Frech nicht, wird nur recht teuer Zitieren
JensGoro 0 Geschrieben 3. März 2022 Autor Melden Geschrieben 3. März 2022 Am 3.3.2022 um 06:46 schrieb cj_berlin: Frech nicht, wird nur recht teuer Mehr Vielleicht frage ich anders ;) Hatjemand ein Script, welches ich nutzen kann, um AD-Usern einen Standard Drucker zu setzen? :) Würde mich sehr freuen. Zitieren
MurdocX 965 Geschrieben 3. März 2022 Melden Geschrieben 3. März 2022 Ja, schau mal hier. https://www.compdesign.ch/app/easyweb/info?partno=Tipp-StandardDrucker 1 Zitieren
MurdocX 965 Geschrieben 8. März 2022 Melden Geschrieben 8. März 2022 Am 2.3.2022 um 21:35 schrieb Sunny61: Genau deshalb empfehle ich uneingeschränkt Visual Studio Code als Editor für Powershell Scripte. Da wird man auf viele solche Fehler hingewiesen, incl. Korrekturmaßnahmen. Mehr Alles Andere würde ich auch als einen fehleranfälligen Krampf bezeichnen Zitieren
daabm 1.391 Geschrieben 8. März 2022 Melden Geschrieben 8. März 2022 @MurdocX Naja, auch die "nackte" ISE weist schon auf vieles hin. Und es gäbe auch noch http://www.powertheshell.com/ und eine Handvoll ISE-Module, die da auch helfen. Muß nicht immer gleich VSCode sein Obwohl da natürlich die GIT-Integration hilfreich ist. Zitieren
MurdocX 965 Geschrieben 8. März 2022 Melden Geschrieben 8. März 2022 Am 8.3.2022 um 17:36 schrieb daabm: @MurdocX Naja, auch die "nackte" ISE weist schon auf vieles hin. Und es gäbe auch noch http://www.powertheshell.com/ und eine Handvoll ISE-Module, die da auch helfen. Mehr Da bin ich ganz bei Dir. Ich hab mir IseSteroids ganz früh schon gekauft. Das Teil ist genial Schade finde ich das es nicht mehr weiterentwickelt wird. Zitieren
daabm 1.391 Geschrieben 8. März 2022 Melden Geschrieben 8. März 2022 Powershell selbst (unter Windows) ja auch nicht mehr, daher paßt das schon. Hat Tobias auch selber vor 3 oder 4 Jahren schon erklärt, daß er da keinen Invest mehr macht :-( Zitieren
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.