Using RemoteApps on Surface RT (Windows RT)

First check out: How to make the Windows RT desktop touch friendly.

RemoteApps aren’t a new feature in Windows 8, they’ve actually been around since Windows Vista.  RemoteApps are similar to Remote Desktop sessions, but instead of the entire remote experience in a single full-screen window, individual application windows are displayed on the remote machine.  RemoteApp windows live on the same desktop and can be used alongside of local desktop apps.  RemoteApps even have separate taskbar entries for each window, and a small icon indicating they are running remotely.  For the most part, RemoteApps act very similarly to local apps, even touch and pen input is redirected as appropriate, thanks to the many improvements in RDP 8.0 for Windows 8.

 

Setting up RemoteApps for a single user (e.g. personal use) requires the following:

A Windows Server installation.  While Windows Server 2008/2008 R2 may work, I’m using Server 2012 Standard which will have a better touch experience.

A RemoteApp client.  Windows XP and higher can access RemoteApps, so you aren’t limited to Windows 8 or Windows RT.

I recommend installing Windows Server 2012 in a Virtual Machine, potentially with RemoteFX enabled on the VM server.  Neither are requirements though, so any Server 2012 installation should work just fine.

Configure the server

First make sure that you do the following on the server:

Enable Remote Desktop on the server and forward the appropriate port in order to provide access inside and outside the network.

Create or designate a user which will be running apps remotely.

Since RemoteApp uses remote desktop, confirm that you are able to access the machine remotely with the regular remote desktop client.

Enable RemoteApp

Create a registry file (text file with .reg extension) with the following contents:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList]
"fDisabledAllowList"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]
"PromptOnSecureDesktop"=dword:0

Name the file Enable-RemoteApp.reg and run it on the server.  This will disable the allowed app list completely, letting us run any application we’d like.  Additionally, Secure Desktop is turned off to make the elevation experience cleaner and more touch friendly.

Note: This is not the configuration you would use for a large-scale RemoteApp deployment, but this makes sense for an administrator granting themselves access to any allowed resource)

Warning: Only disable secure desktop if the implications are understood and accepted.

Now that the server is ready to remote apps onto another client, install the software you’d like to use remotely.  I installed Visual Studio 2012, Office 2013 and a handful of apps from Ninite.com.  Windows Store apps can’t be run remotely through RemoteApp.

Connecting to RemoteApps

One of the easiest ways to deploy a RemoteApp is to craft a RDP file (text file) which contains the configuration necessary to access the remote machine, and which program to start.  I’m using the following template:

screen mode id:i:1
use multimon:i:1
session bpp:i:32
winposstr:s:0,1,2244,149,3044,749
compression:i:1
keyboardhook:i:2
audiocapturemode:i:1
videoplaybackmode:i:1
connection type:i:7
networkautodetect:i:1
bandwidthautodetect:i:1
displayconnectionbar:i:1
enableworkspacereconnect:i:0
disable wallpaper:i:0
allow font smoothing:i:1
allow desktop composition:i:1
disable full window drag:i:0
disable menu anims:i:0
disable themes:i:0
disable cursor setting:i:0
bitmapcachepersistenable:i:1
full address:s:[[SERVER_ADDRESS]]
audiomode:i:0
redirectprinters:i:1
redirectcomports:i:1
redirectsmartcards:i:1
redirectclipboard:i:1
redirectposdevices:i:0
autoreconnection enabled:i:1
authentication level:i:2
prompt for credentials:i:0
negotiate security layer:i:1
remoteapplicationmode:i:0
alternate shell:s:
shell working directory:s:
gatewayhostname:s:
gatewayusagemethod:i:4
gatewaycredentialssource:i:4
gatewayprofileusagemethod:i:0
promptcredentialonce:i:0
use redirection server name:i:0
rdgiskdcproxy:i:0
kdcproxyname:s:
devicestoredirect:s:*
drivestoredirect:s:*

// RemoteApp
remoteapplicationmode:i:1
RemoteApplicationName:s:[[APP_NAME]]
RemoteApplicationProgram:s:[[APP_PATH]]
DisableRemoteAppCheck:i:1
Prompt for Credentials on Client:i:0
Alternate Shell:s:rdpinit.exe

Copy the template into a text file called Command Prompt.rdp and replace the following:

[[SERVER_ADDRESS]] -> your server address in the form of host or host:port.  E.g. remote.example.com or example.com:3390

[[APP_NAME]] -> Command Prompt

[[APP_PATH]] -> %windir%\system32\cmd.exe

The template enables most visual enhancements, shares disks, audio and Smart Cards with the host session.  Lines above // RemoteApp can be replaced with the contents of your Default.rdp (in the Documents library), or any other saved RDP connection.

Now copy Command Prompt.rdp onto the Surface RT and double-click it.  If there isn’t an existing RemoteApp connection, one will be established before the window appears.

PowerShell RemoteApp running on Windows RT

 

Clicking the same .rdp file again will open another Command Prompt (without the cost of setting up another session), and running a command which creates new windows (e.g. notepad) will properly remote them over.  The beauty of RemoteApp is that many apps can be running remotely at the same time, and apps from different machines can share the same desktop on the client.

Creating more RemoteApp shortcuts

I wrote a little PowerShell script to generate shortcut files:

function Create-RemoteAppEntryPoints($ServerAddress)
{
    $Apps = @(
        @('Command Prompt','%windir%\system32\cmd.exe'),
        @('Explorer','%windir%\explorer.exe'),
        @('mIRC','E:\mIRC\mIRC.exe'),
        @('Firefox','C:\Program Files (x86)\Mozilla Firefox\firefox.exe'),
        @('Spotify','C:\Users\%username%\AppData\Roaming\Spotify\spotify.exe'),
        @('Outlook','C:\Program Files (x86)\Microsoft Office\Office15\OUTLOOK.EXE')
    )

    $FSSafeServerAddress = $ServerAddress.Replace(":","")

    new-item -ItemType Directory -Path ".\$FSSafeServerAddress" -ErrorAction SilentlyContinue | Out-Null

    $Apps | % {
        Create-RemoteAppEntryPoint $_[0] $_[1] $ServerAddress ".\$FSSafeServerAddress"
    }
}

function Create-RemoteAppEntryPoint($AppName, $AppPath, $ServerAddress, $OutputFolder)
{
    $contents = Get-Template -TemplateFileName "RemoteApp.rdp" @{
        'SERVER_ADDRESS'=$ServerAddress
        'APP_NAME'=$AppName
        'APP_PATH'=$AppPath
        'APP_GUID'=[Guid]::NewGuid()
    }

    SC "$OutputFolder\$AppName.rdp" -Value $contents
}

function Get-Template($TemplateFileName, $Items)
{
    $str = [string]::Join([System.Environment]::NewLine, (Get-Content "$ProfileRoot\Templates\$TemplateFileName"))
    $Items.Keys |% { $str = $str.Replace("[[" + $_.ToUpper() + "]]", $Items[$_]) }
    return $str
}

It’s great to have shortcuts to apps which I know beforehand I’ll want, but what about just getting a list of apps on the system?  Windows 8 replaces the Start Menu with the Start Screen, a full-screen experience for finding and launching apps.  While we can’t remote over this UI, we can do something similar in spirit.  The list of apps shown on Start is backed by what Windows knows as “Apps Folder”, a special shell folder which provides items for Start and All Programs View. This folder isn’t normally displayed anywhere except on Start, but it’s simple to create an entry point.  Simply create a new folder anywhere on the system (e.g. on the desktop) called:

Applications.{4234d49b-0245-4df3-b780-3893943456e1}

And for good measure, a Settings folder can also be useful:

Settings.{ED7BA470-8E54-465E-825C-99712043E01C}

The text before the . Is the display name for the folder, it can be anything, the GUID is the part which references the location it should point to.  I like to pin these folders to the left sidebar in File Explorer so they’re always easy to get to.

 

Opening explorer as a RemoteApp will yield our new Applications folder, with quick access to any programs installed on the system.  Simply double-tap to run the program.

 

Building Windows Store apps

If we put everything together, some really cool stuff becomes possible.  Firing up Visual Studio 2012 over RemoteApp works great, now I’ve got the horsepower of a fast machine running the compiler and doing the heavy lifting, and Windows RT is simply displaying the UI.  Developing desktop apps this way works great, just hit F5 to run and the workflow hasn’t changed.  Windows Store apps can’t be deployed and remotely displayed though.  Fortunately Visual Studio 2012 includes remote debugging functionality.  Simply download the Remote Tools for Visual Studio 2012 ARM (English) and install them on Windows RT.  Tap on the Remote Debugger tile on Start to begin.

Remote Debugger running on Windows RT

 

Switch back to Visual Studio and click the arrow next to Local Machine, and select Remote Machine.  Select your device or manually enter the address in the resulting dialog.

Remote Debugger setup in Visual Studio 2012

 

Tap Play or press F5 to launch the app under the debugger.  The app deploys and runs natively on Windows RT.  Unfortunately, setting a breakpoint causes some component to stop processing window messages while the debugger is broken, so this functionality is unfortunately reduced.

Windows Store app launching on Windows RT

And switching back to the desktop on the Surface…

 

Many apps run well in RemoteApp, even over 3G connections

Spotify RemoteApp on Windows RT

 

It’s awesome to get some work done on the road or connect up to a bigger screen to use the Surface RT as a workstation.

 

RemoteApps drastically increase the functionality of the Windows RT desktop, giving you long battery life and access to all of your productivity apps.  Access a touch-friendly Outlook or even Silverlight content through IE10.

Silverlight running in Internet Explorer 10 RemoteApp on Windows RT

 

Notes:

Office won’t install on Windows Server unless it is a Volume License.

Since there isn’t a taskbar in the RemoteApp session, windows like to snap up to the full screen size, without reserving space for the taskbar. Perhaps forcing an exact screen resolution which doesn’t contain the taskbar area could resolve this.

If you are using High-DPI in the remote session, apps which aren’t DPI-Aware (like Spotify) need to have their compatibility settings changed such that High-DPI is disabled, otherwise the coordinates do not translate properly and the UI isn’t responsive to touch or mouse input. (Ensure the DPI is the same on the Surface and the Server, otherwise window coordinates do not match up, and the taskbar isn’t excepted from the working area.)

IM apps like Digsby work well, but the taskbar “needy state” (flashing) does not translate to the remote session. Jumplists and taskbar thumbnail controls also don’t translate over.

November 4, 2012