C#调用OpenRemoteBaseKey访问远程注册表提示“找不到网络名称”
解决方案
1. 确认目标机器的Remote Registry服务已启用
服务器环境下该服务默认通常未开启,必须启动才能支持远程注册表访问:
# 远程配置并启动服务(需管理员权限) sc \\{machineName} config RemoteRegistry start= auto sc \\{machineName} start RemoteRegistry
2. 修正NetworkConnection的路径格式
你代码中的共享路径存在格式错误:C#的@符号会将双反斜杠解析为单个反斜杠,正确的共享路径应该是@"\\{machineName}\admin$"。原代码拼接后实际传递的路径缺少一层转义,导致底层无法识别,修正后的代码如下:
using (new NetworkConnection(@"\\{machineName}\admin$", new NetworkCredential(@"mydomain\myaccount", "mypassword"))) { var remotereg = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, machineName, RegistryView.Default); }
同时要确保你的NetworkConnection类正确封装了WNetAddConnection2系统API,若类实现存在问题,也会触发“网络名称找不到”的异常。
3. 绕过UAC远程访问限制
服务器的UAC远程管控更严格,需在目标机器修改注册表解除限制:
- 打开目标机器的注册表编辑器,定位到
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System - 新建DWORD值
LocalAccountTokenFilterPolicy,设置值为1 - 重启目标机器使设置生效
4. 改用身份模拟替代NetworkConnection
放弃NetworkConnection,通过Windows身份模拟直接访问远程注册表:
using (var impersonation = new Impersonation(@"mydomain\myaccount", "mypassword")) { var remotereg = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, machineName, RegistryView.Default); }
Impersonation类需自行封装LogonUser系统API实现身份模拟,确保在模拟上下文内执行远程注册表操作。
5. 检查防火墙规则
服务器防火墙可能拦截了远程注册表的通信端口(默认包括135、445及动态RPC端口),可临时关闭防火墙测试,确认问题后添加远程注册表的入站允许规则。
内容的提问来源于stack exchange,提问作者KenD
相关产品推荐
相关产品推荐

