Aktionen

Terminalserver - Benutzer soll sich selbst von allen anderen Servern abmelden

Aus znilwiki

Important.png
Hinweis: Am 23.10.2014 noch mal überarbeitet - Script hatte Fehler wenn es von einem lokalen Rechner bzw. aus anderen Anwendungen heraus gestartet wurde

In eine Umgebung dürfen die Benutzer selbst Ihr Profil "Resetten" bzw. Löschen und so wieder mit einem frischen Profil anfangen.
Dazu hatte ich eine kleine GUI geschrieben und diese den Benutzern als Citrix App zugewiesen.
Das eigentliche Löschen/Resetten geschieht dann bei/vor der nächsten Anmeldung.

Damit dies aber sauber läuft ist es wichtig der Benutzer sich auch wirklich von allen Terminalservern abgemeldet hat.
Und da auf den Benutzer kein Verlass ist habe ich nachfolgendes Script gebaut.


  • Wird vom Benuter selbst ausgeführt
  • In einer Terminalserver-Sitzung
  • Oder vom lokalen Rechner aus
  • Die Terminalserver stehen im Script als Liste - der normale Benutzer das diese leider nicht auslesen, das dürften nur Admins
  • Der Server / Rechner auf dem das Skript ausgeführt wird, wird ausgelassen!




1 Ursprüngliche Version 1

Läuft Klasse auf den Terminalservern, lässt eigene Sitzung aus:

@echo off
set SERVERLIST=(xenapp01 xenapp02 xenapp03 xenapp04 xenapp05 xenapp06 xenapp07 xenapp08 xenapp09 xenapp10 xenapp11 xenapp12 xenapp13 xenapp14 xenapp15 xenapp16 xenapp17 xenapp18 xenapp19 xenapp20)

for %%i in %SERVERLIST% do call :SCHLEIFE1 %%i

goto ENDE

:SCHLEIFE1
query session /SERVER:"%1" | findstr "%username%" > "%TEMP%\%USERNAME%-%1.txt"
for /F "eol=# tokens=1-4 delims= " %%a in ('type "%TEMP%\%USERNAME%-%1.txt"') do (
	rem echo Server %1 - Sitzung Nr. %%c
	If /i "%1" == "%COMPUTERNAME%" goto :EOF
	logoff %%c /SERVER:"%1"
)
del "%TEMP%\%USERNAME%-%1.txt"
goto :EOF


:ENDE
exit




2 Version 2

Läuft wie Version 1 klasse auf den Terminalserver, aktuelle Sitzung wird selbst auch mit beendet:

@echo off
set SERVERLIST=(xenapp01 xenapp02 xenapp03 xenapp04 xenapp05 xenapp06 xenapp07 xenapp08 xenapp09 xenapp10 xenapp11 xenapp12 xenapp13 xenapp14 xenapp15 xenapp16 xenapp17 xenapp18 xenapp19 xenapp20 XENADM01 XENADM02 XENADM03 XENADM04 XENCIGL01 XENCIGL02 XENCST11 XENCST12 XENCST21 XENCST22 XENCST31 XENCST32 XENCST41 XENCST42 XENCST51 XENCST52 XENCST61 XENCST62 XENSUD01 XENSUD02)

for %%i in %SERVERLIST% do call :SCHLEIFE1 %%i

goto ENDE

:SCHLEIFE1
Echo Pruefe Server %1
REM %CURPATH%query session /SERVER:"%1"
query session /SERVER:"%1" | findstr /I "%username%"
query session /SERVER:"%1" | findstr /I "%username%" > "%TEMP%\%USERNAME%-%1.txt"
for /F "eol=# tokens=1-4 delims= " %%a in ('type "%TEMP%\%USERNAME%-%1.txt"') do (
	SET SITZUNGSNR=%%c
	type "%TEMP%\%USERNAME%-%1.txt"
	echo Variablen: %%a - %%b - %%c - %%d
	echo Server %1 - Sitzung Nr. %%c
	If /i "%1" == "%COMPUTERNAME%" (
		SET SAVENAME=%COMPUTERNAME%
		SET SAVESESSION=%%c
		SET EXITCODE=1
		goto :EOF
	)
	If /i NOT "%%c" == "" logoff %%c /SERVER:"%1"
)
del "%TEMP%\%USERNAME%-%1.txt"
goto :EOF


:ENDE
If /i NOT "%SAVENAME%" == "" (
	If /i NOT "%SAVESESSION%" == "" %CURPATH%logoff.exe %SAVESESSION% /SERVER:"%SAVENAME%"
)

exit %EXITCODE%




3 Version 3

Geänderte Variante der Version 2.
Denn diese hatte Probleme beim Start von einem lokalen Recner aus UND beim Start aus meinen AutoIt Programmen.
Warum auch immer werden unter bestimmten umständen die Befehle query.exe und logoff.exe nicht gefunden.

Lösung:
Kopiert von einem Terminalserver aus dem Verzeichnis

C:\Windows\System32

die folgenden Dateien in das gleiche Verzeichnis wie das Script:

logoff.exe
query.exe
query.dll

und nehmt diese Variante des Scriptes:

@echo off
Set CURPATH=%~dp0
set SERVERLIST=(xenapp01 xenapp02 xenapp03 xenapp04 xenapp05 xenapp06 xenapp07 xenapp08 xenapp09 xenapp10 xenapp11 xenapp12 xenapp13 xenapp14 xenapp15 xenapp16 xenapp17 xenapp18 xenapp19 xenapp20 XENADM01 XENADM02 XENADM03 XENADM04 XENCIGL01 XENCIGL02 XENCST11 XENCST12 XENCST21 XENCST22 XENCST31 XENCST32 XENCST41 XENCST42 XENCST51 XENCST52 XENCST61 XENCST62 XENSUD01 XENSUD02)

for %%i in %SERVERLIST% do call :SCHLEIFE1 %%i

goto ENDE

:SCHLEIFE1
Echo Pruefe Server %1
REM %CURPATH%query session /SERVER:"%1"
%CURPATH%query.exe session /SERVER:"%1" | findstr /I "%username%"
%CURPATH%query.exe session /SERVER:"%1" | findstr /I "%username%" > "%TEMP%\%USERNAME%-%1.txt"
for /F "eol=# tokens=1-4 delims= " %%a in ('type "%TEMP%\%USERNAME%-%1.txt"') do (
	SET SITZUNGSNR=%%c
	type "%TEMP%\%USERNAME%-%1.txt"
	echo Variablen: %%a - %%b - %%c - %%d
	echo Server %1 - Sitzung Nr. %%c
	If /i "%1" == "%COMPUTERNAME%" (
		SET SAVENAME=%COMPUTERNAME%
		SET SAVESESSION=%%c
		SET EXITCODE=1
		goto :EOF
	)
	If /i NOT "%%c" == "" %CURPATH%logoff.exe %%c /SERVER:"%1"
)
del "%TEMP%\%USERNAME%-%1.txt"
goto :EOF


:ENDE
If /i NOT "%SAVENAME%" == "" (
	If /i NOT "%SAVESESSION%" == "" %CURPATH%logoff.exe %SAVESESSION% /SERVER:"%SAVENAME%"
)

exit %EXITCODE%




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