JensGoro 0 Geschrieben 2. März 2022 Melden Teilen 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 Link zu diesem Kommentar
BOfH_666 577 Geschrieben 2. März 2022 Melden Teilen 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. vor 31 Minuten schrieb JensGoro: wir haben ein Script zum auswählen eines Standard Drucker, welches leider mittlerweile einen Fehler auswirft. ... 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. vor 33 Minuten schrieb JensGoro: In \\herakles\NETLOGON\default_printers\Standdarddrucker_Setzten.ps1:137 vor 33 Minuten schrieb JensGoro: In \\herakles\NETLOGON\default_printers\Standdarddrucker_Setzten.ps1:139 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 Link zu diesem Kommentar
Sunny61 806 Geschrieben 2. März 2022 Melden Teilen Geschrieben 2. März 2022 vor 1 Stunde schrieb JensGoro: Standdarddrucker_Setzten.ps1 BTW: Da ist ein t zu viel, es heißt Setzen. ;) Zitieren Link zu diesem Kommentar
cj_berlin 1.313 Geschrieben 2. März 2022 Melden Teilen Geschrieben 2. März 2022 vor 32 Minuten schrieb Sunny61: BTW: Da ist ein t zu viel, es heißt Setzen. ;) ...und auch 2x d zuviel 2 Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 2. März 2022 Melden Teilen Geschrieben 2. März 2022 Hallo JensGoro, willkommen an/im Board. vor 3 Stunden schrieb JensGoro: {$x=$objListBox.SelectedItem;$objForm.Close()}}) $objListBox wurde vorher nicht definiert. Es existiert also nicht. vor 3 Stunden 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 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 Link zu diesem Kommentar
Sunny61 806 Geschrieben 2. März 2022 Melden Teilen Geschrieben 2. März 2022 vor 2 Stunden 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. 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 Link zu diesem Kommentar
JensGoro 0 Geschrieben 3. März 2022 Autor Melden Teilen Geschrieben 3. März 2022 vor 11 Stunden 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. 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 Link zu diesem Kommentar
cj_berlin 1.313 Geschrieben 3. März 2022 Melden Teilen Geschrieben 3. März 2022 vor 12 Minuten schrieb JensGoro: Ich weiß, es klingt frech, aber ich bin etwas hilflos :( Frech nicht, wird nur recht teuer Zitieren Link zu diesem Kommentar
JensGoro 0 Geschrieben 3. März 2022 Autor Melden Teilen Geschrieben 3. März 2022 vor 9 Minuten schrieb cj_berlin: Frech nicht, wird nur recht teuer 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 Link zu diesem Kommentar
MurdocX 949 Geschrieben 3. März 2022 Melden Teilen Geschrieben 3. März 2022 Ja, schau mal hier. https://www.compdesign.ch/app/easyweb/info?partno=Tipp-StandardDrucker 1 Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 8. März 2022 Melden Teilen Geschrieben 8. März 2022 Am 2.3.2022 um 22: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. Alles Andere würde ich auch als einen fehleranfälligen Krampf bezeichnen Zitieren Link zu diesem Kommentar
daabm 1.354 Geschrieben 8. März 2022 Melden Teilen 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 Link zu diesem Kommentar
MurdocX 949 Geschrieben 8. März 2022 Melden Teilen Geschrieben 8. März 2022 vor 18 Minuten 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. 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 Link zu diesem Kommentar
daabm 1.354 Geschrieben 8. März 2022 Melden Teilen 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 Link zu diesem Kommentar
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.