Lösung falls der Standarddrucker sich bei Citrix verstellt
Hier die Lösung für folgendes Problem: Windows (2003) Terminal Server, Roaming Profiles, mit Citrix Umgebung und Druckserver.
Wir benutzen sowohl "Fulldesktop", als auch "Shared Applications"
Problem dabei ist: Wenn sich ein Benutzer anmeldet, ist sein Standarddrucker verstellt und stattdessen ist ein willkürlicher Drucker gewählt oder der Citrix "Uniprint"-Drucker.
Nach Wochenlangem Testen und Rumprobieren, habe ich viele Fehlerquellen gefunden und auch beseitigen können. Dass der Drucker sich verstellt, hat folgende Ursachen:
Beim Anmelden auf die Citrixumgebung, erstellt Citrix die Drucker erst, NACHDEM das Profil des jeweiligen Users von Profilserver geladen wurde. Das heisst, dass der Standarddrucker, der im Profil hinterlegt ist, nicht eingestellt werden kann, da er noch gar nicht verfügbar ist.
Stattdessen wird der erste gewählt, der verfügbar ist oder der Drucker "Uniprint".
Damit der Drucker „Uniprint“ nicht als Standarddrucker gesetzt werden soll, müssen folgende Änderungen gemacht werden.
„Regedit“ starten und im Schlüssel:
HKLM\software\microsoft\windows nt\currentversion\winlogon\appsetup
Den Wert „Printerdefault.exe“ löschen.
Dies verhindert, dass der Citrix-eigene Drucker „Uniprint“ beim Anmelden als Standarddrucker gesetzt wird.
Jetzt komme ich zur eigentlichen Lösung. Erst die "einfache/umständliche" Version:
1.)
Jedem User wird ein Anmeldeskript (Batchfile) gegeben, in dem der Standarddrucker eingetragen wird.
Wobei %Standard% der Standarddruckename ist. Einfach die Zeile
rundll32 printui.dll,PrintUIEntry /y /n \\Druckerserver\%Standard% > NUL
im Editor einfügen und z.B.: als "Standarddrucker_Username.bat" speichern.
Jetzt ab ins "Active Directory" und dort dem jeweiligen User wählen. Rechtsklick -> Eigenschaften -> Profile und dann
unter "Logonskript" das jeweilige Skript auswählen. Fertig! Unschöne Lösung, deswegen:
2.)
Natürlich kann man jetzt auch ein Abmeldeskript per GPO einstellen. Dazu im Zweig Benutzerkonfiguration -> Windows Einstellungen -> Skripts (Anmelden/Abmelden) die Eigenschaften von „Abmelden“ konfigurieren und dort ein Skript einfügen, dass den Schlüssel mit dem Standarddrucker exportiert:
regedit /e %HOMESHARE%\Standarddrucker.reg "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\"
Und danach auch die Eigenschaften von „Abmelden“ konfigurieren und dort ein Skript einfügen, dass den Schlüssel mit dem Standarddrucker wieder importiertt:
regedit /s %HOMESHARE%\Standarddrucker.reg
Das war eine sehr schöne Lösung, bis bei mir jemand auf die Idee gekommen ist, dass User ja gar keinen Zugriff auf Registry Tools haben sollten... Da gings erst richtig los. Nach einigen Wochen und tausenden Lösungsversuchen habe ich jetzt folgende Lösung gefunden:
3.)
Im Active Directory die GPO für den Terminalserver öffnen.
Im Zweig Benutzerkonfiguration -> Windows Einstellungen -> Skripts (Anmelden/Abmelden) die Eigenschaften von „Abmelden“ konfigurieren. Auf Hinzufügen klicken und dort die Datei "Standarddrucker.vbs" mit folgendem Inhalt einfügen:
ON ERROR RESUME NEXT
ScriptLogName = "defprinter.log"
strComputer = "."
Set WshShell = WScript.CreateObject("WScript.Shell")
fTMP = WshShell.ExpandEnvironmentStrings("%HOMEDRIVE%")
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set inputFile = fso.OpenTextFile( "M:" & "\" & ScriptLogName, 2, True)
Set objWMIService = GetObject ("winmgmts:\\" & strComputer & "\root\cimv2")
Set colPrinters = objWMIService.ExecQuery ("Select * From Win32_Printer Where Default = TRUE")
For Each objPrinter in colPrinters
inputFile.WriteLine(objPrinter.ShareName)
Next
Dieses Skript erstellt auf dem Homelaufwerk M:\ des Benutzers eine Datei „defprinter.log“.
In dieser Datei wird der beim Abmelden eingestellte Standarddrucker eingetragen.
Jetzt kommt das Anmeldeskript. Aber dieses Skript kann nicht als Anmeldeskript funktionieren, weil ja noch gar keine Drucker vorhanden sind! Also muss man es auf den Terminalservern unter "...Dokumente und EInstellunge\All Users\Startmenu\Autostart" speichern!!! Dort eine (Verknüpfung zu einer) Batch-Datei mit folgendem Inhalt erstellen:
@echo off
:begin
REM Aus der vom Abmeldeskript gespeicherten Datei "defprinter.log" den Drucker extrahieren
for /F %%i in (%HOMEDRIVE%\defprinter.log) do set Standard=%%i
REM Falls kein STandarddrucker eingestellt wurde soll abgebrochen werden
IF "%Standard%" == "" GOTO Druckerwarnung
set /a test=1
:Start
REM Abfrage, ob der Drucker überhaupt schon verfügbar ist
reg query "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices" >> M:\drucker.txt
find /I "\\Druckerserver\%Standard%" M:\drucker.txt
IF %ERRORLEVEL% == 1 GOTO Weiter
Goto End
:Weiter
REM Schleife die 6 Versuche mit 1000 ms Pause abfragt ob der Drucker schon vorhanden ist
PING 1.1.1.1 -n 1 -w 1000 > NUL
echo %test% "von 6 Versuchen"
set /a test=test+1
if %test% == 7 Goto WirklichSchluss
Goto Start
:End
REM Standarddrucker wird hinzugefügt
echo "Drucker wurde erfolgreich hinzugefuegt!"
rundll32 printui.dll,PrintUIEntry /y /n \\BY-DYDSRV\%Standard% > NUL
:WirklichSchluss
echo "Dieses Fenster schliesst sich von selbst..."
del M:\drucker.txt
goto:eof
:Druckerwarnung
"Es ist kein Standarddrucker eingetragen! Bitte Standarddrucker wählen!"
goto:eof
Dadurch wird der Standarddrucker abgefragt und wieder hinzugefügt und zwar ERST WENN ER VERFÜGBAR IST (Deswegen diese 6 Sekunden Verzögerung. EDIT: Habs jetzt bei uns sicherheitshalber auf 10 Versuche erhöht. )
Natürlich müssen für ALLE Ordner, in die von den Skripts Daten gespeichert werden, die Rechte umgestellt werden. Und zwar sollte "Jeder" User dort Lese- und Schreibrechte haben!!!! (MÖGLICHE FEHLERQUELLE!)
Aber wer jetzt denkt, das wars schon, der irrt! :D
Wir haben dann ja noch die Shared Applications eingeführt! SIE VERSTELLEN WIEDER DEN STANDARDDRUCKER!
Und zwar, weil bei ihnen kein Autostart-Skript läuft, da ja die Batch ohne explorer.exe und "Autostart im Startmenü" gar nicht gestartet wird. Jetzt wird aber beim Abmelden das Abmeldeskript ausgeführt und dieses speichert wieder gar keinen Drucker in die defprinter.log... -.-
Lösung:
Die Shared Applications Verknüpfungen sollen nicht auf das Programm verweisen, sondern auf eine Batch-Datei, die das Programm und das Standarddruckerskript startet!!!
Die Batch die gestartet wird, sieht dann zum Beispiel wie folgt aus:
REM Standarddruckerskript ausführen mit call, weil sonst das Batch-Fenster offen bleibt
call T:\Programs\Def_Prin\Def_Prin.bat
REM Programm starten
start "t:\programs\Internet Explorer\iexplore.exe"
exit
Manchmal müssen Programme auch mit "call" statt "start" gestartet werden. (z.B.: MMC.exe)
DAS WARS GLAUBE ICH
Ich hoffe einigen damit geholfen zu haben und wenn ihr Fehler entdeckt, dann sagt mir bescheid und ich korrigiere sie. Habe versucht es verständlich zu formulieren. Fragt, wenn ihr was nicht versteht! So long,
Drizzle
EDIT01: Ich habe die folgenden Zeilen aus dem Anmeldeskript gelöscht, weil sie wohl manchmal dazu führen, dass das Anmeldeskript nicht sauber ausgeführt wird!
REM Fenster minimiert starten
if not "%1"=="" goto %1
start /MIN cmd.exe /C "%~nx0 begin"
goto:eof
Dann ist das Fenster aber leider unschön bei jedem Anmelden zu sehen
EDIT02: Mir ist noch eine Lösung für euch eingefallen, aber da wir mit Thin-Clients arbeiten, funktioniert sie bei uns nicht. Wenn alle User mit Notebooks oder Desktop-PCs arbeiten, kann man auch in der "Citrix Presentation Server Console" folgende Einstellung machen: "Set default printer to the user's default printer"
Dadurch wird der Drucker, der auf dem Notebook bzw. Desktop-Rechner als Standard gesetzt ist, direkt übernommen.
Wir benutzen sowohl "Fulldesktop", als auch "Shared Applications"
Problem dabei ist: Wenn sich ein Benutzer anmeldet, ist sein Standarddrucker verstellt und stattdessen ist ein willkürlicher Drucker gewählt oder der Citrix "Uniprint"-Drucker.
Nach Wochenlangem Testen und Rumprobieren, habe ich viele Fehlerquellen gefunden und auch beseitigen können. Dass der Drucker sich verstellt, hat folgende Ursachen:
Beim Anmelden auf die Citrixumgebung, erstellt Citrix die Drucker erst, NACHDEM das Profil des jeweiligen Users von Profilserver geladen wurde. Das heisst, dass der Standarddrucker, der im Profil hinterlegt ist, nicht eingestellt werden kann, da er noch gar nicht verfügbar ist.
Stattdessen wird der erste gewählt, der verfügbar ist oder der Drucker "Uniprint".
Damit der Drucker „Uniprint“ nicht als Standarddrucker gesetzt werden soll, müssen folgende Änderungen gemacht werden.
„Regedit“ starten und im Schlüssel:
HKLM\software\microsoft\windows nt\currentversion\winlogon\appsetup
Den Wert „Printerdefault.exe“ löschen.
Dies verhindert, dass der Citrix-eigene Drucker „Uniprint“ beim Anmelden als Standarddrucker gesetzt wird.
Jetzt komme ich zur eigentlichen Lösung. Erst die "einfache/umständliche" Version:
1.)
Jedem User wird ein Anmeldeskript (Batchfile) gegeben, in dem der Standarddrucker eingetragen wird.
Wobei %Standard% der Standarddruckename ist. Einfach die Zeile
rundll32 printui.dll,PrintUIEntry /y /n \\Druckerserver\%Standard% > NUL
im Editor einfügen und z.B.: als "Standarddrucker_Username.bat" speichern.
Jetzt ab ins "Active Directory" und dort dem jeweiligen User wählen. Rechtsklick -> Eigenschaften -> Profile und dann
unter "Logonskript" das jeweilige Skript auswählen. Fertig! Unschöne Lösung, deswegen:
2.)
Natürlich kann man jetzt auch ein Abmeldeskript per GPO einstellen. Dazu im Zweig Benutzerkonfiguration -> Windows Einstellungen -> Skripts (Anmelden/Abmelden) die Eigenschaften von „Abmelden“ konfigurieren und dort ein Skript einfügen, dass den Schlüssel mit dem Standarddrucker exportiert:
regedit /e %HOMESHARE%\Standarddrucker.reg "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\"
Und danach auch die Eigenschaften von „Abmelden“ konfigurieren und dort ein Skript einfügen, dass den Schlüssel mit dem Standarddrucker wieder importiertt:
regedit /s %HOMESHARE%\Standarddrucker.reg
Das war eine sehr schöne Lösung, bis bei mir jemand auf die Idee gekommen ist, dass User ja gar keinen Zugriff auf Registry Tools haben sollten... Da gings erst richtig los. Nach einigen Wochen und tausenden Lösungsversuchen habe ich jetzt folgende Lösung gefunden:
3.)
Im Active Directory die GPO für den Terminalserver öffnen.
Im Zweig Benutzerkonfiguration -> Windows Einstellungen -> Skripts (Anmelden/Abmelden) die Eigenschaften von „Abmelden“ konfigurieren. Auf Hinzufügen klicken und dort die Datei "Standarddrucker.vbs" mit folgendem Inhalt einfügen:
ON ERROR RESUME NEXT
ScriptLogName = "defprinter.log"
strComputer = "."
Set WshShell = WScript.CreateObject("WScript.Shell")
fTMP = WshShell.ExpandEnvironmentStrings("%HOMEDRIVE%")
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set inputFile = fso.OpenTextFile( "M:" & "\" & ScriptLogName, 2, True)
Set objWMIService = GetObject ("winmgmts:\\" & strComputer & "\root\cimv2")
Set colPrinters = objWMIService.ExecQuery ("Select * From Win32_Printer Where Default = TRUE")
For Each objPrinter in colPrinters
inputFile.WriteLine(objPrinter.ShareName)
Next
Dieses Skript erstellt auf dem Homelaufwerk M:\ des Benutzers eine Datei „defprinter.log“.
In dieser Datei wird der beim Abmelden eingestellte Standarddrucker eingetragen.
Jetzt kommt das Anmeldeskript. Aber dieses Skript kann nicht als Anmeldeskript funktionieren, weil ja noch gar keine Drucker vorhanden sind! Also muss man es auf den Terminalservern unter "...Dokumente und EInstellunge\All Users\Startmenu\Autostart" speichern!!! Dort eine (Verknüpfung zu einer) Batch-Datei mit folgendem Inhalt erstellen:
@echo off
:begin
REM Aus der vom Abmeldeskript gespeicherten Datei "defprinter.log" den Drucker extrahieren
for /F %%i in (%HOMEDRIVE%\defprinter.log) do set Standard=%%i
REM Falls kein STandarddrucker eingestellt wurde soll abgebrochen werden
IF "%Standard%" == "" GOTO Druckerwarnung
set /a test=1
:Start
REM Abfrage, ob der Drucker überhaupt schon verfügbar ist
reg query "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices" >> M:\drucker.txt
find /I "\\Druckerserver\%Standard%" M:\drucker.txt
IF %ERRORLEVEL% == 1 GOTO Weiter
Goto End
:Weiter
REM Schleife die 6 Versuche mit 1000 ms Pause abfragt ob der Drucker schon vorhanden ist
PING 1.1.1.1 -n 1 -w 1000 > NUL
echo %test% "von 6 Versuchen"
set /a test=test+1
if %test% == 7 Goto WirklichSchluss
Goto Start
:End
REM Standarddrucker wird hinzugefügt
echo "Drucker wurde erfolgreich hinzugefuegt!"
rundll32 printui.dll,PrintUIEntry /y /n \\BY-DYDSRV\%Standard% > NUL
:WirklichSchluss
echo "Dieses Fenster schliesst sich von selbst..."
del M:\drucker.txt
goto:eof
:Druckerwarnung
"Es ist kein Standarddrucker eingetragen! Bitte Standarddrucker wählen!"
goto:eof
Dadurch wird der Standarddrucker abgefragt und wieder hinzugefügt und zwar ERST WENN ER VERFÜGBAR IST (Deswegen diese 6 Sekunden Verzögerung. EDIT: Habs jetzt bei uns sicherheitshalber auf 10 Versuche erhöht. )
Natürlich müssen für ALLE Ordner, in die von den Skripts Daten gespeichert werden, die Rechte umgestellt werden. Und zwar sollte "Jeder" User dort Lese- und Schreibrechte haben!!!! (MÖGLICHE FEHLERQUELLE!)
Aber wer jetzt denkt, das wars schon, der irrt! :D
Wir haben dann ja noch die Shared Applications eingeführt! SIE VERSTELLEN WIEDER DEN STANDARDDRUCKER!
Und zwar, weil bei ihnen kein Autostart-Skript läuft, da ja die Batch ohne explorer.exe und "Autostart im Startmenü" gar nicht gestartet wird. Jetzt wird aber beim Abmelden das Abmeldeskript ausgeführt und dieses speichert wieder gar keinen Drucker in die defprinter.log... -.-
Lösung:
Die Shared Applications Verknüpfungen sollen nicht auf das Programm verweisen, sondern auf eine Batch-Datei, die das Programm und das Standarddruckerskript startet!!!
Die Batch die gestartet wird, sieht dann zum Beispiel wie folgt aus:
REM Standarddruckerskript ausführen mit call, weil sonst das Batch-Fenster offen bleibt
call T:\Programs\Def_Prin\Def_Prin.bat
REM Programm starten
start "t:\programs\Internet Explorer\iexplore.exe"
exit
Manchmal müssen Programme auch mit "call" statt "start" gestartet werden. (z.B.: MMC.exe)
DAS WARS GLAUBE ICH
Ich hoffe einigen damit geholfen zu haben und wenn ihr Fehler entdeckt, dann sagt mir bescheid und ich korrigiere sie. Habe versucht es verständlich zu formulieren. Fragt, wenn ihr was nicht versteht! So long,
Drizzle
EDIT01: Ich habe die folgenden Zeilen aus dem Anmeldeskript gelöscht, weil sie wohl manchmal dazu führen, dass das Anmeldeskript nicht sauber ausgeführt wird!
REM Fenster minimiert starten
if not "%1"=="" goto %1
start /MIN cmd.exe /C "%~nx0 begin"
goto:eof
Dann ist das Fenster aber leider unschön bei jedem Anmelden zu sehen
EDIT02: Mir ist noch eine Lösung für euch eingefallen, aber da wir mit Thin-Clients arbeiten, funktioniert sie bei uns nicht. Wenn alle User mit Notebooks oder Desktop-PCs arbeiten, kann man auch in der "Citrix Presentation Server Console" folgende Einstellung machen: "Set default printer to the user's default printer"
Dadurch wird der Drucker, der auf dem Notebook bzw. Desktop-Rechner als Standard gesetzt ist, direkt übernommen.
Please also mark the comments that contributed to the solution of the article
Content-ID: 91822
Url: https://administrator.de/contentid/91822
Printed on: December 5, 2024 at 17:12 o'clock
10 Comments
Latest comment
Du bist mein Held heute
Vielen, vielen Dank... Wir hatten schon angefangen, für 300+ User jeweils eine eigene Druckerrichtlinie zu machen *umpf*
mfg, Schahn
Vielen, vielen Dank... Wir hatten schon angefangen, für 300+ User jeweils eine eigene Druckerrichtlinie zu machen *umpf*
mfg, Schahn
Es stimmt, dass man an vielen Orten und ganz genau bei Citrix alles kontrollieren muss...
Ich hatte am Anfang selbst eine Menge Probleme mit den sch Druckern.
Ein Fehler (von mir) war, dass auf dem Citrix Server die Drucker installiert waren (also unter Start/Einstellungen/Drucker zu sehen) und dort nur die Standardberechtigungen u.a. "Benutzer - drucken". Und genau deshalb haben bei mir die Citrix-Regeln (zweck Standarddrucker) nicht richtig gegriffen, die Lösung war, auf den Druckern, die auf dem CitrixServer installiert sind, den Benutzern die Berechtigungen zu nehmen, dh. ich habe in den Sicherheitseinstellungen nur mehr den Admin drinnen. Danach griffen die Citrix-Richtlinien ohne Probleme.
Aber natürlich hängt es immer ab, wie, wo was gemappt wird... Bei Citrix muss man noch unter ICA-Protokoll genau kontrollieren, acht geben ob man nicht irgendeine Windows GPO gemacht hat usw..
Jedenfalls die Drucker-konfiguration-zuweisung bei Citrix ist wirklich nicht das gelbe vom Ei...
Ich hatte am Anfang selbst eine Menge Probleme mit den sch Druckern.
Ein Fehler (von mir) war, dass auf dem Citrix Server die Drucker installiert waren (also unter Start/Einstellungen/Drucker zu sehen) und dort nur die Standardberechtigungen u.a. "Benutzer - drucken". Und genau deshalb haben bei mir die Citrix-Regeln (zweck Standarddrucker) nicht richtig gegriffen, die Lösung war, auf den Druckern, die auf dem CitrixServer installiert sind, den Benutzern die Berechtigungen zu nehmen, dh. ich habe in den Sicherheitseinstellungen nur mehr den Admin drinnen. Danach griffen die Citrix-Richtlinien ohne Probleme.
Aber natürlich hängt es immer ab, wie, wo was gemappt wird... Bei Citrix muss man noch unter ICA-Protokoll genau kontrollieren, acht geben ob man nicht irgendeine Windows GPO gemacht hat usw..
Jedenfalls die Drucker-konfiguration-zuweisung bei Citrix ist wirklich nicht das gelbe vom Ei...
Genau die Richtlinien sind ja das Problem. Wir haben 40 Aussenstellen mit je 3-5 Druckern, die alle am zentralen Druckserver hängen. Ich habe also 40 Richtlinien, die jedem MA einer Aussenstelle die Drucker seiner Aussenstelle verbindet. Allerdings will ja jeder der MA einen der verbundenen Drucker Drucker als Standarddrucker haben. Dafür müsste ich also für jeden der MA eine eigene Richtlinie machen (ca. 300 mit permanentem Pflegeaufwand).
Mit der Lösung von Drizzle kann ich mir das sparen. Jeder Nutzer legt einmal seinen Standarddrucker selber fest und gut.
Einfach perfekt
mfg, Schahn
Mit der Lösung von Drizzle kann ich mir das sparen. Jeder Nutzer legt einmal seinen Standarddrucker selber fest und gut.
Einfach perfekt
mfg, Schahn
Hallo,
welche Citrix Version? Für z.B. PS 4 gabs da einen Hotfix Rollup Pack PSE400W2K3R01.
http://support.citrix.com/article/CTX107504&searchID=20464753
Damit war bei uns das Problem erledigt. Und jeder hat seinen Standarddrucker und behält ihn auch.
mfg Beate
welche Citrix Version? Für z.B. PS 4 gabs da einen Hotfix Rollup Pack PSE400W2K3R01.
http://support.citrix.com/article/CTX107504&searchID=20464753
Damit war bei uns das Problem erledigt. Und jeder hat seinen Standarddrucker und behält ihn auch.
mfg Beate
Der Hotfix betrifft nur die Problematik des Standarddruckers für Clients, die einen solchen bereits eingerichtet haben und der dann in die Session reinverbunden wird.
Das Ganze funktioniert nicht bei Druckern, die erst beim Start der Session per Richtline als Netzwerkdrucker eingebunden werden (also auf dem Client-PC vorher nicht vorhanden sind). Dort ist Citrix meist zu langsam bei der Abarbeitung der Richtlinien, sodass Windows den im Userprofile gespeicherten Standarddrucker noch nicht vorfindet und daher einen beliebigen anderen Drucker als Standard setzt, so wie von Drizzle ganz oben beschrieben.
Es gibt derzeit von Citrix definitiv keine Lösung des Problems.
mfg, Schahn
Das Ganze funktioniert nicht bei Druckern, die erst beim Start der Session per Richtline als Netzwerkdrucker eingebunden werden (also auf dem Client-PC vorher nicht vorhanden sind). Dort ist Citrix meist zu langsam bei der Abarbeitung der Richtlinien, sodass Windows den im Userprofile gespeicherten Standarddrucker noch nicht vorfindet und daher einen beliebigen anderen Drucker als Standard setzt, so wie von Drizzle ganz oben beschrieben.
Es gibt derzeit von Citrix definitiv keine Lösung des Problems.
mfg, Schahn