none
Remoteapp MSI file publishing in Win Server 2012

    Pertanyaan

  • Hi,

    Is it no longer possible to publish remoteapps using MSI?

    The problem with this is that it's not possible to do file associations unless you use the Remote Desktop Web Connection.

    Best regards

    Kjartan

    21 Mei 2012 18:58

Jawaban

Semua Balasan

  • Hi Kjartan,

    That's correct, it is no longer possible to publish RemoteApp programs via MSI. The only way to install file type associations for RemoteApp programs is via a default RemoteApp and Desktop Connection (installed via group policy).

    Can you elaborate on your scenario? If you have a use case that was enabled by MSI publishing but is no longer possible in Server 2012, we would be interested to hear about it.

    Thanks,


    Travis Howe | RDS Blog: http://blogs.msdn.com/rds/default.aspx

    22 Mei 2012 22:51
  • Hi Kjartan,

    Thanks for your post.

    As Travis mentioned, you may describe your scenario more clearly, and give a feedback of the server 2012 RDS component. For best practice, I would suggest that we post this issue at Windows Server 8 forum. You can start a discussion there, which can get attention with experts who interested with it. Your understanding is highly appreciated.

    Windows Server "8" Beta General

    http://social.technet.microsoft.com/Forums/en-US/winserver8gen/threads

    Best Regards,

    Aiden


    Aiden Cao

    TechNet Community Support

    24 Mei 2012 6:51
  • It would be nice to return the "deploy via MSI" feature to the Remote Desktop suite.  Presently I use PSTOOLS to deploy my RemoteApp MSI's to my users.  Should I change to GPO, with Server 2012, I would still be unable to deploy as .RDP is not a valid extension for deployment via GPO -> Policies -> Software Settings -> Software Installation.

    Further more, the simplicity of the MSI, creating start menu icons (with actual icons, rather than the generic .RDP icon for all applications) was a nice bonus.

    I am not sure why Microsoft insists on removing all valued content when releasing a new flavor/generation of software...

    -Mike

    14 Juni 2012 16:01
  • Are you aware of the RemoteApp and Desktop Connections feature? We added this in Server 2008 R2 - it is an alternative way to install links to RemoteApp programs and Remote Desktop RDP files in users' start menus (with the proper icons). You can read more about it here: http://blogs.msdn.com/b/rds/archive/2009/06/08/introducing-remoteapp-and-desktop-connections.aspx

    In Server 2012, we've expanded upon this feature: you can now configure RemoteApp and Desktop Connections on end-user machines via GP, which also enables file type associations to be installed with the connection. I expect you'll see more details on this in a future blog post on the RDS blog.

    -Travis


    Travis Howe | RDS Blog: http://blogs.msdn.com/rds/default.aspx


    14 Juni 2012 18:06
  • A little old thread, but here are the scenario where we still need the MSI publishing:

    Most of our clients are still using Windows XP SP3 (which doesn't have the Remoteapp and desktop connection feature"). Only way would for them to use RD Web access, which doesn't give you file associations. So from 2008  to 2012, basically for windows XP clients we've 'lost' the ability to get the icons on the desktop and file associations.

    Any explanation as to why this is?


    07 Oktober 2012 21:28
  • HOLY COW!!! You're KIDDING ME, right?!?!?!

    We can no longer just hand an MSI to someone across the Internet and tell 'em "Click this"???  NOW we have to use RD WebAccess???  What the heck is wrong with you, Microsoft?!?!  That was THE GREATEST FEATURE of RemoteApps in Server 2008, the simple ability to give someone an MSI or an RDP file (including non-managed systems like home user's machines) and have it set up a quick link to a RemoteApp.  

    Now, we have to deal with setting up a web page so users can click through myriad confusing Web screens just to install an app?

    TONIGHT, we're reformatting and going back to Server 2008R2 where RemoteApps was easy-peasy and "just worked".  The more I user Server 2012, with its "Metro" crap-UI and feature-regressions, the more I want to look for server alternatives or push my clients to stay with Server 2008.


    -Dan

    15 Nopember 2012 1:59
  • There is however, a way to extract the .RDP files that the Control Panel generates on the client. If you would browse to the following path on a client that signed up for Remote Apps you can find those .RDP files.

    C:\Users\<username>\AppData\Roaming\Microsoft\Workspaces\<workspace ID>\Resource


    Theoretically, you would be able to distribute these .RDP files the old way. However, Microsoft would probably advise you to use the new Web Feed method since it creates more flexibility and provides central management.


    Andre


    10 Desember 2012 21:29
  • Aiden,

    For 2008 R2, we create MSI's to put on a website for our clients to download. All of our servers are in the cloud. The clients did not like the URL version due to the time for pages to load and number of clicks required to login each time they need to run our application.

    The .MSI version only has to be downloaded once, installed, then a one time login with "Remember settings". After that, the client simply double clicked the Remote app on their desktop or Start Menu folders allowing our application to load.

    The time for the IT team to create an .MSI took less than 5 seconds.

    Please explain to me where things have improved? Will this supposed new concept work with some clients that have the older XP OS?

    Improvements should always be a good thing, but removing other options that worked amazingly well is questionable. As they both could be considered different concepts, it would have been a good business strategy to leave the MSI available.

    13 Mei 2013 17:33
  • Although not a perfect solution yet, these tools I'm developing have helped other users:

    RemoteApp Tool is a basic alternative to RemoteApp Manager. It can create and configure remoteapps on Windows 7, 8, and Server. It will generate RDP files for your remoteapps.

    RDP2MSI which can create deployable MSIs from RDP files for you to distribute to your users. It is in the early stages of development and the MSIs can't do file associations yet, but I am working on that. My goal is to integrate it into the next release of RemoteApp Tool.

    -Kim

    10 September 2013 5:05
  • I Must agree with Dan on this, word By word;I feel the same way. Why oh why would you take away a feature that made Windows Terminal services compete with Vmware and Citrix

    As for the Metro UI: Microsoft needs to understand that server admins work remotely 99.(9) % of the time; Metro does not help at all(do you guys know how hard it it is to hit those 3 pixels at the top right to get a menu on a Remote connection?.. sheesh). I am always pro-upgrade but this is just annoying.

    Venting Done :)!

    Adrian


    • Diedit oleh shknbake 26 Nopember 2013 16:04
    26 Nopember 2013 16:03
  • Hi,

    You can use script to deploy remoteApp with extension association to Windows 7.
    First use a GPO to define the default URL connexion

    next use this script:

    [Reflection.Assembly]::LoadWithPartialName("System.Web") | Out-Null
    $BaseReg="HKCU:\Software\Classes"
    [system.net.ServicePointManager]::ServerCertificateValidationCallBack={$true}
    
    $FeedURL=(Get-ItemProperty HKCU:\Software\Policies\Microsoft\Workspaces).DefaultConnectionURL
    
    function getFormAuthCookie($URL)
    {
        $Request=[system.net.httpWebRequest]::create($URL)
        $CredCache= New-Object system.net.CredentialCache
        
        $Request.UseDefaultCredentials=$true
        $Request.AllowAutoRedirect=$true
        
        $responce=$Request.GetResponse()
        Write-Host "GetCookie:" $responce.StatusCode
        
        $FormsAuthCookie=""
        $StrmReader = New-Object system.io.streamreader($responce.GetResponseStream() )
        
        $FormsAuthCookie=$StrmReader.ReadToEnd()
        $StrmReader.Close()
        
        return $FormsAuthCookie
    }
    
    function GetConnectionXml($URL,$FormsAuthCookie)
    {
        $Request=[system.net.httpWebRequest]::create($URL)
        $Request.CookieContainer = New-Object system.net.CookieContainer
        $Request.CookieContainer.Add( $(New-Object system.net.cookie([system.web.security.FormsAuthentication]::FormsCookieName,$FormsAuthCookie,"/",$Request.RequestUri.Host)))
        $Request.UseDefaultCredentials=$true
        
        $responce=$Request.GetResponse()
        Write-Host "GetXML:" $responce.StatusCode
        
        $connectionXml=""
        $StrmReader = New-Object system.io.streamreader($responce.GetResponseStream() )
        
        $connectionXml=$StrmReader.ReadToEnd()
        $StrmReader.Close()
        
        return $connectionXml
    }
    
    function GetConnectionContents($URL)
    {
        $STRCookie=""
        $STRCookie=getFormAuthCookie($URL)
        $XMLContent=GetConnectionXml $URL $STRCookie
        
        return $XMLContent
    }
    
    function downloadFile($Source,$Dest,$FormsAuthCookie)
    {
        $Request=[system.net.httpWebRequest]::create($Source)
        $Request.CookieContainer = New-Object system.net.CookieContainer
        $Request.CookieContainer.Add( $(New-Object system.net.cookie([system.web.security.FormsAuthentication]::FormsCookieName,$FormsAuthCookie,"/",$Request.RequestUri.Host)))
        $Request.UseDefaultCredentials=$true
        
        $responce=$Request.GetResponse()
        Write-Host $responce.StatusCode
        
        $reader = $responce.GetResponseStream()
        
        $writer=New-Object system.io.filestream($Dest,[system.io.FileMode]::Create)
        
        [byte[]]$buffer = New-Object byte[] 4096
        [long]$total = [long]$count = 0
        
        do {
            	$count = $reader.Read($buffer, 0, $buffer.Length);
                $writer.Write($buffer, 0, $count);
        } while ($count -gt 0)
          
        $reader.Close()
        $writer.Flush()
        $writer.Close()
        $responce.Close()
    }
    
    function CreateFileAssoc($ext,$AppName,$rdp,$ico)
    {
        write-host $(".{0}={1}" -f $ext,$AppName)
    	mkdir (Join-Path $BaseReg ".$ext") -force | set-Item -Value ($AppName) -Force |Out-Null
    	mkdir (Join-Path $BaseReg "$AppName") -force | set-Item -Value ("File description") -Force |Out-Null
        mkdir (Join-Path $BaseReg "$AppName\DefaultIcon") -Force | set-Item -Value ("""$ico"",0") -Force |Out-Null
        mkdir (Join-Path $BaseReg "$AppName\shell") -Force | set-Item -Value ("Open") -Force |Out-Null
        mkdir (Join-Path $BaseReg "$AppName\shell\Open") -Force | set-Item -Value ("Ouvrir") -Force |Out-Null
        mkdir (Join-Path $BaseReg "$AppName\shell\Open\command") -Force | set-Item -Value ("mstsc.exe /REMOTEFILE:""%1"" ""$rdp""") -Force |Out-Null
    	
    }
    
    function new-Shortcut
    {
        param ( [string]$RDPFile, [string]$DestinationPath, [string]$Icon )
        $WshShell = New-Object -comObject WScript.Shell
        $Shortcut = $WshShell.CreateShortcut($DestinationPath)
        $Shortcut.TargetPath = "mstsc.exe"
        $Shortcut.Arguments = $RDPFile
        $Shortcut.IconLocation = $Icon+",0"
        $Shortcut.Save()
    }
    
    $STRCookie=""
    $STRCookie=getFormAuthCooky($FeedURL)
    $XMLData=GetConnectionXml $FeedURL $STRCookie
    $URI=New-Object system.uri($FeedURL)
    $xdoc=New-Object system.xml.xmldocument
    $xdoc.LoadXml($XMLData)
    
    $WorkingDir=((Get-Item Env:\APPDATA).value+"\Microsoft\RemoteApp")
    $BaseURI=$URI.Scheme+"://"+$URI.DnsSafeHost
    if( -not $(Test-Path $WorkingDir) )
        {
            mkdir $WorkingDir | Out-Null
        }
        
    #ShortCut Dir
    $MenuFolder= join-path (Get-Item Env:\APPDATA).value "Microsoft\Windows\Start Menu\Programs\RemoteApp"
    rmdir -Force $MenuFolder -ErrorAction silentlycontinue -Recurse
    mkdir -Force $MenuFolder | Out-Null
    
    foreach( $node in $xdoc.GetElementsByTagName("Resource") )
    {
        Write-Host $node.Title
        
        $httpRDPFile=$($BaseURI+$node.HostingTerminalServers.HostingTerminalServer.ResourceFile.URL)
        $RDPFILE=$($WorkingDir+"\"+$httpRDPFile.Split("/")[-1])
        downloadFile $httpRDPFile $RDPFILE $STRCookie
        
        $httpICOFile=$($BaseURI+$node.Icons.IconRaw.FileURL)
        $ICONFILE=$($WorkingDir+"\"+$httpICOFile.Split("/")[-1])
        downloadFile $httpICOFile $ICONFILE $STRCookie
        
        #Create File Assoc
        if( $node.FileExtensions.ChildNodes.Count -gt 0)
        {
            foreach( $ext in $node.FileExtensions.FileExtension )
            {
                CreateFileAssoc $ext.Name.trim(".") $node.Alias $RDPFILE $ICONFILE
            }
        }
        #Create Shortcut
        new-Shortcut $RDPFILE $($MenuFolder+"\"+$node.Title+".lnk") $ICONFILE
    }
    

    Best regards

    Benoit LEFEVRE


    03 Juni 2014 8:19
  • I use "RemoteApp and Desktop Connection" in control panel, and i can open all remote app programs, but it is not possible to open a file using drag and drop feature, double click and start file with it's extension, etc

    To open a file we have to start remote app program in start menu and go to File > Open > go to file directory to open it!!!

    Windows Server 2008 R2 is Better and easier.

    I'm going to go back to Windows Server 2008 R2.

    01 Juli 2014 5:35
  • It is possible to use File Type Associations with "RemoteApp and Desktop Connections" (eg double-click file with extension and have it open in a remote app).

    However it won't work if you configure the connection URL via the control panel.

    You MUST configure the connection URL via group policy (or local policy editor).

    1. Create a group policy and edit it -OR- run gpedit.msc

    2. Navigate to User Configuration > Administrative Templates > Windows Components > Remote Desktop Services > RemoteApp and Desktop Connections.

    3. Edit the policy setting Specify default connection URL.

    4. Click Enabled and enter the URL to the webfeed below.

    01 Juli 2014 6:04