在上一篇的文章中,我讨论了如何使用 PowerShell 建立了一个基本的远程桌面服务环境。在那篇文章中,我们讨论了如何做一个快速的 RDS 部署,添加会话集合和 RemoteApp。在这篇文章我们会潜入深出的来探索PowerShell RDS,看一看我们如何可以更进一步自动化安装、 配置和维护的远程桌面服务与 Windows server 2012 R2使用可用的新的 PowerShell 命令。Windows PowerShell是一个基于任务的命令行 shell 和脚本语言,特别是用于系统管理。主要帮助技术 (IT) 专业人员提供在使用Windows PowerShell cmdlet 来编写脚本和自动执行的任务。在Windows server 2012 R2和Windows 8.1中,powershell的版本为4.0,在powershell 4.0中,提供了很多Remote Desktop server的命令,若要列出所有可用的 cmdlet,可以使用命令进行查询,其命令为:

Get-Command –Module RemoteDesktopServices cmdlet

如果要获得更多有关信息,或任何这些 cmdlet 的语法,可以使用-Help <cmdlet name> cmdlet,其中< cmdlet 名称 >是您想要查询的 cmdlet 名称。更多详细信息,可以运行以下 cmdlet 的命令:

● Get-Help <cmdlet name> -Detailed

● Get-Help <cmdlet name> -Examples

● Get-Help <cmdlet name> -Full

除此之外,也可以在微软的TechNet的网站上进行查询,其网址为:

http://technet.microsoft.com/en-us/library/jj215451.aspx

clip_image002

目前Remote Desktop Cmdlets in Windows PowerShell只提供英语服务器,不提供中文的服务。

在使用Windows server 2012 R2中的功能时,必须是需要创建一个集合,这样才能将RD应用程序或者是RD虚拟化主机进行发布和使用,在之前的部署中,在使用图形化界面(GUI)下,安装RD会话主机或者是RD虚拟化主机时,会自动创建一个集合,例如,在快速部署安装RD会话主机时,会自动创建一个名为QuickSessionCollection集合,并且会在集合中默认发布3个RemoteApp应用,分别是画图、写字板和计算器。但是当使用powershell来进行安装后,默认情况下是不会创建集合。

clip_image004

如果采用标准部署安装,或者是使用powershell进行安装,则需要手动创建一个集合,在powershell中,通过命令New-RDSessionCollection来创建集合。首先我们可以看下命令New-RDSessionCollection的语法。

clip_image006

New-RDSessionCollection [-CollectionName] <String> -SessionHost <String[]> [-CollectionDescription <String> ] [-ConnectionBroker <String> ] [ <CommonParameters>]

语法中包含一些关键字,其中有CollectionName、SessionHost、CollectionDescription和ConnectionBroker,如果需要在服务器RDS.mabofeng.com服务器中创建集合名称为mabofeng,其命令为:

PS C:\Users\Administrator> New-RDSessionCollection -CollectionName mabofeng -CollectionDescription mabofeng -SessionHost rds.mabofeng.com -ConnectionBroker rds.mabofeng.com -Verbose

这里我们将SessionHost和ConnectionBroker建立在同一个服务器中,如果采用的是标准部署,则需要指定不同的SessionHost和ConnectionBroker,如果服务器有多台SessionHost,可以在SessionHost命令后面加入 @("RDSH01.mabofeng.com"," RDSH02.mabofeng.com"),一次性要全部输入完成。

clip_image008

当执行完成命令后,可以在powershell中会显示创建集合的结果。

clip_image010

在图形界面下,就可以看到我们之前使用powershell命令创建的名为mabofeng的集合。

clip_image012

在使用powershell命令New-RDSessionCollection创建集合的时候,难免会遇到一些问题,在执行命令的时候往往会报错,例如,可能出现错误提示为:无法将“New-RDSessionCollonCollection”项识别为cmdlet、函数、脚本文件或可运行程序的参数,请检查名称的拼写,如果包括路径,请确保路径的正确,然后再试一次。遇到这情况,往往是由于在使用powershell的安装Remote desktop Server之前,没有在Windows Server 2012R2中导入新的RemoteDestop 模块组,在使用New-RDSessionCollection命令之前,首先需要使用命令为:import-module RemoteDesktop。

clip_image014

在使用powershell命令New-RDSessionCollection创建集合的时候,遇到的另一个问题就是,可能出现错误提示为:找不到接收实际参数“Session”的位置形式参数,这往往是由于拼写的不正确所造成的,在CollectionDescription的描述中,尽量不要使用空格,如果一旦使用空格,建议在CollectionDescription中加入双引号,否则会造成拼写错误。

clip_image016

如果在建立集合的时候提示Unable to configure the RD Session Host Server servername. Invalid Operation(无法配置RD会话主机服务器服务器。无效的操作)这是由于计算机域控制器环境中设置了策略。

clip_image018

以管理员的帐号登录域控制器中,在域策略中default Domain Policy策略中,找到策略-管理模版-Windows组件-远程桌面服务-远程桌面会话主机-授权。

clip_image019

在授权的策略中找到使用指定的远程桌面许可证服务器,将此策略设置为禁用,然后通过刷新策略命令进行刷新,然后再次运行创建集合命令。

clip_image021

删除集合

当我们不需要某个集合的时候,我们可以通过Remove-RDSessionCollection命令来删除集合,可以通过powershell来查询命令的语法。

clip_image023

Remove-RDSessionCollection [-CollectionName] <String> [-ConnectionBroker <String> ] [-Force] [-Confirm] [-WhatIf] [ <CommonParameters>]

如果我们要删除名称为mabofeng的集合,则使用命令为:

Remove-RDSessionCollection -CollectionName mabofeng -ConnectionBroker RDS.mabofeng.com

其中需要指定集合的名称和ConnectionBroker服务器名称。在运行命令后,系统会提示时候继续执行此操作,默认为Y,如图所示。

clip_image025

输入Y,然后回程后,系统会开始删除集合,集合中的RemoteApp则无法使用,删除结束后,无需启动计算机。

clip_image027

创建一个基于虚拟机的集合

对于VDI环境,我们也可以以同样的当时创建虚拟机集合,在powershell中,可以使用命令New-RDVirtualDesktopCollection来创建虚拟机集合,但是使用powershell来创建虚拟机集合,在前期的工作中是需要做好充足的准备。虚拟桌面就是在hyper-v主机上运行虚拟机,用户可以使用RDS直接进行远程连接,虚拟桌面集合可以包含一个或者多个虚拟桌面,主要用在VDI部署场景中,虚拟桌面可以是以管理的,也可以是未经管理的。

在虚拟机集合中,虚拟桌面可以是池化的,或者是个人的,池化虚拟桌面这种类型可供用户登录到池中的任何一个虚拟桌面,获得相同的体验,用户在虚拟桌面中进行的任何自定义改动都可以保存到专用的用户配置文件磁盘中。而个人虚拟桌面着这种类型会将专用虚拟桌面永久分配给某一用户账户,每次用户登录时,都能看到相同的虚拟桌面,左面可以安装需要进行定制,所有定制改动都会保存到虚拟桌面中。

所以在使用powershell命令去创建虚拟机集合,是需要大量的前期准备,这包括需要在虚拟机集合的服务器中,安装Hyper-V角色和远程桌面服务,然后需要安装模版虚拟机,调优优化,并进行分装,最后还需要共享空间。

首先我们先看下New-RDVirtualDesktopCollection命令的语法:

Parameter Set: PersonalMgd

New-RDVirtualDesktopCollection [-CollectionName] <String> -PersonalManaged -StorageType <VirtualDesktopStorageType> -VirtualDesktopAllocation <Hashtable> -VirtualDesktopTemplateHostServer <String> -VirtualDesktopTemplateName <String> [-AutoAssignPersonalVirtualDesktopToUser] [-CentralStoragePath <String> ] [-ConnectionBroker <String> ] [-CustomSysprepUnattendFilePath <String> ] [-Description <String> ] [-Domain <String> ] [-Force] [-GrantAdministrativePrivilege] [-LocalStoragePath <String> ] [-OU <String> ] [-UserGroups <String[]> ] [-VirtualDesktopNamePrefix <String> ] [ <CommonParameters>]

Parameter Set: PersonalUnmgd

New-RDVirtualDesktopCollection [-CollectionName] <String> -PersonalUnmanaged -VirtualDesktopName <String[]> [-AutoAssignPersonalVirtualDesktopToUser] [-ConnectionBroker <String> ] [-Description <String> ] [-Force] [-GrantAdministrativePrivilege] [-UserGroups <String[]> ] [ <CommonParameters>]

Parameter Set: PooledMgd

New-RDVirtualDesktopCollection [-CollectionName] <String> -PooledManaged -StorageType <VirtualDesktopStorageType> -VirtualDesktopAllocation <Hashtable> -VirtualDesktopTemplateHostServer <String> -VirtualDesktopTemplateName <String> [-CentralStoragePath <String> ] [-ConnectionBroker <String> ] [-CustomSysprepUnattendFilePath <String> ] [-Description <String> ] [-DisableVirtualDesktopRollback] [-Domain <String> ] [-Force] [-LocalStoragePath <String> ] [-MaxUserProfileDiskSizeGB <Int32> ] [-OU <String> ] [-UserGroups <String[]> ] [-UserProfileDiskPath <String> ] [-VirtualDesktopNamePrefix <String> ] [-VirtualDesktopPasswordAge <Int32> ] [-VirtualDesktopTemplateStoragePath <String> ] [ <CommonParameters>]

Parameter Set: PooledUnmgd

New-RDVirtualDesktopCollection [-CollectionName] <String> -PooledUnmanaged -VirtualDesktopName <String[]> [-ConnectionBroker <String> ] [-Description <String> ] [-Force] [-MaxUserProfileDiskSizeGB <Int32> ] [-UserGroups <String[]> ] [-UserProfileDiskPath <String> ] [ <CommonParameters>]

New-RDVirtualDesktopCollection命令的语法有4中模式,有PersonalMgd、PersonalUnmgd、PooledMgd和PooledUnmgd,就是个人托管桌面、个人非托管桌面、池化托管桌面和池化非托管桌面。

其中参数包括:

-AutoAssignPersonalVirtualDesktopToUser:当创建一个新的个人虚拟桌面集合时,该服务器会自动将虚拟桌面关联与用户帐户。

-CentralStoragePath:指定集合中的虚拟桌面的中央存储位置的路径。使用StorageType参数指定的存储 (本地或集中式) 集合类型。

-CollectionName:指定个人的虚拟桌面集合的名称。

-ConnectionBroker:指定远程桌面部署的远程桌面连接代理 (RD 连接代理) 服务器。如果不指定一个值,该 cmdlet 将使用本地计算机的完全限定的域名称 (FQDN)。

-CustomSysprepUnattendFilePath:提供无人参与的安装设置远程桌面收集的.xml 文件的路径。

-Description:指定无人参与的安装文件的描述性名称。

-DisableVirtualDesktopRollback:指示服务器禁止虚拟桌面部署的回滚。

-Domain:添加虚拟桌面的 Active Directory 域的指定完全限定的域名 (FQDN)。

-Force:运行操作而不会提示用户进行确认。

-GrantAdministrativePrivilege:指示服务器授予管理权限的用户帐户,则服务器将分配到某个给定的个人虚拟桌面。此参数仅适用于个人虚拟桌面。

-LocalStoragePath:指定对虚拟桌面的本地存储位置的路径。使用StorageType参数指定的存储此集合类型。

-MaxUserProfileDiskSizeGB:指定用户配置文件磁盘的最大大小 (以千兆字节)。

-VirtualDesktopAllocation:指定的值的集合 (键 = 值对),分配给远程桌面虚拟化 (RD 虚拟化主机) 服务器的虚拟桌面。

-VirtualDesktopName:指定的虚拟桌面将添加到非托管的集合的名称。

-VirtualDesktopNamePrefix:指定在托管的虚拟桌面集合中自动创建远程桌面服务的虚拟桌面名称的前缀。

-VirtualDesktopPasswordAge:指定的天数后,服务器强制执行密码更新。

-VirtualDesktopTemplateHostServer:指定与该集合关联的虚拟桌面模板的存储位置的服务器的完全限定的域名 (FQDN)。

-VirtualDesktopTemplateStoragePath:指定的模板的虚拟桌面集合的存储位置的路径。

接下来,我们就来使用New-RDVirtualDesktopCollection命令创建一个托管池虚拟桌面集合,并指定虚拟桌面集合的配置设置。

PS C:\Users\Administrator> PS C:\> New-RDVirtualDesktopCollection -CollectionName Virtual Desktop Pool -PooledManaged -VirtualDesktopTemplateName RDS-Template -VirtualDesktopTemplateHostServer hyper-v01.mabofeng.com -VirtualDesktopAllocation @{"hyper-v01.mabofeng.com"=1;" hyper-v02.mabofeng.com"=2} -StorageType LocalStorage -Description "mabofeng Virtual Desktop Pool" -UserGroups "mabofeng\domain users" -ConnectionBroker "rdcb.mabofeng.com" -VirtualDesktopNamePrefix "mabofeng-A" -VirtualDesktopPasswordAge 31 -UserProfileDiskPath "\\RDS.mabofeng.com\uvhd" -MaxUserProfileDiskSizeGB 10

如果需要删除拟桌面集合,则可以使用命令Remove-RDVirtualDesktopCollection,相比创建桌面集合,删除还是比较简单了,只需要知道集合的名称(CollectionName)和远程桌面连接代理(ConnectionBroker)就可以了。

Parameter Set: Default

Remove-RDVirtualDesktopCollection [-CollectionName] <String> [-ConnectionBroker <String> ] [-Force] [-Confirm] [-WhatIf] [ <CommonParameters>]

例如,我们删除名为Virtual Desktop Pool的虚拟桌面集合,其命令为:

PS C:\Users\Administrator> PS C:\> Remove-RDVirtualDesktopCollection -CollectionName Virtual Desktop Pool -ConnectionBroker rdcb.mabofeng.com -Force

注意,在删除桌面集合之前,确保集合中的虚拟机已经关机,否则会造成无法删除的情况。

创建 Remoteapp

RemoteDesktop PowerShell 模块还具有创建、更新和删除Remoteap的能力。一个 PowerShell 命令可以从指定的集合和 RD 连接代理检索 Remoteapp 和它们的属性。此 cmdlet 是Get-RDRemoteApp。例如,要检索所有 Remoteapp 可以使用下面的命令。

PS C:\Users\Administrator> Get-RDRemoteApp -CollectionName quicksessioncollection -ConnectionBroker rds.mabofeng.com

使用Get-RDRemoteApp检索命令可以看到目前已经发布的应用程序。

clip_image029

通过powershell命令发布应用程序,则需要使用New-RDRemoteApp命令,此命令是将Windows server 2012 R2中的应用程序发布到远程桌面部署的 RemoteApp 程序。其语法如下:

New-RDRemoteApp

Parameter Set: Session

New-RDRemoteApp [-CollectionName] <String> -DisplayName <String> -FilePath <String> [-Alias <String> ] [-CommandLineSetting <CommandLineSettingValue> ] [-ConnectionBroker <String> ] [-FileVirtualPath <String> ] [-FolderName <String> ] [-IconIndex <String> ] [-IconPath <String> ] [-RequiredCommandLine <String> ] [-ShowInWebAccess <Boolean> ] [-UserGroups <String[]> ] [ <CommonParameters>]

Parameter Set: VirtualDesktop

New-RDRemoteApp [-CollectionName] <String> -DisplayName <String> -FilePath <String> -VirtualDesktopName <String> [-Alias <String> ] [-CommandLineSetting <CommandLineSettingValue> ] [-ConnectionBroker <String> ] [-FileVirtualPath <String> ] [-FolderName <String> ] [-IconIndex <String> ] [-IconPath <String> ] [-RequiredCommandLine <String> ] [-ShowInWebAccess <Boolean> ] [-UserGroups <String[]> ] [ <CommonParameters>]

New-RDRemoteApp的语法中包含2个部分,一个是在集合中创建RemoteApp应用程序,另一个部分是虚拟桌面环境中创建应用程序。RemoteApp 允许运行远程显示的程序,如果它本地运行在客户端计算机上的远程桌面服务 (RDS)。RemoteApp 程序在其自己可调整大小的窗口中运行,并在任务栏上有自己的条目。其参数包括:

-Alias:指定的别名的 RemoteApp 程序。如果您不指定一个别名,该 cmdlet 将生成一种基于文件路径参数。此别名内必须是唯一集合名称参数所指定的集合。

-CollectionName:指定的个人虚拟桌面集合或会话集合的名称。此 cmdlet 将 RemoteApp 程序发布到此集合。

-CommandLineSetting:指定是否在连接时的 RemoteApp 程序接受来自客户端的命令行参数。

-ConnectionBroker:指定远程桌面部署的远程桌面连接代理 (RD 连接代理) 服务器。如果你不指定一个值,该 cmdlet 将使用本地计算机的完全限定的域名称 (FQDN)。

-DisplayName:指定要显示给用户的 RemoteApp 程序的名称。

-FilePath:指定应用程序的可执行文件的路径。不包括任何环境变量。对于会话集合,此路径必须是有效的本地路径集合中的所有远程桌面会话主机 (RD 会话主机) 服务器上。对于虚拟桌面集合,此路径必须是集合中的所有虚拟台式机上有效的本地路径。

-FileVirtualPath:指定应用程序的可执行文件的路径。此路径将解析到相同的位置的文件路径参数的值,但是它可以包含环境变量。

-FolderName:为订阅 RemoteApp 和桌面连接,远程桌面 Web 访问 (RD Web 访问) 网页上,在开始菜单中指定 RemoteApp 程序中显示的文件夹的名称。

-IconIndex:指定的索引 (由IconPath参数指定) 的图标文件中可以找到的 RemoteApp 程序图标的位置。

-IconPath:指定包含要显示的别名参数标识的 RemoteApp 程序的图标的文件的路径。此路径不能包含任何环境变量。对于会话集合,路径必须是有效的本地路径集合中的所有 RD 会话主机服务器上。对于虚拟桌面集合,路径必须是集合中的所有虚拟台式机上有效的本地路径。

-RequiredCommandLine:指定一个字符串,包含客户端在连接时使用 RemoteApp 程序可以使用的命令行参数。如果指定此参数, CommandLineSetting参数必须具有一个值的要求。

-ShowInWebAccess:指定是否显示的 RemoteApp 程序和 RemoteApp 和桌面连接,用户订阅中的 RD Web 访问服务器。

-UserGroups:指定的域组和用户可以在 RD Web访问, RemoteApp 和桌面连接,并查看 RemoteApp 的数组。若要允许所有用户看到 RemoteApp 程序,则需要提供$Null 的值。

-VirtualDesktopName:指定名称的虚拟桌面。在IconPath参数中指定的图标文件驻留在此虚拟桌面。虚拟桌面必须集合名称参数所指定的集合中的成员。

接下来我们在已经建立的集合中发布记事本应用程序,首先要知道记事本在Windows server 2012 r2中位置C:\Windows\system32\notepad.exe,并要在哪个集合进行发布,然后使用命令为:

PS C:\Users\Administrator> new-rdremoteapp -Alias 记事本 -DisplayName 记事本 -FilePath "C:\Windows\system32\notepad.exe" -ShowInWebAccess 1 -collectionname quicksessioncollection -ConnectionBroker rds.mabofeng.com

输入命令后,会有一个发布的过程,如图所示。

clip_image031

最后,系统会显示一个状态,会显示命令完成时输入创建的详细信息。

clip_image033

当我们在图形化界面中,服务器管理器中刷新服务器管理器控制台时我们看到成功添加的 RemoteApp。

clip_image034

查询应用

当我们在服务中安装了大量应用,发布的时候很难找到正确的应用路径,在图形界面下,当发布应用时,在发布向导中会列出所有的应用程序,如果没有则需要手动添加,但是在powershell中就可通过命令Get-RDAvailableApp来查找应用程序和路径,使用命令为:

Get-RDAvailableApp -ConnectionBroker rds.mabofeng.com

当执行命令后,会要求输入群集的名称,也可在命中添加CollectionName参数,最后powershell中会显示所有的可发布的RemoteApp程序。

clip_image036