Dynamic Remote Desktop Connection Manager connection list

Microsoft recently released a free tool for managing multiple remote desktop connections called “Remote Desktop Connection Manager”.

A sample screenshot:

image

There are several nice features, such as “Connect group” which lets you connect to all servers in a group at once:

image

On the “Group Properties” you may set common settings for all connections in the group, like logon credentials:

image

Further, there are group properties for RDS Gateway (formerly TS Gateway), display settings, local resources and so on.

There are several applications for remote desktop connections on the market, and some of them got these settings as a per server setting. Its nice to be able to group servers and configure common settings.

Dynamically creating the connection list

When you work in larger environments with hundreds, maybe thousands of servers, setting up each connection manually isnt an option.

Since Remote Desktop Connection Manager stores the config-files in xml-files, its rather easy to create dynamic config-files for a domain using Windows PowerShell. Ive created a script to accomplish this, called New-RDCManFile.ps1, available from here. It uses Microsofts PowerShell-module for Active Directory, which is available in Windows Server 2008 R2 and RSAT for Windows 7.

The script does the following:
Creates a template xml-file
Inserts the logged on user
s domain name in the file properties
Inserts the logged on users domain name in the group properties
Inserts the logged on user
s username in the logoncredentials section
Inserts the logged on users domain name in the logoncredentials section
Retrieves all computer objects from Active Directory with the word “server” in the operatingsystem property
Adds each computer object as a server object
Saves the XML-file to %userprofile%domain-name.rdg

When done you can open the rdg-file in Remote Desktop Connection Manager. I would recommend you to insert your password in the Group Properties to avoid being asked for credentials for each connection.

Feel free to customize the script to your needs, in example by editing the XML-template to edit the Group Properties. Another customization might be creating a group for each server OU for enhanced overview in larger environments.

If you would rather use Quests PowerShell Commands for Active Directory (which works on downlevel operatingsystems like Windows XP and Windows Server 2003), or any other way to retrieve the server names, you may customize this on line 110.

You might also want to schedule the script to run on a regular basis, saving the file to a central location. This way the IT personnel will always have access to the latest version with the most recent servers added.

If you got any further ideas or comments, please let me know in the comments section below.

21 thoughts on “Dynamic Remote Desktop Connection Manager connection list

  1. Hi Andreas,

    Nice article! But…

    I was getting this error message from your script when using the Quest AD cmdlet’s:

    Cannot set “displayName” because only strings can be used as values to set XmlNode properties.
    At C:usersibss077documentspowershellVarious ScriptsNew-RDCManFile.ps1:110 char:9
    + $server. <<<< DisplayName = $($_.Name)
    + CategoryInfo : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException

    Cannot set "name" because only strings can be used as values to set XmlNode properties.
    At C:usersibss077documentspowershellVarious ScriptsNew-RDCManFile.ps1:111 char:9
    + $server. <<<< Name = $($_.DNSHostName)
    + CategoryInfo : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException

    I've solved it by changing this portion of the script:

    Get-QADComputer -LDAPFilter "(operatingsystem=*server*)" | select name,dnshostname |
    ForEach-Object {
    $server = $server.clone()
    $server.DisplayName = $_.Name
    $server.Name = $_.DNSHostName

    to:

    Get-QADComputer -LDAPFilter "(operatingsystem=*server*)" | select name,dnshostname |
    ForEach-Object {
    $server = $server.clone()
    [string]$server.DisplayName = $_.Name
    [string]$server.Name = $_.DNSHostName

    Hopefully this will help others also.

    Regards, Richard

  2. Excellent script. I also got the error above (using the AD module). My fix was similar.
    $server.Name = “{0}” -f $_.DNSHostName

  3. Pingback: Building A Remote Desktop Manager Connection List | Sev17

  4. Pingback: What's your Favorite Remote Desktop Manager ?

  5. Hi Jan,

    I modifed the template this way, but i am getting this error:

    You cannot call a method on a null-valued expression.
    At C:scriptsNew-RDCManFile_Quest.ps1:155 char:50
    + $file = (@($xml.RDCMan.file.properties)[0]).Clone <<<< ()
    + CategoryInfo : InvalidOperation: (Clone:String) [],
    RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

    a0serverList
    True

    a0servers
    True

    False

    4
    False
    False

    s0serverList
    True

    s0servers
    True

    False

    4
    False
    False

  6. This is certainly a reliable and accurate description of how to manage multiple remote desktop connections at once. But many people who want to do this don’t have the requisite tech background, hence opt for turnkey remote desktop products. What is your feeling on this?

    • Hi, thanks for your feedback.

      Usually I suggest that the script are set up as a scheduled task on a server, so that the config-file are updated i.e. once a day. Then the staff in the IT-department may copy the file from a central file-share whenever they want the latest version containing all servers in the domain. Of course some knowledge on using Windows PowerShell are required to set this up, however, to use the generated config-file there arent the need for any PowerShell-knowledge.

      I havent tested your product, though it seems nice based on the product overview on your website.

  7. Pingback: Remote Desktop Connection Manager (RDCMan) + Powershell = Win | vNinja.net

  8. How do you include the password? I tried:

    $group.logonCredentials.Password = “mypasswordhere”

    and also:

    [string]$group.logonCredentials.Password = “mypasswordhere”

    but get:

    Cannot set “password” because only strings can be used as values to set XmlNode properties.

  9. I am also interested in a version of the script that builds the server list based upon an OU or child domain. Anybody got this figured out?

  10. Pingback: theboywonder.co.uk