Управление службами Remote Desktop (так же известны как службы терминалов) с помощью Windows PowerShell

Всем привет,

Мы рады сообщить, что бета-версия Windows server 2008 R2 поддерживает использование PowerShell в службах Remote Desktop. Теперь вы можете настраивать и управлять всеми службами и компонентами ролей RDS с помощью PowerShell. Например, ниже приведены несколько задач управления, которые теперь можно выполнять с помощью PowerShell

  1. Просмотр и редактирование настроек конфигурации сервера удаленного рабочего стола
  2. Публикация приложений RemoteApp
  3. Настройка сервера лицензий
  4. Создание и настройка фермы сервера удаленного рабочего стола
  5. Настройка и назначение виртуальных IP-адресов для сеансов и приложений
  6. Создание и управление RDV (VDI пулами)
  7. Создание и управление политиками Gateway Resource Access и Client Access

Разумеется, с помощью Windows PowerShell можно сделать еще многое и многое другое. Установите бета-версию Windows Server 2008 R2 и давайте попробуем. Как всегда, мы очень хотим услышать, что вы думаете, и важно, чтобы вы как можно скорее дали нам знать, что вам понравилось, и что не понравилось.

Читайте дальше, чтобы подробно разобраться в PowerShell RDS.

PowerShell в службах удаленного рабочего стола

После установки роли служб Remote Desktop устанавливается провайдер PowerShell. Этот провайдер (в дальнейшем мы будем называть его провайдером RDS) позволит вам просматривать и управлять конфигурацией всех служб роли и компонентов служб Remote Desktop.

Думайте о провайдере RDS как о чем-то вроде провайдера файловой системы и провайдера реестра, провайдера IIS. Вы можете просматривать, обозревать свойства и работать с провайдером RDS так же, как и с любым другим провайдером.

Работа с RDS из PowerShell

Чтобы начать работу, сперва установите роль служб Remote Desktop и запустите RDS PowerShell.

Шаг 1: Установите роль служб Remote Desktop

RDS PowerShell устанавливается при установке роли служб Remote Desktop. Роль служб Remote Desktop можно установить с помощью Server Manager.

Шаг 2: Запустите RDS PowerShell

Щелкните левой кнопкой мыши на Start Menu -> All Programs -> Administrative Tools -> Remote desktop services -> «Remote Desktop Services PowerShell» и выберите «Run as Administrator».

После щелчка по этой ссылке вы увидите окно PowerShell, подсказка будет указывать на устройство RDS. Это он – ваш провайдер RDS.

Отметим, что когда вы используете команду dir, вы увидите представление со следующими шестью столбцами.

Name (Имя) : Имя контейнера/параметра

Type (Тип) : Тип элемента. Существует три возможных значения типа – Container (Контейнер), Integer (Целое число) и String (Строка). Контейнер (Узел) определяет элемент контейнера, а Целое и Строка обозначают настройки. Входить командой CD можно только в элементы контейнеров. Контейнеры соответствуют группам настроек или логической сущности, тогда как настройки соответствуют параметрам конфигурации. Например, роли, такие как RDS и Connection Broker, и сущности, такие как объекты соединений и RemoteApps, представляются в форме контейнеров, а режим стока сервера (drain mode) представлен как параметр.

CurrentValue (Текущее значение) : Значение, назначенное элементу (применимо только для элементов типа «Integer» или «String»)

GP: Указывает, управляется ли элемент с помощью групповых политик

PermissibleValues (Разрешенные значения) : Возможные значения, которые может иметь элемент настроек

PermissibleOperations (Разрешенные операции) : Операции (коммандлеты), которые могут применяться к элементу

Пользователи могут выбирать, какие столбцы должны выводиться при использовании коммандлета Format-table. Например, команда Get - Item * | format - table - PropertyName , CurrentValue выводит только столбцы Name и CurrentValue. Можно использовать также dir * | ft - PropertyN *, C * , , вы получитетот же результат.

Можно также изменить вид по умолчанию. Дополнительные сведения об этом см. в следующем сообщении.

Как прочитать справочное руководство ?

Одна из выдающихся возможностей PowerShell состоит в том, что он упрощает получение информации и справки по различным вопросам. Это преимущество сохраняется и для поставщика RDS. Существует свойство с именем Description (Описание), ассоциированное с каждым элементом, которое успешно описывает отдельные параметры.

Например, PSRDS :\ RDSConfiguration > get - item .\ DrainMode | fl выводит информацию об элементе DrainMode. Также можно изменить представление по умолчанию так, чтобы в нем всегда показывалось содержимое столбца Description.

Теперь давайте рассмотрим примеры.

Пример 1: Установка уровня шифрования RDP

Шаг 1: Просмотр текущего уровня шифрования

PSRDS :\ RDSConfiguration \ Connections \ RDP - Tcp \ SecuritySettings > dir .\ EncryptionLevel | fl

Шаг 2: Установка требуемого значения элемента EncryptionLevel

PS RDS:\RDSConfiguration\Connections\RDP-Tcp\SecuritySettings> Set-Item .\EncryptionLevel 2

Пример 2: Определение серверов лицензий, которые будут использоваться сервером RemoteDesktop

Шаг 1: Просмотр текущего списка используемых серверов лицензий

PS RDS:\RDSConfiguration\LicensingSettings\SpecifiedLicenseServers> dir

Шаг 2: Просмотр списка серверов лицензий, зарегистрированных на контроллере домена.

PS RDS:\RDSConfiguration\LicensingSettings\RegisteredLicenseServers> dir

Шаг 3: добавление сервера лицензий к списку SpecifiedLicenseServers

Простейший способ добавления сервера лицензий состоит в том, чтобы использовать коммандлет new-item и указать имя добавляемого сервера лицензий.

PS RDS:\RDSConfiguration\LicensingSettings\SpecifiedLicenseServers> New-Item -name ls.contoso.com

Вы можете использовать приведенную ниже команду для добавления всех серверов лицензий из списка зарегистрированных серверов лицензий к указанному списку серверов лицензий.

PS RDS:\RDSConfiguration\LicensingSettings\SpecifiedLicenseServers> dir ..\RegisteredLicenseServers | new-item –force

Пример 3: Подключение сервера RemoteDesktop к ферме SessionBroker

PS RDS:\RDSConfiguration\ConnectionBrokerSettings> Set-Item MemberOfFarm 1 -FarmName testFarm -sessionbroker contoso-sb-test -CurrentRedirectableAddresses 65.52.65.53

Пример 4: Добавление RemoteApp

PS RDS:\RemoteApps\PublishedApplications> New-Item -Name "IExplore" -ApplicationPath "c:\Program Files\Internet Explorer\iexplore.exe" -ApplicationName "Internet Explorer" -ShowInPortal 1

Эти примеры демонстрируют лишь некоторые из различных новых возможностей. Практически любые задачи настройки, относящиеся к конфигурации сервера RD, RemoteApp, Gateway, сервера лицензий и RDV (VDI пулами) теперь можно выполнять с использованием провайдера RDS.

Кроме того, истинный потенциал провайдера RDS реализуется при написании сценариев для

1. формирования последовательности из различных операций настройки

2. выполнения настройки нескольких серверов

Один из сценариев, наилучшим образом демонстрирующих указанное выше, это создание ферм серверов RD. Сценарий, приводимый в качестве примера в конце этой записи, принимает в качестве входных данных список серверов и приложений, создает ферму сервера RD и создает RemoteApp на всех этих серверах. Создайте два текстовых файла, один со списком серверов и другой со списком путей к приложениям (можно использовать пути с переменными среды, такими как %windir%), и передайте имена этих файлов сценарию в качестве входных параметров.

Поскольку эти сценарии используют удаленное исполнение PowerShell, перед выполнением сценария убедитесь, что вы включили удаленное исполнение PowerShell (для включения удаленного исполнения выполните коммандлет Enable-PSRemoting в окне PowerShell запущеном с повышеными привилегиями).

Разумеется, это очень простой сценарий – вы можете легко нарастить его дополнительными специальными функциями в соответствии с вашими потребностями. Кроме того, по нашему мнению, одно из важных преимуществ провайдера RDS состоит в том, что вам нет нужды быть программистом, чтобы написать такой сценарий, как CreateRDFarm. Все, что нужно знать – это основы языка сценариев PowerShell.

Я надеюсь, что вы, так же как мы, поражены открывающимися возможностями. Сообщите нам что вы думаете об этом. И оставайтесь с нами, чтобы увидеть другие сценарии, которые вы также сможете пустить в дело.

Приложение: Пример сценария

 #Windows PowerShell script to create a RD Server farm.

if ($args[0] -eq $null -or $args[1] -eq $null -or $args[2] -eq $null ){
    Write-Host "Insuffecient parameters.`nUsage: CreateRDFarm.ps1 SessionBroker Farmname <File containing list of RDS servers > < File containing Applications to publish >
    exit
}else{
    $sb = $args[0]
    $farmname = $args[1]
}

$rdsarr = get-content $args[2]
if ($rdsarr -eq $null){
    Write-Host "$args[2] cannot be read or is empty.`nUsage: CreateRDFarm.ps1 SessionBroker Farmname < File containing TS servers > < File containing Applications to publish >
    exit
}

if ($args[3] -eq $null){
    Write-Host "No file containing Apps Servers specifed. TS Remote Apps will not be published.`nUsage: CreateFarm.ps1 SessionBroker Farmname < File containing TS servers > < txt file containing Applications to publish > .`n Farm creation will continue" -ForegroundColor yellow
}else{
    $apparr = get-content $args[3]
    if ($apparr -eq $null){
    Write-Host "$args[3] cannot be read or is empty.`nUsage: CreateRDFarm.ps1 SessionBroker Farmname < File containing TS servers > < File containing Applications to publish >"
}
}

# Check whether session broker service is running on the remote machine

$sbservice = Get-Service -ComputerName $sb -Name Tssdis
if( $sbservice.status -ne "Running"){
Write-host "Session Broker service is not running on $sb. Exiting farm creation"
exit
}


if ($rdsarr[0] -eq $null){
    Write-Host "No TS Server specified. Atleast one TS Server need to be specified.`nUsage: CreateFarm.ps1 SessionBroker Farmname TS1 TS2 ..."
    exit
}

#create a run space to run remote commands on the Session Broker server
$sb_remotesession = New-PSSession -ComputerName $sb

foreach ($rds in $rdsarr){

    #add ts server to Session Broker Computers group on SB server
    $tst = $rds+"$"
    invoke-command $sb_remotesession -ScriptBlock {
    net localgroup 'Session Broker Computers'  /add $args[0] 2>$null;`
    } -ArgumentList $tst
    
    #join each ts server to sb farm. 
        
        Write-Host "Joining RD server $rds to $farmname farm" -ForegroundColor magenta
        
        $rds_remotesession = New-PSSession -ComputerName $rds

        invoke-command $rds_remotesession -ScriptBlock { `
            import-module RemoteDesktopServices ;`
            $cipaddr = dir RDS:\RDSConfiguration\ConnectionBrokerSettings\RedirectableAddresses ;`
            Set-Item RDS:\RDSConfiguration\ConnectionBrokerSettings\MemberOfFarm 1 -FarmName $args[0] -sessionbroker $args[1] -IPAddressRedirection 0 -CurrentRedirectableAddresses $cipaddr[0].Name ;`
            }`
            -ArgumentList $farmname,$sb

    #create ts remote apps
        if ($args[3] -ne $null){

            foreach ($app in $apparr){
                
                Write-Host Publishing $app on $rds -ForegroundColor magenta
                
                $ind = $app.LastIndexof("\")
                $alias = $app.SubString($ind+1,$app.LastIndexOf(".")-$ind-1)
                
                invoke-command $rds_remotesession -ScriptBlock { `
                new-item -Path RDS:\RemoteApps\PublishedApplications -Name $args[0] -ApplicationPath $args[1]`
                }`
                -ArgumentList $alias,$app
            }
        }

    #close the remote session
    Remove-PSSession $rds_remotesession
}

#close the sb runspace
Remove-PSSession $sb_remotesession

Шанмугам Каландайвел (Shanmugam Kulandaivel)
Remote Desktop Virtualization Services Team

Перевод: Виктор Горбунков