Introduction
MSTSCUI.NET is simply a graphical interface to Microsoft's command-line Remote Desktop Connection, mstsc.exe. This application makes it easier for those who use Remote Desktop sessions often through the day. It uses the .NET Framework v1.1.
Some of the things this app demonstrates:
- Reading a simple XML document
- Creating a systray application
- Dynamically populating a context menu
All in all, a very simple and useful little application.
General Use
top
MSTSCUI.NET runs as a taskbar application to allow quick and easy access to RDP servers:
It's generally reccommended to place an entry in your startup group so that the application launches on startup.
Simply right-click on the taskbar icon to show the menu:
Select "Edit List" for a shortcut to edit your server configuration file, and "Refresh List" to reload it.
MSTSCUI.NET.exe.config
top
Use the app.config file to set the name of the server configuration file with the "ServerConfigFile
" key, and set your preferred editor with the "Editor
" key. It's not recommended you change the "ServerConfigFile
" key. The "Editor
" key should be a fully qualified path if the editor you're using is not already setup in your path environment variables.
Below is the listing of the default app.config file:
<xmp>
<configuration>
<appSettings>
-->
<add key="ServerConfigFile" value="mstscui_servers.xml" />
-->
<add key="Editor" value="notepad" />
</appSettings>
</configuration>
</xmp>
Server Configuration XML (mstscui_servers.xml)
top
Use the server configuration file to setup each server.
In order to display a horizontal separator bar on the menu, use:
<xmp>
<server displayname="-" />
</xmp>
Each server element has an attribute called "displayname
" - this is the name displayed on the menu. You can be as descriptive here as necessary.
servername
- server name or IP address
port
- default is 3389
resolution
- "fullscreen
", or any resolution entered in this fashion: 1024x728
console
- 1 for yes, takeover console session, 0 for no, do not takeover console
connectionfile
- fully qualified path to the RDP file if you want to use one
Below is the listing of a sample server config file:
<xmp>
<servers>
<server displayname="eventvan02 / secure">
<servername>eventvan02</servername>
<port>3389</port>
<resolution>1024x768</resolution>
<console>0</console>
<connectionfile></connectionfile>
</server>
<server displayname="-" />
<server displayname="vancorpbc1">
<servername>vancorpbc1</servername>
<port>3389</port>
<resolution>fullscreen</resolution>
<console>0</console>
<connectionfile></connectionfile>
</server>
</servers>
</xmp>
Select Code Samples
top
Launching msctsc.exe...
Private Sub ConnectToServer(ByVal sServer As String)
Try
Dim sCommand As String = _
System.Environment.GetEnvironmentVariable("SystemRoot") & _
"\system32\mstsc.exe"
System.Diagnostics.Process.Start(sCommand, _
GetArgumentsForServer(sServer))
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Reading the XML configuration file...
Private Function GetArgumentsForServer(ByVal sServer As String) As String
Dim sConnection As String
Dim sPort As String
Dim sResolution As String
Dim arrResolution() As String
Dim sConsole As String
Dim sConnectionFile As String
Dim sArguments As String
Dim parentnode As XmlNode = doc.SelectSingleNode("servers")
Dim servernode As XmlNode = _
SelectNode(parentnode, "displayname", sServer)
Dim childnode As XmlNode
For Each childnode In servernode.ChildNodes
Select Case UCase(childnode.Name)
Case "SERVERNAME"
sConnection = " /v:" & Trim(childnode.InnerText)
Case "PORT"
If Trim(childnode.InnerText) <> "3389" And _
childnode.InnerText <> String.Empty Then
sPort = ":" & childnode.InnerText
Else
sPort = String.Empty
End If
Case "RESOLUTION"
If InStr(UCase(childnode.InnerText), "X") > 0 Then
arrResolution = Split(UCase(childnode.InnerText), "X")
sResolution = " /w:" & arrResolution(0) & _
" /h:" & arrResolution(1)
Else
sResolution = " /f"
End If
Case "CONSOLE"
If CBool(childnode.InnerText) Then
sConsole = " /console"
Else
sConsole = String.Empty
End If
Case "CONNECTIONFILE"
sConnectionFile = childnode.InnerText
Case Else
MessageBox.Show("Unrecognized node in XML: " & _
childnode.InnerText)
End Select
Next
sArguments = sConnection & sPort & sResolution & sConsole
Return sArguments
End Function
Private Function SelectNode(ByVal parentNode As XmlNode, _
ByVal attributeName As String, _
ByVal attributeValue As String) As XmlNode
Dim node As XmlNode = Nothing
If parentNode.HasChildNodes Then
Dim nodeName As String = parentNode.ChildNodes(0).Name
Dim path As String = nodeName + "[@" + _
attributeName + "='" + attributeValue + "']"
node = parentNode.SelectSingleNode(path)
End If
Return node
End Function
History