erikro
Goto Top

PS-Skript läuft bei händischer Ausführung, aber nicht als logon-Skript

Moin,

normalerweise bekommen unsere User per Skript einen Standarddrucker je nach Abteilung zugewiesen. Seit Kurzem gibt es auch Springer, die in verschiedenen Abteilungen tätig sind. Die sollen nun einen Dialog bekommen, in dem sie den Drucker je nach dem, wo sie gerade sind, auswählen sollen. Das Skript funktioniert, wenn ich es händisch ausführe. Wenn ich es aber als GPO als Start-Skript <edit>oops, ich meinte Logon-Skript</edit>einfüge, dann nicht. Es liegt im NETLOGON-Verzeichnis. Server ist 2012 R2. Der Client, mit dem ich teste, ist ein Win10.

Hier das Skript:

$date = Get-Date
out-file -FilePath $env:userprofile\documents\drucker.txt -InputObject "Drucker_springer wurde ausgeführt $date" -Append  
# Diese Zeile wird in das Log geschrieben.
Start-Sleep 20
# Das steht da, damit die Drucker auch wirklich alle da sind.

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$form = New-Object System.Windows.Forms.Form 
$form.Text = "Bitte Drucker auswählen"  
$form.Size = New-Object System.Drawing.Size(700,(130+80)) 
$form.StartPosition = "CenterScreen"  
$Font = New-Object System.Drawing.Font("Arial",10,[System.Drawing.FontStyle]::Regular)  

$form.Font = $Font

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Point(312,(42+80))
$OKButton.Size = New-Object System.Drawing.Size(76,27)
$OKButton.Text = "OK"  
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $OKButton
$form.Controls.Add($OKButton)


$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,14) 
$label.Size = New-Object System.Drawing.Size(480,20) 
$label.Text = "Wählen Sie einen Standarddrucker aus:"  
$form.Controls.Add($label) 

$listBox = New-Object System.Windows.Forms.ListBox 
$listBox.Location = New-Object System.Drawing.Point(10,42) 
$listBox.Size = New-Object System.Drawing.Size(660,80) 
$listBox.Height = 80
$listboxFont = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular)  
$listBox.font = $listboxFont

[void] $listBox.Items.Add("Drucker1")  
[void] $listBox.Items.Add("Drucker2")  
[void] $listBox.Items.Add("Drucker3")  

$form.Controls.Add($listBox) 

$form.Topmost = $True

$result = $form.ShowDialog()
out-file -FilePath $env:userprofile\documents\drucker.txt -InputObject "Drucker_springer Dialog anzeigen $date" -Append  
# Diese Zeile taucht im Log nicht auf, wenn ich das per GPO ausführen lasse.

if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
    $x = $listBox.SelectedItem
    $x
    $defaultprinter = $(Get-WmiObject -class win32_printer | Where-Object { $_.name -like "*$x*" })  
    # -like, weil das ein TS ist, der die Drucker vom Client bekommt. Daher haben die immer wieder unterschiedliche Namen.
    $defaultprinter.setdefaultprinter()
}

Hat einer eine Idee, warum das so ist?

Liebe Grüße

Erik

Content-Key: 516664

Url: https://administrator.de/contentid/516664

Printed on: April 18, 2024 at 10:04 o'clock

Mitglied: 141965
141965 Nov 19, 2019 updated at 11:04:07 (UTC)
Goto Top
Wenn ich es aber als GPO als Start-Skript einfüge, dann nicht
Hat einer eine Idee, warum das so ist?
Ja, Startscripts werden per Default unsichtbar mit dem SYSTEM-Account ausgeführt, ein Dialog bekommt der User also nicht zu Gesicht und deswegen kommt Zeile 49 gar nicht erst zum Zug weil der unsichtbare Dialog ja gar nicht geschlossen werden kann. DIALOGE müssen im Kontext des Users (User-Session) laufen sonst sieht er sie nicht in seiner Session.
Member: erikro
erikro Nov 19, 2019 at 11:12:00 (UTC)
Goto Top
Moin,

oops, ich meinte nicht Start-Skript, sondern Logon-Skript. Ich hab's oben korrigiert. Im Standardskript habe ich auch einen Dialog, der angezeigt wird:

[Windows.Forms.MessageBox]::Show("Druckereinrichtung abgeschlossen ...”, "", [Windows.Forms.MessageBoxButtons]::OK, [Windows.Forms.MessageBoxIcon]::Information)  

Liebe Grüße

Erik
Mitglied: 141965
141965 Nov 19, 2019 updated at 11:17:16 (UTC)
Goto Top
Login Script Verzögerung wurde per GPO deaktiviert? Per Default kann Windows Login-Scripts bis zu 10 Minuten nach dem Login verzögern. Außerdem verzögert das Skript selbst mit Zeile 4 um 20 Sekunden.

Kapsele das Skript mal mit Start-Transcript

Wird die GPO überhaupt angewendet? => gspresult /r bzw. rsop.msc
Member: Kraemer
Kraemer Nov 19, 2019 at 11:29:21 (UTC)
Goto Top
Moin,

an deiner Stelle würde ich das mit der Aufgabenplanung abfackeln.

Gruß
Mitglied: 141965
141965 Nov 19, 2019 updated at 11:31:09 (UTC)
Goto Top
Als Ergänzung, wenn es per Login-Skript ausgeführt wird musst du die Ausführung von Login-Skripts nat. auch per GPO auch auf Sichtbar schalten (unschön) ..., also besser wie @Kraemer sagt gleich per Aufgabenplanung.
Member: erikro
erikro Nov 19, 2019 at 11:34:33 (UTC)
Goto Top
Moin,

Zitat von @141965:

Login Script Verzögerung wurde per GPO deaktiviert?

Ja klar. Die üblichen GPOs (auf Netzwerk warten, Skripts sofort ausführen ...) sind domainweit aktiviert. Wie gesagt, die anderen Skripte laufen ja problemlos.

Per Default kann Windows Login-Scripts bis zu 10 Minuten nach dem Login verzögern.

Das ist bekannt. face-wink

Außerdem verzögert das Skript selbst mit Zeile 4 um 20 Sekunden.

Wie im Kommentar steht, ist das Absicht. Das berücksichtige ich beim Testen natürlich.

Kapsele das Skript mal mit Start-Transcript

Mache ich gleich mal.

Wird die GPO überhaupt angewendet? => gspresult /r bzw. rsop.msc

Ja.

Liebe Grüße

Erik
Member: erikro
erikro Nov 19, 2019 at 12:17:06 (UTC)
Goto Top
Zitat von @141965:

Als Ergänzung, wenn es per Login-Skript ausgeführt wird musst du die Ausführung von Login-Skripts nat. auch per GPO auch auf Sichtbar schalten (unschön)

Und wieso wird der Dialog beim anderen Skript angezeigt, obwohl das nicht eingestellt ist? Wo ist der Unterschied?

Aber ich habe es mal ausprobiert. Ergebnis: Schwarzes Fenster auf dem Bildschirm, in dem nichts passiert.

..., also besser wie @Kraemer sagt gleich per Aufgabenplanung.

Dann habe ich auch ein schwarzes Fenster auf dem Bildschirm mit dem Warnhinweis, dass das furchtbar gefährlich ist. Bestätige ich die Ausführung, dann geht's. Aber schön ist das überhaupt nicht.
Member: erikro
erikro Nov 19, 2019 at 12:40:26 (UTC)
Goto Top
So, nun geht's. Ich habe einen Workaround hier gefunden:
https://social.technet.microsoft.com/Forums/windowsserver/en-US/028d8352 ...

Das Skript sieht nun so aus:


$date = Get-Date
out-file -FilePath $env:userprofile\documents\drucker.txt -InputObject "Drucker_springer wurde ausgeführt $date" -Append
Start-Sleep 20

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

#Workaround for displaying for when ran as a GPO:
$InitialFormWindowState = New-Object 'System.Windows.Forms.FormWindowState'
$Form_StateCorrection_Load=
{
#Correct the initial state of the form to prevent the .Net maximized form issue
$Form.WindowState = $InitialFormWindowState
}
#End workaround

$form = New-Object System.Windows.Forms.Form
$form.Text = "Bitte Drucker auswählen"
$form.Size = New-Object System.Drawing.Size(700,(130+80))
$form.StartPosition = "CenterScreen"
$Font = New-Object System.Drawing.Font("Arial",10,[System.Drawing.FontStyle]::Regular)

$form.Font = $Font

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Point(312,(42+80))
$OKButton.Size = New-Object System.Drawing.Size(76,27)
$OKButton.Text = "OK"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $OKButton
$form.Controls.Add($OKButton)


$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,14)
$label.Size = New-Object System.Drawing.Size(480,20)
$label.Text = "Wählen Sie einen Standarddrucker aus:"
$form.Controls.Add($label)

$listBox = New-Object System.Windows.Forms.ListBox
$listBox.Location = New-Object System.Drawing.Point(10,42)
$listBox.Size = New-Object System.Drawing.Size(660,80)
$listBox.Height = 80
$listboxFont = New-Object System.Drawing.Font("Arial",12,[System.Drawing.FontStyle]::Regular)
$listBox.font = $listboxFont

[void] $listBox.Items.Add("Drucker1")
[void] $listBox.Items.Add("Drucker2")
[void] $listBox.Items.Add("Drucker3")

$form.Controls.Add($listBox)

#Workaround for displaying for when ran as a GPO:
$InitialFormWindowState = $Form.WindowState
$Form.add_Load($Form_StateCorrection_Load)
#End workaround

$form.Topmost = $True

$result = $form.ShowDialog()
out-file -FilePath $env:userprofile\documents\drucker.txt -InputObject "Drucker_springer Dialog anzeigen $date" -Append


if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
$x = $listBox.SelectedItem
$x
$defaultprinter = $(Get-WmiObject -class win32_printer | Where-Object { $_.name -like "*$x*" })
$defaultprinter.setdefaultprinter()
}