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 をカスタマイズしたりして、一台のサーバーだけでなく、
別々のサーバーに各役割をインストールしたりすることができそうです。