JumpingProfiles:JPProfileReset
Aus znilwiki
Ein Kunde wollte das die Benutzer sich Ihr Profil auch selbst zurück setzen können.
Zurücksetzen bedeutet in diesem Fall das die JPUser.dat
gelöscht bzw. umbenannt wird.
Das wird leider bei jeder Art von Problemen gerne von den Admins gemacht - wenn dies bei einem Benutzer andauernd nötig ist sollte eigentlich die Ursache erforscht und behoben werden.
Wenn der Benutzer es aber einfach mal wieder verkonfiguriert hat ist es wirklich der leichteste Weg.
Mit dem Löschen der JPUser.dat
werden nur die Registry-Informationen gelöscht. Die restlichen Dateien und Ordner, z.B. die Favoriten oder die Normal.dot
von Wor bleiben dabei erhalten.
Beschreibung
Den Benutzern wird eine weitere Citrix-Applikation veröffentlicht - die JP_ProfileReset.exe
.
Diese startet und präsentiert den Benutzer zunächst 2 Schaltflächen:
Mit einem Klick auf RESET passiert folgendes:
- es wird eine Datei
_cleanup_
im JumpingProfile-Verzeichnis des Benutzers erstellt (also dort wo auch die JPUser.dat liegt) - Der Benutzer bekommt bei Erfolg eine Meldung angezeigt das er nun von allen Citrix-Sitzungen abgemeldet wird (siehe 2. Bild zuvor)
- Es wird eine "Bitte Warten" Meldung angezeigt. Im Hintergrund läuft ein Skript an ( Terminalserver - Benutzer soll sich selbst von allen anderen Servern abmelden ) welches den Benutzer von allen Servern abmeldet.
- Danach beendet sich das Programm und erzwingt eine Abmeldung der aktuellen Sitzung.
- Bei der nächsten Anmeldung wertet ein Skript aus ob eine
_cleanup_
vorhanden ist.- Wenn ja wird eine eventuell vorhandene
JPUser.dat.OLD
gelöscht - und die
JPUser.dat
in/JPUser.dat.OLD
umbenannt. - Des weiteren werden allen eventuell noch vorhandenen Session-Cookies gelöscht
- und die
_cleanup_
wird gelöscht
- Wenn ja wird eine eventuell vorhandene
- Dann wird
JPLogin.exe
gestartet- Diese erzeugt dann eine neue, leere
JPUser.dat
- Diese erzeugt dann eine neue, leere
Falls JP_ProfileReset.exe
gestartet wird und schon eine JPUser.dat.OLD
vorhanden ist, wird eine zusätzliche Schaltfläche angezeigt.
- Über der Schaltfläche steht das letzte Änderungsdatum / Uhrzeit der Sicherung
- Mit einem Klick auf die Schaltfläche passiert das gleiche wie beim Reset - nur das in diesem Fall
- die aktuelle
JPUser.dat
gelöscht - die
JPUser.dat.OLD
wieder inJPUser.dat
umbenannt wird.
- die aktuelle
- Auslöser ist hier eine
_restore_
Datei im JumpingProfiles-Verzeichnis des Benutzers
Vorbereitung
Egal nach welcher Methode die JPLogin.exe
bisher gestartet wurde - wir müssen den Aufruf ersetzen.
Statt dem direkten Aufruf der JPLogin.exe
müssen wir nun ein Skript starten. Das muss so sein - schliesslich müssen wir eventuelle Aktionen wie Löschen oder Wiederherstellen durchführen bevor JumpingProfiles gestartet wird.
Die möglichen Start-Arten findet Ihr hier: Aufruf von JPLogin.exe bei Anmeldung
Ersetzt den Start durch folgendes Skript:
Download: JPLogin.zip
@echo off
REM 2014 Bernhard Linz / DATAGROUP Bremen GmbH / Bernhard.Linz@datagroup.de
REM JPLogin.exe wird nicht mehr direkt gestartet sondern diese JPLogin.cmd
REM Diese wurde statt der .exe auf den Servern in der Registry eingtragen
REM Grund ist das die App "JP_ProfileReset" uns eventuell eine Datei "_cleanup_"
REM hinterlegt - dann möchte der Benutzer ein Profil-Reset, also eine leere JPUser.dat
REM das müssen wir vor dem Start prüfen
REM
REM #############################################################################
REM Setup
REM
REM Pfad zu der Freigabe mit den Benutzerordnern
set JPNETWORKSHARE=\\server\Freigabe\
REM muss an den Benutzernamen noch etwas angehängt werden? z.B. Domäne? Wenn nicht Zeile auskommentieren oder alles hinter dem = löschen
REM set JPDOMSUFFIX=.domain.suffix
REM Und der Pfad zur JPLogin.exe
set JPLOGINEXEPATH=\\server\Freigabe\JP\JPLogin.exe
REM #############################################################################
REM Hauptprogramm
REM
REM *** Check if we want a Profile Restore
if EXIST "%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\_restore_" (
REM Yes, Cleanup Profile
if EXIST "%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\JPUser.dat.OLD" (
del "%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\JPUser.dat" /F /Q
move "%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\JPUser.dat.OLD" "%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\JPUser.dat"
del "%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\Sessions\*" /F /Q
del "%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\_restore_
REM für die ganz schlauen die das Programm mehrmals starten und beides anklicken - Nicht mit uns!
del "%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\_cleanup_"
) else (
del "%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\_restore_
REM für die ganz schlauen die das Programm mehrmals starten und beides anklicken - Nicht mit uns!
del "%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\_cleanup_"
)
)
REM *** Check if we want a Profile Cleanup
if EXIST "%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\_cleanup_" (
REM Yes, Cleanup Profile
if EXIST "%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\JP_ProfileRefresher.exe" (
"%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\JP_ProfileRefresher.exe" "%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\JPUser.dat"
del "%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\_cleanup_"
) else (
del "%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\JPUser.dat.OLD" /F /Q
move "%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\JPUser.dat" "%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\JPUser.dat.OLD"
del "%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\Sessions\*" /F /Q
del "%JPNETWORKSHARE%\%USERNAME%%JPDOMSUFFIX%\JumpingProfile\_cleanup_"
)
)
REM *** Start JumpingProfiles
%JPLOGINEXEPATH%
exit
Das Skript ist darauf Vorbereitet falls die Benutzerverzeichnisse nicht Benutzername sondern Benutzername.domäne.suffix lauten. Dies ist z.B. der Fall falls die Home-Verzeichnisse der Benutzer über eine Gruppenrichtlinie angelegt werden (bitte nicht mit einer Ordnerumleitung verwechseln, das ist etwas anderes)
Eventuell ist euch auch der Aufruf der JP_ProfileRefresher.exe
aufgefallen - dies ist ein anderes Tool von mir welches ale Schlüssel in der JPUser.dat
löscht - bis auf festgelegte Ausnahmen. Das der Aufruf hier drin ist schadet aber nicht.
JP_ProfileReset.exe
Legt einfach eine Freigabe an bzw. einen weiteren Ordner unterhalb der zentralen JumpingProfiles Freigabe.
In diesen Ordner kopiert Ihr die folgenden Dateien:
- Die
JP_ProfileReset.exe
- Download: JP_ProfileReset.zip
- Ein Skript mit dem Namen
logoffallserver.cmd<cmd> - Beschreibung siehe hier, Download: Logoffallserver.zip
- In dem Skript müsst Ihr am Anfang die Namen eurer Terminalserver eintragen - Alle auf denen die Benutzer angemeldet sein könnten. Um z.B. die Liste zu erhalten meldet euch als Administrator auf einem eurer Server an und führt den Befehl
qfarm
aus.
In Citrix veröffentlicht Ihr nun eine neue Applikation welche auf die JP_ProfileReset.exe
zeigt.
Und dann Testen!
Quellcode der JP_ProfilReset.exe
Das Programm habe ich - wie so vieles - mit AutoIt geschrieben ( http://www.AutoIt.de oder https://www.autoitscript.com/site/autoit/ )
#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=Esch2.ico
#AutoIt3Wrapper_UseUpx=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
Opt('MustDeclareVars', 1)
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Dim $FormJP_ProfileReset, $GroupBox1, $Label_FR1, $Label_FR2, $Label_Linie1, $Label_Linie2, $Label_EN1, $Label_EN2, $Label_DE1, $Label_DE2, $Button_RESET, $Button_CANCEL, $nMsg
Dim $s_Homeshare
$s_Homeshare = EnvGet("HOMESHARE")
Dim $s_JPProfileResetFile = $s_Homeshare & "\JumpingProfile\_cleanup_"
Dim $s_JPProfileRestoreFile = $s_Homeshare & "\JumpingProfile\_restore_"
Dim $h_JPProfileResetOrRestoreFile
Dim $s_logoffallserverSkript = @ScriptDir & "\logoffallserver.cmd"
Dim $FormLogoff, $Label_Logoff1, $Label_Logoff2, $Label_Logoff3, $Button_Restore, $Label_Backup
Dim $a_TimeBackupFile
Dim $b_showRestore = False
#Region ### START Koda GUI section ### Form=D:\Dropbox\_AutoIt\JumpingProfiles\FormJP_ProfileReset.kxf
$FormJP_ProfileReset = GUICreate("Réinitialiser le profil / Reset Profil(e)", 408, 414, -1, -1, -1, BitOR($WS_EX_TOPMOST,$WS_EX_WINDOWEDGE))
GUISetBkColor(0xA6CAF0)
$GroupBox1 = GUICtrlCreateGroup("", 5, 1, 395, 223)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKHEIGHT)
$Label_FR1 = GUICtrlCreateLabel("Cliquez sur ''RESET''", 9, 12, 390, 23, $SS_CENTER)
GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKHEIGHT)
$Label_FR2 = GUICtrlCreateLabel("pour Réinitialiser à votre profil", 9, 38, 390, 29, $SS_CENTER)
GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKHEIGHT)
$Label_Linie1 = GUICtrlCreateLabel("------------------------------------------------------------------", 9, 58, 390, 23, $SS_CENTER)
GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKHEIGHT)
$Label_EN1 = GUICtrlCreateLabel("Click on ''RESET''", 9, 82, 390, 23, $SS_CENTER)
GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKHEIGHT)
$Label_EN2 = GUICtrlCreateLabel("to reset your profile", 9, 113, 390, 23, $SS_CENTER)
GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKHEIGHT)
$Label_Linie2 = GUICtrlCreateLabel("------------------------------------------------------------------", 9, 140, 390, 23, $SS_CENTER)
GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKHEIGHT)
$Label_DE1 = GUICtrlCreateLabel("Klicken Sie auf ''RESET'' ", 9, 160, 390, 23, $SS_CENTER)
GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKHEIGHT)
$Label_DE2 = GUICtrlCreateLabel("um Ihr Profil zurück zu setzen", 9, 188, 390, 29, $SS_CENTER)
GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif")
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKHEIGHT)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button_RESET = GUICtrlCreateButton("RESET", 5, 233, 195, 73)
GUICtrlSetFont(-1, 17, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFF0000)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKHEIGHT)
$Button_CANCEL = GUICtrlCreateButton("CANCEL", 205, 233, 195, 73)
GUICtrlSetFont(-1, 17, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x008000)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKTOP+$GUI_DOCKHEIGHT)
$Button_Restore = GUICtrlCreateButton("Restaurer / Restore / Wiederherstellen", 5, 337, 395, 73)
GUICtrlSetFont(-1, 15, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x0000FF)
$Label_Backup = GUICtrlCreateLabel("Backup-Date: 20.10.2014 - 11:27:44", 5, 312, 395, 23)
GUICtrlSetFont(-1, 15, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x0000FF)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
#Region ### START Koda GUI section ### Form=D:\Dropbox\_AutoIt\JumpingProfiles\FormLogoff.kxf
$FormLogoff = GUICreate("FormLogoff", 555, 297, -1, -1, BitOR($WS_SYSMENU,$WS_POPUP), BitOR($WS_EX_TOPMOST,$WS_EX_WINDOWEDGE))
GUISetCursor (15)
$Label_Logoff1 = GUICtrlCreateLabel("Veuillez patienter un instant, s'il vous plaît.", 6, 24, 534, 29, $SS_CENTER)
GUICtrlSetFont(-1, 15, 800, 0, "MS Sans Serif")
GUICtrlSetCursor (-1, 15)
$Label_Logoff2 = GUICtrlCreateLabel("Please wait a moment.", 6, 122, 534, 29, $SS_CENTER)
GUICtrlSetFont(-1, 15, 800, 0, "MS Sans Serif")
GUICtrlSetCursor (-1, 15)
$Label_Logoff3 = GUICtrlCreateLabel("Bitte warten Sie.", 6, 234, 534, 29, $SS_CENTER)
GUICtrlSetFont(-1, 15, 800, 0, "MS Sans Serif")
GUICtrlSetCursor (-1, 15)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
GUISetState(@SW_HIDE, $FormLogoff)
If FileExists($s_Homeshare & "\JumpingProfile\JPUser.dat.OLD") = 1 Then
$a_TimeBackupFile = FileGetTime($s_Homeshare & "\JumpingProfile\JPUser.dat.OLD", 0, 0)
; $a_TimeBackupFile[0] = Jahr (vierstellig)
; $a_TimeBackupFile[1] = Monat (Bereich: 01 - 12)
; $a_TimeBackupFile[2] = Tag (Bereich: 01 - 31)
; $a_TimeBackupFile[3] = Stunden (Bereich: 00 - 23)
; $a_TimeBackupFile[4] = Minuten (Bereich: 00 - 59)
; $a_TimeBackupFile[5] = Sekunden (Bereich: 00 - 59)
GUICtrlSetData($Label_Backup, "Backup-Date: " & $a_TimeBackupFile[2] & "." & $a_TimeBackupFile[1] & "." & $a_TimeBackupFile[0] & " - " & $a_TimeBackupFile[3] & ":" & $a_TimeBackupFile[4] & ":" & $a_TimeBackupFile[5])
$b_showRestore = True
Else
GUICtrlDelete($Label_Backup)
GUICtrlDelete($Button_Restore)
;GUICtrlSetResizing
WinMove($FormJP_ProfileReset, "", @DesktopWidth / 2 - 204, @DesktopHeight / 2 - 151, 408, 343)
$b_showRestore = False
EndIf
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button_CANCEL
Exit
Case $Button_RESET
If $s_Homeshare <> "" Then
$h_JPProfileResetOrRestoreFile = FileOpen($s_JPProfileResetFile,2)
If $h_JPProfileResetOrRestoreFile <> -1 Then
GUICtrlSetState($Button_CANCEL, $GUI_DISABLE)
GUICtrlSetState($Button_RESET, $GUI_DISABLE)
If $b_showRestore = True Then
GUICtrlSetState($Button_Restore, $GUI_DISABLE)
EndIf
FileWriteLine($h_JPProfileResetOrRestoreFile, "Profile will be delete at next Logon!")
FileClose($h_JPProfileResetOrRestoreFile)
MsgBox(262208,"OK", "Votre profil Citrix sera réinitialisé à la prochaine ouverture de session!" & @CRLF & _
"Vous serez maintenant déconnecté de tous les serveurs Citrix ..." & @CRLF & _
@CRLF & _
"Your Citrix Profile will be reset on next Logon!" & @CRLF & _
"You will now be logged out from all Citrix Servers ..." & @CRLF & _
@CRLF & _
"Ihr Citrix Profil wird bei der nächsten Anmeldung zurückgesetzt!" & @CRLF & _
"Sie werden jetzt von allen Citrix Servern abgemeldet ...",60)
GUISetState(@SW_HIDE, $FormJP_ProfileReset)
GUISetState(@SW_SHOW, $FormLogoff)
RunWait( $s_logoffallserverSkript, @WindowsDir, @SW_HIDE )
Shutdown(16)
Exit
Else
MsgBox(262160, "ERROR", "Error - can not write at Path!" & @CRLF & "Path: " & $s_JPProfileResetFile & @CRLF & "Homeshare: " & $s_Homeshare)
EndIf
Else
MsgBox(262160, "ERROR", "Error - did not find Path to your Homeshare!")
EndIf
Case $Button_Restore
$h_JPProfileResetOrRestoreFile = FileOpen($s_JPProfileRestoreFile,2)
If $h_JPProfileResetOrRestoreFile <> -1 Then
GUICtrlSetState($Button_CANCEL, $GUI_DISABLE)
GUICtrlSetState($Button_RESET, $GUI_DISABLE)
GUICtrlSetState($Button_Restore, $GUI_DISABLE)
FileWriteLine($h_JPProfileResetOrRestoreFile, "Profile will be restored at next Logon!")
FileClose($h_JPProfileResetOrRestoreFile)
MsgBox(262208,"OK", "Votre profil Citrix sera restauré à la prochaine ouverture de session!" & @CRLF & _
"Vous serez maintenant déconnecté de tous les serveurs Citrix ..." & @CRLF & _
@CRLF & _
"Your Citrix Profile will be restored on next Logon!" & @CRLF & _
"You will now be logged out from all Citrix Servers ..." & @CRLF & _
@CRLF & _
"Ihr Citrix Profil wird bei der nächsten Anmeldung wiederhergestellt!" & @CRLF & _
"Sie werden jetzt von allen Citrix Servern abgemeldet ...",60)
GUISetState(@SW_HIDE, $FormJP_ProfileReset)
GUISetState(@SW_SHOW, $FormLogoff)
RunWait( $s_logoffallserverSkript, @WindowsDir, @SW_HIDE )
Shutdown(16)
Exit
Else
MsgBox(262160, "ERROR", "Error - can not write at Path!" & @CRLF & "Path: " & $s_JPProfileResetFile & @CRLF & "Homeshare: " & $s_Homeshare)
EndIf
EndSwitch
WEnd
--Bernhard Linz 14:27, 20. Okt. 2014 (CEST)
Erweiterungen
Kommentare
Loading comments...