2

レジストリ キーを読み取ろうとして失敗する次のコードに問題があります。具体的なエラーは次のとおりです。「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) から読み取るようにしましたが、成功しませんでした。

ここで明らかな何かが欠けていますか?アドバイスをいただければ幸いです。他にトラブルシューティングが必要なことがありましたら、お知らせください。

4

1 に答える 1

0

キーを開こうとしていて、そのようなキーがない場合は、null になります。次のようにキーを再作成してみてください。

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

regeditコマンドを使用してレジストリに移動し、サブキー「CurrentVersion\TrayNotify」を見つけると、作成したものと探していたものの違いがわかります..

現在のユーザーを確認したい場合は、コマンドラインを実行してから入力します

 echo %username%
于 2013-04-23T08:29:56.393 に答える