阻止 Windows NLA 反复将本地网络检测为新的、未识别的网络

Pau*_*ulH 16 windows file-sharing network-profiles network-location

我正在管理一个拥有多台 Windows 10 和 7 PC 的小型企业网络。用户偶尔但经常抱怨他们无法再访问与其他同事的共享文件夹。快速故障排除确定问题是由于臭名昭著的“检测到未识别网络”,然后应用“公共”网络配置文件而不是“私人”网络配置文件,因此家庭组/文件共享等不起作用。根据我的搜索,这是许多用户的常见问题。我没有看到任何可行的建议解决方案。

环境:

  • 所有 Windows PC 都通过有线以太网连接(尽管它们可能有 Wifi 网卡)
  • 它们都连接到 48 端口 Avaya L2 管理型交换机,都在同一个 10.10.10.x 子网中
  • 交换机连接到华硕 RTN-66U 家用路由器
  • 华硕路由器连接到电缆调制解调器
  • 华硕路由器为 Windows 机器提供 DHCP
  • 我已经为每台 Windows PC 配置了具有 DHCP 保留的路由器,即 PC 在启动时总是获得相同的 IP 地址
  • 没有域控制器

问题:

即使我已将所有 Windows 机器配置为活动网络配置文件 = 私有,它们也经常(每隔几周左右)恢复为公共状态,这会阻止文件共享等。

修复尝试:

在每台 Windows PC 上,我都修改了本地组策略Computer Configuration->Security Settings->Network List Manager Policies

  • 身份不明的网络 = 私有
  • 识别网络 = 私有

观察:

我认为问题在于 Windows 网络位置感知 (NLA) 服务正在检测一个新网络,这会导致创建一个新的网络配置文件,然后默认为公共(即使在上面我已将本地组策略配置为默认为私有) . 许多计算机显示 Windows 多次检测到新的未识别网络,即它们显示“网络 14”,即有 14 个不同的网络配置文件。在注册表中查看配置文件时,我看到了这些多个配置文件: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles

所有 14 个配置文件都是在计算机实际连接到上述同一网络时。

我无法找到准确描述 NLA 如何为网络生成唯一标识符的资源,以及为什么它可能会检测到它发现了一个新网络。

题:

如何防止 Windows 错误地将我的本地网络识别为新网络?如果我知道 NLA 遵循哪些步骤为网络生成唯一标识符,也许会有所帮助?

Vom*_*yle 7

方法一

我在我维护的一个环境中的关键 Windows Server 系统上处理此问题的一种方法是使用批处理脚本,该脚本使用Set-NetConnectionProfilenetsh,并在系统启动时将机器上的每个受信任的 NIC/适配器显式设置为私有任务计划程序使用 和选项。Run whether user is logged on or notRun with highest privileges

在此处输入图片说明 在此处输入图片说明

注意:虽然赏金说明指出“解决方案不得导致网络连接丢失以实现”,但我想提一下,因为发生此问题时,无论如何您都会遇到网络中断,如果系统运行时随机出现问题,则运行此脚本没有重新启动,只需运行相同的脚本,然后仍然可以快速解决问题并使操作系统机器网络访问恢复到正常工作和预期的顺序。

此外,您可以使用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
Run Code Online (Sandbox Code Playgroud)

下面是其他一些方法,其中之一是您尝试过的方法,但我将其留在那里,以供其他遇到此帖子的人使用,以防万一它对他们有所帮助,但这些方法可能可以完全防止这种情况发生,但也有您选择使用的任何方法总是有利有弊,因此请选择您的毒药并进行相应的测试。

方法二(多种方法)

身份不明的网络 - 从公共转移到私有或域

如果 NLA 无法确定连接位置,则将其命名为“Unidentified”并将该位置标记为 Public。它选择 Public 因为这是最安全的,如果连接在 DMZ 上,您不会想要任何更少的东西。

有两种简单的方法可以解决这个问题。一种是使用本地安全策略来更改未识别网络的默认位置。第二种方法使用对网络连接属性的更改来为 NLA 提供正确放置位置所需的信息。

使用本地安全策略

注意: 只有在计算机永远不会在公共 LAN 上建立任何连接时才应使用此方法。否则,您将面临将安全性较低的防火墙配置文件应用于您的公共连接的风险。

  1. 打开“本地安全策略”。

  2. 单击左窗格中的“网络列表管理器策略”。(此选择隐藏在旧版本的 Windows 中。)

  3. 双击右侧窗格中的“ Unidentified Networks ”。

  4. 对于只存在于私有网络中的计算机,可以将“位置类型”设置为“私有”。

    在此处输入图片说明

使用网络连接属性

这与添加网关 IP 无关,因为它在多宿主服务器上无法正常工作。相反,我们将添加一个 DNS 后缀,以便 NLA 可以正确定位域控制器,这就是它知道将位置标记为“域网络”的方式。

  1. 转到网络连接(从网络和共享中心,单击“更改适配器设置”。)

  2. 转到标记为“未识别”但在专用 LAN 上的一个网络连接的属性

  3. 转到IPv4属性

  4. 单击“高级...”按钮。

  5. 选择DNS选项卡。

  6. 在“此连接的 DNS 后缀: ”的文本框中输入您的域名。

禁用然后启用连接以让 NLA 重新识别位置。启用连接后,状态应更改为域名,网络类别应更改为“域网络”。根据您的设置,您可能只需要“修复”一个连接即可获得所有相关连接以查看域。

从私人到公共

有两种常用方法可以强制 NLA 将连接标记为公共连接。一种是使用防火墙规则来阻止 NLA,使其别无选择,只能使用默认位置。另一种是使用注册表在连接上禁用 NLA。

使用防火墙

我还没有测试过这个,但这个理论似乎很合理。

  1. 打开“具有高级安全性的 Windows 防火墙”(即wf.msc)。

  2. 转至出站规则

  3. 单击“新规则...”。

  4. 使用这些设置:

    • 规则类型: 自定义
    • 程序:选择“所有程序”,然后单击“自定义...”。选择“网络位置感知”(简称为 NlaSvc)。
    • 协议和端口: 协议类型 = Any。
    • 范围: 本地 IP = 输入您的所有公共 IP。仔细检查与多个 IP 的连接。
    • 行动: 阻止
    • 简介:全部
  5. 启用规则后,禁用然后启用网络连接以使 NLA 重新识别位置。

使用注册表

我没有为我做过这项工作,但我的情况可能与您不同。找到正确的连接号有点困难,因为条目比您预期的要多得多。

  1. 运行注册表

  2. HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}

  3. 在下方,您应该会看到标有 0000、0001、0002 等的几个键……查看这些键并找到要禁用 NLA 的适配器。

  4. 对于每个适配器,添加一个名为“*NdisDeviceType”的新 DWORD 值并将其设置为 1(确保在名称的开头获得 *)。

变得激烈

位置配置文件保存在注册表中,删除它们并让 Windows 重建它们似乎无害。您肯定希望首先备份注册表,并且您可能需要通过 KVM 而不是远程 (RDP) 连接到服务器。如果您选择此步骤,我将不承担任何责任,因为我主要将其放在此处以供参考。

配置文件的位置是:

HKLM\Software\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles
Run Code Online (Sandbox Code Playgroud)

来源