У меня есть сервер с несколькими сетевыми интерфейсами, и мне нужно, чтобы RDP прослушивал соединения только на одном из них; сервер не является сервером удаленного рабочего стола, RDP используется только для удаленного администрирования.
В Windows Server 2008 R2 я смог настроить это с помощью Remote Desktop Session Host
приставка; в Windows Server 2012 этой консоли больше нет.
Как я могу настроить это в WS2012?
Службы удаленных рабочих столов на самом деле имеют довольно богатую библиотеку объектов WMI, которую вы можете использовать для запроса и управления конфигурацией. Начиная с Vista / 2008, он расположен в корень \ cimv2 \ TerminalServices пространство имен. Вот хорошее место для начала просмотра того, что доступно: Классы конфигурации служб удаленных рабочих столов
Что касается вашего конкретного вопроса, я просто хотел бы уточнить, что RDP может быть привязан только к сетевому адаптеру, а не к конкретному IP-адресу. Я знаю, что вы сказали «сетевой интерфейс». Я просто хотел прояснить для других, кто может наткнуться на этот вопрос. Это довольно распространенный запрос на машинах, у которых есть только один адаптер и несколько IP-адресов. Если это то, что вы ищете, есть другие вопросы по ServerFault с более подробными ответами. Но если я правильно помню, лучше всего просто ограничить соединения с помощью встроенного брандмауэра.
Конкретный класс, в котором есть то, что вам нужно, называется Win32_TSNetworkAdapterSetting. С классом связаны 3 метода, которые вы можете использовать:
По моему опыту, SetNetworkAdapterLanaID надежнее, чем SelectNetworkAdapterIP из-за опции «Все сетевые адаптеры». Похоже, что если он в настоящее время настроен на «Все сетевые адаптеры», он не изменится на конкретный адаптер с указанным вами IP-адресом, он просто сохранит его на «Все сетевые адаптеры», что технически все еще правильно.
Итак, вам осталось использовать SetNetworkAdapterLanaID и для которого требуется целочисленное значение идентификатора в качестве аргумента метода. Итак, вот как вы можете использовать идентификатор. Сначала получите ссылку на экземпляр класса. В моем примере здесь будет использоваться имя терминала по умолчанию, называемое «RDP-Tcp», но возможно (хотя и маловероятно) в ваших системах есть дополнительные или другие имена терминалов.
Вы можете проверить текущий статус того, какой сетевой адаптер настроен, с помощью следующей оболочки PowerShell:
gwmi Win32_TSNetworkAdapterSetting -filter "TerminalName='RDP-Tcp'" -namespace "root/cimv2/TerminalServices" | Select NetworkAdapterLanaID,NetworkAdapterName
Чтобы вызвать метод, хорошо иметь экземпляр класса, назначенный переменной, поэтому давайте сделаем это:
$ts = gwmi Win32_TSNetworkAdapterSetting -filter "TerminalName='RDP-Tcp'" -namespace "root/cimv2/TerminalServices"
Удобная особенность этого класса заключается в том, что пара возвращаемых им свойств представляет собой списки возможных сетевых адаптеров, которые вы можете использовать.
$ts | select -expand DeviceIDList
$ts | select -expand NetworkAdapterList
Это должно вернуть два списка. Первый - это список идентификаторов, отсчитываемый от 0, а второй - понятное имя адаптеров, связанных с первым списком. Итак, на моей тестовой машине он вернулся:
0
1
и
All network adapters configured with this protocol
Intel(R) PRO/1000 MT Network Connection
Если вы хотите сопоставить идентификаторы в DeviceID
собственности на их имена в NetworkAdapterList
, вы можете сделать это так:
$adapters = $ts | select -expand NetworkAdapterList
$device_ids = $ts | select -expand DeviceIDList
$adapter_list = @()
foreach ($device_id in $device_ids) {
$adapter_list += @{$device_id = $adapters[$device_id]}
}
$adapter_list # Mapping of device IDs to adapter names
По умолчанию он настроен на использование идентификатора 0, который является «Все сетевые адаптеры, настроенные с этим протоколом». Поэтому, если мы хотим изменить его для явного использования сетевой карты Intel, нам просто нужно вызвать метод, используя наш существующий объект и связанный с ним идентификатор.
$ts.SetNetworkAdapterLanaID(1)
Затем вы можете проверить изменение, повторно запросив объект:
gwmi Win32_TSNetworkAdapterSetting -filter "TerminalName='RDP-Tcp'" -namespace "root/cimv2/TerminalServices" | Select NetworkAdapterLanaID,NetworkAdapterName
запустить regedit
ключ поиска + соответствие только всей строке: Терминальный сервер
get lanatable. example:
{564D81F9-15B4-42EC-9019-534A56DBEB81}
{B5A5F6CC-5DFD-43F7-B5B0-20490A58A2EB}
note LanaId for each of them
set HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Terminal Server\Winstations\RDP-tcp\LanAdapter
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Terminal Server\Winstations\RDP-tcp\LanAdapter
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Winstations\RDP-tcp\LanAdapter
to LandaID you want accept remote desktop connection
Насколько я знаю, Remote Desktop Session Host
больше не существует в Windows Server 2012.
Вы можете найти его конфигурацию в Server Manager --> Server Role