无法读取Windows 7上的64位registry项

我遇到以下一些代码尝试读取registry项失败的问题。 具体错误是:“ System.NullReferenceException:对象引用未设置为对象的实例 ”。 我使用的代码如下:

using System; using System.Collections.Generic; using System.Text; using Microsoft.Win32; using System.Collections; using System.Diagnostics; using System.Security.Principal; namespace UDTLibrary { public class NotificationBar { public static void Main(string[] args) { //Get User Info string sSource; string sLog; sSource = "TestCSFileSysWatcher"; sLog = "Application"; if (!EventLog.SourceExists(sSource)) EventLog.CreateEventSource(sSource, sLog); EventLog.WriteEntry(sSource, "NotificationBar.Main start"); WindowsIdentity identity = WindowsIdentity.GetCurrent(); WindowsPrincipal principal = new WindowsPrincipal(identity); if (!principal.IsInRole(WindowsBuiltInRole.Administrator)) { EventLog.WriteEntry(sSource, "NotificationBar.Main - non-Administrator"); } else { EventLog.WriteEntry(sSource, "NotificationBar.Main Administrator"); } NotificationBar p1 = new NotificationBar(); string prName = null; int value = 0; if (args == null) { throw new Exception("Attempt to run NotificationBar with no arguments supplied."); } else { if (args.Length != 2) { throw new Exception("Wrong number of arguments supplied."); } else { prName = args[0]; value = Convert.ToInt32(args[1]); } } RegistryKey currentUser = null; if (Environment.Is64BitOperatingSystem) { currentUser = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.CurrentUser, RegistryView.Registry64); } else { currentUser = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.CurrentUser, RegistryView.Registry32); } RegistryKey myKey = currentUser.OpenSubKey(@"Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify", true); byte[] all = (byte[])myKey.GetValue("IconStreams"); //here is where the code fails byte[] allwithoutheader = new byte[all.Length - 20]; byte[] header = new byte[20]; 

关于我的环境的一些事实:

  • 这是一个32位应用程序,我在Windows 7上运行(UAC启用 – 不,我不能closures它)。 但是,我正在从registry的64位视图中读取(如上面的代码所示 – 我已经确认RegistryView.Registry64正在被选中)
  • 代码正在使用pipe理权限运行。 我已经通过上面检查WindowsBuiltInRole.Administrator的代码证实了这一点 – 日志写入“Administrator”行而不是“非pipe理员”行
  • 我试着改变代码来读取一个string,而不是一个字节,也尝试从不同的位置(在HKLM而不是HKCU)读取没有成功。

我在这里错过了很明显的东西吗 任何build议,你可以给予非常感激。 如果还有其他问题需要排查,请告诉我。

如果你试图打开一个键,而没有这样的键,你会得到空。 尝试重新创建这样的关键:

 if (mykey == null) { key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"CurrentVersion\TrayNotify"); } 

现在去注册表使用regedit命令,找到你的子项“CurrentVersion \ TrayNotify”,你会看到你所创建的和你正在寻找的区别。

如果你想检查你的当前用户,运行命令行,然后输入

  echo %username%