Aktionen

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.



1 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:

JP ProfileReset-001.png - JP ProfileReset-002.png


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
  • Dann wird JPLogin.exe gestartet
    • Diese erzeugt dann eine neue, leere JPUser.dat



Falls JP_ProfileReset.exe gestartet wird und schon eine JPUser.dat.OLD vorhanden ist, wird eine zusätzliche Schaltfläche angezeigt.

JP ProfileReset-003.png
  • Ü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 in JPUser.dat umbenannt wird.
  • Auslöser ist hier eine _restore_ Datei im JumpingProfiles-Verzeichnis des Benutzers




2 Vorbereitung

Egal nach welcher Methode die <code>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.



3 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 <code>qfarm aus.


In Citrix veröffentlicht Ihr nun eine neue Applikation welche auf die JP_ProfileReset.exe zeigt.


Und dann Testen!


4 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)


5 Erweiterungen




6 Kommentare


Kommentar hinzufügen
znilwiki freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, trage deinen Namen oder deine Email-Adresse ein oder melde dich an. Du kannst das Feld auch einfach leer lassen.