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

もう少しうまい書き方があるかと思いますが、サンプルとして。

Written by masayuki.ozawa

5月 20th, 2014 at 11:17 am

Posted in PowerShell

Tagged with

Leave a Reply

*