レジストリ キーを読み取ろうとして失敗する次のコードに問題があります。具体的なエラーは次のとおりです。「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 をチェックする上記のコードで確認しました。ログには、「管理者以外」の行ではなく、「管理者」の行が書き込まれます。
- コードを変更して、バイトではなく文字列を読み取り、別の場所 (HKCU ではなく HKLM) から読み取るようにしましたが、成功しませんでした。
ここで明らかな何かが欠けていますか?アドバイスをいただければ幸いです。他にトラブルシューティングが必要なことがありましたら、お知らせください。