PowerShell でリモート デスクトップ サービス構築を行う @ Windows Server 2012 R2 ~自動化編~

こんにちは。

前回、Windows Server 2012 R2 で、PowerShell の RemoteDesktop モジュールを使って、
リモート デスクトップ サービスの展開方法を紹介しました。
yaimairi.hateblo.jp

今回は、PowerShell スクリプトを用いて、スクリプトを実行するだけで、あとは待つだけ!という状態にしましょう。

先に完成形をお見せします。
rds_auto_deploy_1.ps1

#展開するサーバー名を設定
echo "展開するサーバー名を入力してください。"
$server = Read-Host "HostName"

#自動ログオンのレジストリ設定
echo "再起動後の自動ログオンのためのパスワードを入力してください。"
$DefaultPassword = Read-Host -AsSecureString "Password"
$decodePassword = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($DefaultPassword))

$DefaultUserName = $env:USERNAME
$DefaultDomainName = $env:USERDOMAIN

$RegLogonKey = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"

Set-itemproperty -path $RegLogonKey -name "AutoAdminLogon" -value 1
Set-itemproperty -path $RegLogonKey -name "DefaultUsername" -value $DefaultUserName
Set-itemproperty -path $RegLogonKey -name "DefaultPassword" -value $decodePassword
Set-itemproperty -path $RegLogonKey -name "DefaultDomainName" -value $DefaultDomainName

#RunOnce レジストリキーで、再起動後に自動的にスクリプトを開始
$RegRunOnceKey = "HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce"
$powershell = ("C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe")
$restartKey = "Restart-And-RunOnce"

$script = (Split-Path $MyInvocation.MyCommand.Path) + "\rds_auto_deploy_2.ps1 -ConnectionBroker $server -WebAccess $server -SessionHost $server -LicenseServer $server"

#RunOnceキーにセット
Set-itemproperty -path $regrunoncekey -name $restartkey -value "$powershell $script"

#必要な役割のインストール
#CB のインストール
Add-WindowsFeature -Name RDS-Connection-Broker -ComputerName $server
#WA のインストール
Add-WindowsFeature -Name RDS-Web-Access -ComputerName $server
#LS のインストール
Add-WindowsFeature -Name RDS-Licensing,RDS-Licensing-UI -ComputerName $server
#SH のインストール
Add-WindowsFeature -Name RDS-RD-Server -ComputerName $server

#再起動
shutdown -r -t 0

rds_auto_deploy_2.ps1

Param(
[string]$ConnectionBroker,
[string]$WebAccess,
[string]$SessionHost,
[string]$LicenseServer
)

#RemoteDesktop モジュールのインポート
Import-Module RemoteDesktop

#構築
New-SessionDeployment -ConnectionBroker $ConnectionBroker -WebAccessServer $WebAccess -SessionHost $SessionHost 
#セッション コレクションの作成
New-RDSessionCollection -CollectionName TestCollection -SessionHost $SessionHost -ConnectionBroker $ConnectionBroker 
#ライセンス サーバー/モードの指定
Set-RDLicenseConfiguration -LicenseServer $LicenseServer -Mode PerUser -ConnectionBroker $ConnectionBroker -Force
#RemoteApp の公開
New-RDRemoteApp -CollectionName TestCollection -Alias cmd -DisplayName cmd -FilePath "C:\Windows\System32\cmd.exe" -ShowInWebAccess 1 -ConnectionBroker $ConnectionBroker 

#ここに、自動ログオンのレジストリを削除
$RegLogonKey = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
Remove-itemproperty -path $RegLogonKey -name "AutoAdminLogon"
Remove-itemproperty -path $RegLogonKey -name "DefaultUsername"
Remove-itemproperty -path $RegLogonKey -name "DefaultPassword"
Remove-itemproperty -path $RegLogonKey -name "DefaultDomainName"

#一応もう一回再起動
shutdown -r -t 0

全体的な流れとしては、
1. 展開先のサーバー名を指定
2. 再起動後の再ログインのためのパスワードを設定
3. 再起動後に実行する PowerShell スクリプトを RunOnce レジストリに設定
4. 役割のインストール と再起動
5. 前回紹介した、リモート デスクトップ サービスの展開
となります。

<ユーザー入力>

PowerShell スクリプトで、ユーザー入力を受け付けるには、

Read-Host

を使用します。
また、パスワードの設定など Secure String を使う際は

Read-Host -AsSecureString

とします。

<自動ログオンの設定>

自動ログオンを行う際は、以下のレジストリを設定します。

HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
 - AutoAdminLogon : 自動ログオンを行うかどうか
 - DefaultUsername : 自動ログオンに使うユーザー名
 - DefaultPassword : 自動ログオンに使うパスワード
 - DefaultDomainName : ユーザーのドメイン名

<RunOnce レジストリの設定>

次回ログオン時に、一回だけ自動で実行したい時などに役立つレジストリが、RunOnce レジストリです。

HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce

このレジストリに、自由な名前を決めて、値に実行コマンドなどを仕込めば、
次回ログオン時に実行されて、実行されたら自動で削除される優れものです!

今回は、再起動後に、リモート デスクトップ サービスを展開するスクリプト (rds_auto_deploy_2.ps1) を実行するように設定しています!

PowerShell スクリプトのパラメーター>

PowerShell コマンドレットでよく見る、"-なんたら" のオプション。
これを、自分で作ることもできます!

Param(
[string]$option,
[switch]$flag,
)

[string] や [int] などとすると、-option の後に設定する値を書けます。
[switch] とすると、フラグのような処理ができます。(-Force とかの値が必要ないオプション)
[switch] の場合は、if 文で $true か $false で条件分岐ができます!

PowerShell スクリプトの実行>

既定では、PowerShell スクリプトの実行に制限がかかってることがあります。
そんな時は、Set-ExecutionPolicy コマンドレットで、PowerShell スクリプトを実行できるようにしましょう!
詳しくは、こちらを参考にしてくださいー
https://technet.microsoft.com/ja-jp/library/ee176961.aspx


こんな感じで、PowerShell スクリプトを一つ実行しちゃえば、
あとは待つだけでぜーーーんぶやってくれます!

あとは、Param をカスタマイズしたりして、一台のサーバーだけでなく、
別々のサーバーに各役割をインストールしたりすることができそうです。