【问题标题】:Registry.GetValue() works in Web App, but not in Console App [duplicate]Registry.GetValue() 适用于 Web 应用程序,但不适用于控制台应用程序 [重复]
【发布时间】:2018-03-27 22:27:13
【问题描述】:

以下代码完美地用于十几个 Intranet Web 应用程序。

public static string dbConnectionStringAIMS = RegRead(@"HKEY_LOCAL_MACHINE\SOFTWARE\MNI_APPS", "sql.connection.aims");
public static string dbConnectionStringDYN = RegRead(@"HKEY_LOCAL_MACHINE\SOFTWARE\MNI_APPS", "sql.connection.dynamics");


public static string RegRead(string keyName, string valueName) {

    string retVal = Convert.ToString(Registry.GetValue(keyName, valueName, ""));

    return retVal;

}

但是当我将它剪切并粘贴到 Windows 控制台应用程序中时,它会构建干净,并且运行时不会崩溃,但 总是返回 null。 reg 键的存在如图所示,并且如前所述,此代码是使用这些相同的键从工作 Web 应用程序中删除的。

我能想到的观察和差异:

Web 应用程序在 Web 服务器上运行,在 Active Directory 服务帐户下运行的 AppPool 中的 http 上下文中。

这个控制台应用程序正在我的桌面上运行(大概是在我自己的凭据下?)

我的本​​地注册表具有与 Web 服务器完全相同的 HKLM 键和值。

在其他 SO 文章中似乎有一种不同的语法,建议先使用 Registry.LocalMachine.OpenSubKey(),然后再使用 .GetValue()所以...

public static string dbConnectionStringAIMS = RegRead(@"SOFTWARE\OMNI_APPS", "sql.connection.aims");
public static string dbConnectionStringDYN = RegRead(@"SOFTWARE\OMNI_APPS", "sql.connection.dynamics");


public static string RegRead(string keyName, string valueName) {

    RegistryKey key = Registry.LocalMachine.OpenSubKey(keyName, false);

    string retVal = (string)key.GetValue(valueName);

    return retVal;

}

返回 null。

有什么想法吗?

谢谢!

【问题讨论】:

  • 请注意,代码是静态类的一部分,正如您所知道的那样。 ;-)
  • 在开始时查找错误代码
  • 您是否排除了 registry redirector 作为观察到行为的可能原因?
  • 有人将该问题标记为我在下面的答案中引用的资源的副本。哈哈。所以。社区的响应速度很快,而且通常很准确!!! ;-)

标签: c# winapi registry console-application


【解决方案1】:

这终于奏效了:

public static string dbConnectionStringAIMS = RegRead(@"SOFTWARE\OMNI_APPS", "sql.connection.aims");
public static string dbConnectionStringDYN = RegRead(@"SOFTWARE\OMNI_APPS", "sql.connection.dynamics");

public static string RegRead(string keyName, string valueName) {

    string retVal;
    RegistryKey key = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64); 
    key = key.OpenSubKey(keyName, true);
    retVal = (string)key.GetValue(valueName);

    return retVal;

}

我阅读了其他 SO 文章,指出读取 32 位操作系统注册表和 64 位操作系统注册表之间的区别,并在此处找到该代码:

Registry Key Get Value returns NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    相关资源
    最近更新 更多