远程连接到注册表并获取异常
时间:2020-03-05 18:49:10 来源:igfitidea点击:
我继承了旧的一段旧代码(按旧版本,我的意思是警惕,除了WTF-y以外,还有许多未记录的错误修复程序),其中一部分使我有些麻烦。它是如何连接到远程注册表以获取添加/删除程序键的方法:
try { remoteKey = RegistryKey.OpenRemoteBaseKey( RegistryHive.LocalMachine, addr.Value).OpenSubKey( "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"); return 1; } catch (IOException e) { IOException myexception = e; //Console.WriteLine("{0}: {1}: {2}", // e.GetType().Name, e.Message, addr.Value); return 2; } catch (UnauthorizedAccessException e) { UnauthorizedAccessException myexception = e; //Console.WriteLine("{0}: {1}: {2}", // e.GetType().Name, e.Message, addr.Value); return 3; } catch (System.Security.SecurityException e) { System.Security.SecurityException myexception = e; //Console.WriteLine("{0}: {1}: {2}", // e.GetType().Name, e.Message, addr.Value); return 4; }
现在,我有两个问题:
- 我知道为什么会出现IOException-如果它是非Windows计算机,则会抛出该异常。我不太清楚UnauthorizedAccessException和SecurityException之间的区别。任何人有任何想法吗?
- 在没有人想到我们可能不会使用本地登录进行所有操作之前,就设计了全部代码。无论如何,我无法确定如何进行身份验证以远程连接到注册表,并且当无法从WMI获取此信息时,此代码似乎仅在一种情况下使用。
任一个的帮助都会很棒。
解决方案
回答
我们可能必须使用模拟来更改调用远程注册表方法的线程的凭据。有关MSDN的一些信息,请参见此处(链接)。基本上,线程具有一个安全上下文,用于进行托管和非托管调用。
回答
根据MSDN,OpenSubKey不会引发UnauthorizedAccessException。因此,我认为这不是必需的。
回答
John指向MSDN的指针回答了UnauthorizedAccessException的含义,仅当我们尝试使用OpenRemoteBaseKey远程访问密钥时才会出现。
我们对更改计算机上的安全上下文有些警觉,我在这里找到了有关使用WMI(我们已经在绝大多数繁重的工作中使用它)访问注册表的参考,所以我可以尝试反而。