远程连接到注册表,并获得异常

时间:2008-09-08 04:24:37

标签: c# windows exception

我继承了一段古老的旧代码(由于白痴,我的意思是warty有很多未记录的错误修复而不是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获取此信息时。

对任何一方的任何帮助都会很棒。

3 个答案:

答案 0 :(得分:1)

您可能必须使用模拟来更改调用远程注册表方法的线程的凭据。有关MSDN的一些信息,请参见此处(linky)。基本上,您的线程有一个安全上下文,用于进行托管和非托管调用。

答案 1 :(得分:1)

根据MSDN,OpenSubKey 不被抛出。所以我认为不需要它。

答案 2 :(得分:0)

John指向MSDN的指针回答了UnauthorizedAccessException的用途 - 只有当您尝试使用OpenRemoteBaseKey远程访问密钥时才会出现。

我们对改变计算机上的安全上下文有点谨慎 - 我找到了关于使用WMI(我们已经用于绝大多数繁重工作)的参考here来访问注册表,所以我可能会尝试这样做。