In this article, I'll discuss how you can use a batch script to automatically connect a user to their disconnected session.
Prerequisites:
•The script, which can be downloaded here or at the end of this article.
•A terminal server that you have administrator access to.
For this tutorial, I'm going to step through the script to explain what happens.
Section 1: Variable declarations and headers:
:LoginCount
SetLocal
Set LoginCount=0
Set DiscSessNum=-1
Basically, all I'm doing here is declaring some variables, setting them equal to 0, and forcing the script to localize all these variables within this script.
Localizing the variables isn't absolutely necessary, but this helps to prevent variables from mixing up between your scripts, especially if you merge this script with other scripts.
Section 2: Query the server and seek out the user:
Rem Checking the server to see if the user is loggin on twice...
For /f %%j in ('qwinsta %UserName% ^| find /c /i " %UserName% "') Do Set LoginCount=%%j
The For command runs a QWinsta.exe command, which lists all the current users on the local server. This output of the QWinsta command is then run through the Find command.
The Find command will then output the number of times it finds the user's name (%UserName%). This number is stored in the LoginCount variable.
Section 3: Verify the user is logged in twice and disconnected once:
Rem LoginCount will be equal or greater than 2 if the user is logged in already
If %LoginCount% EQU 1 Goto eLoginCount
Rem The user is logged in more than once...so are at least one of their sessions disconnected?
For /f "skip=1 tokens=2,3" %%i in ('qwinsta %UserName% ^| find /i "disc"') Do (if %%j==disc set DiscSessNum=%%i)
Rem If DisconnectedSessionNum is a valid number, then let's try to connect to it...
If %DiscSessNum% EQU -1 Goto eLoginCount
LoginCount's value is now checked. If it equals 1, that means the current user is only logged in once, so the rest of the script can be skipped (Goto eLoginCount).
If LoginCount's value is greater than 1, that means the current user is logged in twice. If this is the case, another For loop is run to verify that at least one of the sessions is disconnected.
The For loop will run another QWinsta command, and the output is checked to see if any of the user's sessions are in the disconnected state. The session number of the disconnected state (if one exists) is then saved in the variable DiscSessNum.
Lastly, DiscSessNum is verified just to make sure that it is a valid number.
Section 4: Connect the user to their disconnected session:
Rem Check what OS we are running:
Rem Windows 2000/2003 or NT?
If Exist %SystemRoot%\System32\TSCon.exe (TSCon.exe %DiscSessNum%) Else (Connect.exe %DiscSessNum%)
Because the connect function was renamed between Windows NT TSE and Windows 2000/2003, we need to figure out which one to use.
The TSCon.exe or the Connect.exe utility will both make the current user session attach to the disconnected session. The utility will then leave the current session in the disconnected state.
Section 5: Cleanup before we exit:
Rem The user should now be connected to the disconnected session.
Rem The current session will not become disconnected, so let's kill it before we end this script.
EndLocal
Logoff.exe
:eLoginCount
As the script exits, it terminates the variable localization for the script. As I said before, this isn't necessary, but it helps to keep things encapsulated.
After the TSCon.exe/Connect.exe command runs, it'll leave the current session (which is running this script) in a disconnected state. Running the Logoff.exe command will log the current session off.
Well, that's about it. You've just finished a walkthrough tutorial for this script.
And...no tutorial would be complete without a download, so here is the script in its entirety (compressed):
Check_Logon_and_Connect.zip
|