SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

PowerShell で特定の IP の NIC でリモートデスクトップのポートをバインドする

leave a comment

複数の NIC を接続していて、特定の IP を設定している NIC でリモートデスクトップのポートをバインド (リッスン) するためのサンプルです。
詳細については 影響を受けてある製品のいずれかを実行しているコンピュータのリモート デスクトップ セッションは確立できません。 を参照していただくとよいかと。

リモートデスクトップを有効にした場合、デフォルトでは全ての NIC で接続要求を受け付けることができるようになっています。
2008 R2 まではリモートデスクトップ セッションホストの構成でどのネットワークアダプターを使用するかを選択することができましたが、2012 以降はこの管理ツールの使い勝手が変わっているため、ワークグループ環境では関連する設定を直接変更する必要があります。
image
PowerShell で実行する場合は以下のようなスクリプトで特定の NIC を設定しているネットワークアダプターを使用するように設定することができます。

$TargetIP = "10.200.0.9"
$TargetIF = Get-NetIPAddress | where IPv4Address -eq $TargetIP
$TargetRegName = $null
$IFRegKey = "registry::HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlNetwork{4D36E972-E325-11CE-BFC1-08002BE10318}"
$TSLanKey = "registry::HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal Serverlanatable"
$TSLanAdapterKey = "registry::HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp"
$NetworkRegs = Get-ChildItem "$IFRegKey" | Where SubkeyCount -ne 0
foreach ($NetworkReg in $NetworkRegs){
    if ((Get-ItemProperty "registry::$NetworkRegConnection").Name -eq $TargetIF.InterfaceAlias){
        $TargetRegName = $NetworkReg.PSChildName
        break
    }
}
If ($TargetRegName -eq $null){
    Write-Output "Network IF Error"
    return -1
}
$TSLanAId = Get-ChildItem "$TSLanKey" | Where-Object PSChildName -eq $TargetRegName | Get-ItemProperty
Set-ItemProperty -Path $TSLanAdapterKey -Name "LanAdapter" -Value $TSLanAId.LanaId
Stop-Service UmRdpService
Stop-Service TermService
Start-Service TermService
Start-Service UmRdpService

 
どのネットワークアダプターで要求を受け付けるかは、[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp] の [LanAdapter] で設定をしているのですがデフォルトでは [0] (全てのネットワークアダプター) が使用されるようになっています。
この項目には 0~の数値を設定するのですが設定する値は [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal Serverlanatable] から選択する必要があります。
image
このキー配下に GUID でどのアダプターが LanaId 何番になるかが格納されていますので、対象の IP が設定されているネットワークアダプターの GUID を [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlNetwork{4D36E972-E325-11CE-BFC1-08002BE10318}] から取得して、それをもとにリモートデスクトップのネットワークアダプターを設定し、設定を適用するためにリモートデスクトップのサービスを再起動しています。
image
もう少しうまい書き方があるかと思いますが、サンプルとして。

Share

Written by Masayuki.Ozawa

5月 20th, 2014 at 11:17 am

Posted in PowerShell

Tagged with

Leave a Reply