我在尝试读取注册表项但失败的以下代码中遇到问题。具体错误是:“ 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];
关于我的环境的一些事实:
- 这是我在 Windows 7 上运行的 32 位应用程序(启用了 UAC - 不,我无法将其关闭)。但是,我正在从注册表的 64 位视图中读取(如上面的代码所示 - 我已确认正在选择 RegistryView.Registry64)
- 该代码以管理权限运行。我已经通过上面检查 WindowsBuiltInRole.Administrator 的代码确认了这一点 - 日志写入“管理员”行而不是“非管理员”行
- 我尝试更改代码以读取字符串而不是字节,并尝试从不同的位置(在 HKLM 而不是 HKCU)读取但没有成功。
我在这里遗漏了一些明显的东西吗?您可以提供的任何建议将不胜感激。如果您还有其他需要解决的问题,请告诉我。