0

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

任何一个帮助都会很棒。

4

3 回答 3

1

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

于 2008-09-08T04:48:12.050 回答
1

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

于 2008-09-08T04:48:36.620 回答
0

John 指向 MSDN 的指针回答了 UnauthorizedAccessException 的用途 - 它仅在您尝试使用 OpenRemoteBaseKey 远程访问密钥时出现。

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

于 2008-09-08T05:00:45.670 回答