Jump to content

Automatisierung Standarddruckers mit Powershell -> keine Methode für Ausdruck aufzurufen, der NULL ist


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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 von JensGoro
Link zu diesem Kommentar

Jens,

 

Willkommen im MSCEboard. :spock:

 

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

Link zu diesem Kommentar

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. :-) 

Link zu diesem Kommentar
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.

Link zu diesem Kommentar
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 :(

Link zu diesem Kommentar
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.

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...