![阻止 Windows NLA 反复将本地网络检测为新的未识别网络](https://linux22.com/image/1550268/%E9%98%BB%E6%AD%A2%20Windows%20NLA%20%E5%8F%8D%E5%A4%8D%E5%B0%86%E6%9C%AC%E5%9C%B0%E7%BD%91%E7%BB%9C%E6%A3%80%E6%B5%8B%E4%B8%BA%E6%96%B0%E7%9A%84%E6%9C%AA%E8%AF%86%E5%88%AB%E7%BD%91%E7%BB%9C.png)
我正在管理一个小型企业网络,其中包含多台 Windows 10 和 7 PC。用户会不时但频繁地抱怨他们无法再访问与其他同事共享的文件夹。快速故障排除确定问题是由于臭名昭著的“检测到未识别的网络”,然后应用“公共”网络配置文件而不是“私人”网络配置文件,因此家庭组/文件共享等不起作用。从我的搜索来看,这是许多用户的常见问题。我没有看到任何可行的解决方案。
环境:
- 所有 Windows PC 都通过有线以太网连接(尽管它们可能有 Wifi NIC)
- 它们都连接到 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 遵循哪些步骤来为网络生成唯一标识符,也许会有所帮助?
答案1
方法 1
我在维护的一个环境中处理关键 Windows Server 系统上此问题的一种方法是使用批处理脚本,该脚本使用设置 NetConnectionProfile和网络管理员,并明确将机器上的每个受信任的 NIC/适配器设置为私人的在系统启动和任务计划程序使用 Run whether user is logged on or not
和Run with highest privileges
选项。
笔记:虽然悬赏通知上写着“该解决方案不得导致网络连接中断,以便实施“我想说的是,由于发生此问题时无论如何都会出现网络中断,因此,如果在系统未重新启动时随机发生此问题,则只需运行此相同脚本即可快速解决问题并使操作系统机器网络访问恢复正常工作和预期顺序。
此外,您还可以使用获取 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 无法确定连接位置,它会将其命名为“未识别”并将该位置标记为公共。它之所以选择公共,是因为这是最安全的,如果连接在 DMZ 上,您肯定不希望出现更差的情况。
有两种简单的方法可以解决这个问题。一种方法是使用本地安全策略来更改未识别网络的默认位置。第二种方法是更改网络连接属性,以便为 NLA 提供正确放置位置所需的信息。
使用本地安全策略
警告: 仅当计算机永远不会与公共 LAN 建立任何连接时才应使用此选项。否则,您将面临将不太安全的防火墙配置文件应用于公共连接的风险。
打开 ”本地安全策略“。
点击 ”网络列表管理器政策“在左侧窗格中。 (此选项在旧版本的 Windows 中被隐藏。)
双击“未识别网络" 在右侧窗格中。
对于只存在于私有网络中的计算机,可以设置“位置类型“ 到 ”私人的“。
使用网络连接属性
这不是关于添加网关 IP,因为这在多宿主服务器上无法正常工作。相反,我们将添加 DNS 后缀,以便 NLA 可以正确定位域控制器,这就是它知道将该位置标记为“域网络”的方式。
去网络连接(从网络和共享中心,单击“更改适配器设置”。)
前往财产一个网络连接标记为“未确认“但在私有局域网上。
前往IPv4 的属性。
点击 ”先进的...“ 按钮。
选择DNS标签。
在“此连接的 DNS 后缀:“。
禁用然后启用连接以使 NLA 重新识别位置。启用连接后,状态应更改为域名,网络类别应更改为“域网络”。根据您的设置,您可能只需要“修复”一个连接即可让所有相关连接看到域。
从私有变为公共
强制 NLA 将连接标记为公共连接有两种常见方法。一种是使用防火墙规则阻止 NLA,使其别无选择,只能使用默认位置。另一种是使用注册表禁用连接上的 NLA。
使用防火墙
我还没有测试过,但这个理论似乎合理。
打开 ”高级安全 Windows 防火墙“ (IE
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
答案2
我只在一个特定系统上不断遇到这个问题。每次重启都会破坏一切。我尝试了您提到的所有解决方案。在用尽所有其他方法后,我决定禁用“网络位置感知”服务。据我所知,它不需要。这永久解决了我的问题。我注意到的唯一副作用是“网络和共享中心”窗口看起来很奇怪。这项服务在 Windows 7 之前并不存在,对我来说根本没用。
服务管理器
“网络位置感知”,启动类型 = “已禁用”