方法1
我在一个环境中在关键Windows Server系统上处理此问题的一种方法是使用批处理脚本,该脚本使用Set-NetConnectionProfile和netsh,并在系统启动时将计算机上的每个受信任的NIC / adapter显式设置为private。Task Scheduler使用 和选项。Run whether user is logged on or not
Run with highest privileges
注意:尽管悬赏单指出“ 该解决方案一定不能造成网络连接中断”,但我想提一提,由于发生此问题时,无论如何您都会遇到网络中断的情况,因此,如果问题是随机发生的,则在系统运行时运行此脚本无需重新启动,只需运行相同的脚本即可快速解决问题,并以正常工作和预期的顺序恢复对OS机器的网络访问。
此外,您可以使用Get-NetConnectionProfile获取NIC别名和索引号,以将它们放入下面的示例批处理脚本中,以满足您的需求和/或系统。
批处理脚本
@ECHO ON
::: The below PowerShell will set all the nework adapters to private rather than public and unknown as happens.
:DynamicPSScriptBuild
SET PSScript=%temp%\%~n0.ps1
IF EXIST "%PSScript%" DEL /Q /F "%PSScript%"
ECHO Set-NetConnectionProfile -InterfaceIndex 12 -NetworkCategory Private>>"%PSScript%"
ECHO Set-NetConnectionProfile -InterfaceIndex 20 -NetworkCategory Private>>"%PSScript%"
ECHO Set-NetConnectionProfile -InterfaceIndex 22 -NetworkCategory Private>>"%PSScript%"
ECHO Set-NetConnectionProfile -InterfaceIndex 24 -NetworkCategory Private>>"%PSScript%"
:PowerShell
SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& '%PSScript%'"
:: The below will disable and then re-enable each NIC one-by-one so the unidentfied goes away after set to "private" above
:ResetNICs
SET Array="Ethernet", "Ethernet 2", "Ethernet 3", "Ethernet 4"
FOR %%A IN (%Array%) DO (
netsh int set int "%%~A" admin=disable
netsh int set int "%%~A" admin=enable
)
EXIT
以下是其他几种方法,其中一种是您尝试过的方法,但我留在这里供其他人参考,以防万一它对他们有所帮助,但这是一些完全防止这种情况的方法,但是您选择使用的任何方法总是会有弊端,因此请选择毒药并进行相应的测试。
方法2(多种方法)
如果NLA无法确定连接位置,则将其命名为“ Unidentified”,并将该位置标记为Public。它选择“公共”是因为这是最安全的,如果连接位于DMZ上,您将一无所获。
有两种简单的方法可以解决此问题。一种使用本地安全策略来更改未标识网络的默认位置。第二种方法使用对网络连接属性的更改,为NLA提供正确放置位置所需的信息。
使用本地安全策略
注意: 仅当计算机在公共LAN上永远不会有任何连接时,才应使用此选项。否则,您将面临将不太安全的防火墙配置文件应用于您的公共连接的风险。
打开“ 本地安全策略 ”。
单击左窗格中的“ 网络列表管理器策略 ”。(此选择隐藏在旧版本的Windows中。)
双击右窗格中的“ Unidentified Networks ”。
对于仅存在于专用网络上的计算机,可以将“ 位置类型 ” 设置为“ 专用 ”。
使用网络连接属性
这与添加网关IP无关,因为在多宿主服务器上无法正常工作。取而代之的是,我们将添加DNS后缀,以便NLA可以正确定位域控制器,这是将域控制器标记为“域网络”的方式。
转到网络连接(从网络和共享中心,单击“更改适配器设置”。)
转至标记为“ Unidentified ”但在专用LAN上的一个网络连接的属性。
转到IPv4的属性。
单击“ 高级 ...”按钮。
选择“ DNS”选项卡。
在“ 此连接的DNS后缀: ” 文本框中输入您的域名。
禁用然后启用连接以使NLA重新标识位置。启用连接后,状态应更改为域名,网络类别更改为“域网络”。根据您的设置,可能您只需要“修复”一个连接即可获取所有相关的连接以查看域。
从私人到公共
强制NLA将连接标记为公共的方法有两种。一种是使用防火墙规则来阻止NLA,以便除了使用默认位置外别无选择。另一种是使用注册表禁用连接上的NLA。
使用防火墙
我还没有测试过,但是理论似乎是正确的。
打开“ 具有高级安全性的Windows防火墙 ”(即wf.msc
)。
转到出站规则。
单击“ 新规则 ...”。
使用以下设置:
- 规则类型: 自定义
- 程序:选择“所有程序”,然后单击“自定义...”。选择“网络位置感知”(简称为NlaSvc)。
- 协议和端口: 协议类型=任何。
- 范围: 本地IP =输入所有公共IP。仔细检查是否有多个IP连接。
- 行动: 封锁
- 简介:全部
启用规则后,请先禁用然后再启用网络连接以使NLA重新标识位置。
使用注册表
我没有这项工作,但我的情况可能与您的情况有所不同。找到正确的连接号可能会有些麻烦,因为输入的条目比您期望的要多得多。
运行regedit
去 HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}
在下面,您应该看到几个标记为0000,0001,0002等的键…浏览这些键,找到要禁用NLA的适配器。
对于每个适配器,添加一个名为“ * NdisDeviceType”的新DWORD值并将其设置为1(确保在名称的开头得到*)。
变得剧烈
位置配置文件位于注册表中,删除它们并让Windows重建它们似乎无害。您肯定要先备份注册表,并且可能需要通过KVM(而不是远程(RDP))连接到服务器。如果您选择此步骤,我将不承担任何责任,因为我主要将其放在此处以供参考。
配置文件的位置是:
HKLM\Software\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles
资源