c # Не удается получить значение реестра из службы Windows - PullRequest
1 голос
/ 21 сентября 2019

У меня проблема с чтением значения из реестра в приложении-службе.Я новичок в этой части приложения службы .NET, но я использовал этот код в моем приложении формы.Должно быть что-то другое, потому что это не работает в приложении-службе.В любом случае, это мой код, который я обычно читал:

 public string GetValue(string Name, string Path = "")
    {
        try
        {
            RegKey = Registry.CurrentUser.OpenSubKey(DefaultFolder + @Path + @"\");
            if (RegKey != null)
            {
                object TempObj = RegKey.GetValue(Name);
                if (TempObj == null) return "-13003";
                Type T = TempObj.GetType();
                if (T.IsArray)
                {
                    string[] TempArray = (string[])TempObj;
                    string output = "";
                    for (int i = 0; i < TempArray.Length; i++)
                    {
                        output += TempArray[i].Substring(0, TempArray[i].Length - 1);
                        if (i != TempArray.Length) output += "\n";
                    }

                    return output;
                }
                else
                {
                    return RegKey.GetValue(Name).ToString();
                }
            }
            else
            {
                return "-13001";
            }
        }
        catch (Exception ex)
        {
            return "-13002";
        }
    }

Как только я изменяю свой program.cs, чтобы он вызывал мой класс как консольное приложение, оно снова работает, затем я возвращаю его обратно:

ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
            {

                new TestAppService()
            };
            ServiceBase.Run(ServicesToRun);

и это не работает.

Пока я знаю, что переменная RegKey остается нулевой после

RegKey = Registry.CurrentUser.OpenSubKey(DefaultFolder + @Path + @"\");

этой строки, но я не знаю, почему.

I 'Я немного погуглил и нашел что-то вроде этого

RegistryKey rb = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Default);
RegKey = rb.OpenSubKey(DefaultFolder + @"\" + Name, false);

Но результат тот же, моя переменная RegKey по-прежнему равна нулю.

Все, что я хочу, это прочитать значение в пути, как это:Компьютер \ HKEY_CURRENT_USER \ Software \ ServiceReadLocation \ Значение

1 Ответ

0 голосов
/ 22 сентября 2019

Код Registry.CurrentUser и RegistryHive.CurrentUser при выполнении в службе Windows LocalSystem не будет работать так, как вы ожидаете, и, скорее всего, является причиной null, с которой вы столкнулись.

MSDN:

Ключ реестра HKEY_CURRENT_USER связан с пользователем по умолчанию , не текущим пользователем .Чтобы получить доступ к профилю другого пользователя, выдать себя за пользователя, а затем получить доступ к HKEY_CURRENT_USER

Так что я тоже вижу варианты.

  1. Возможно, проще всего запустить службу от имени этого пользователя
  2. Запустить службу как LocalSystem и выдать себя за пользователя, а затем при необходимости получить доступ к реестру.После прочтения вы можете прекратить олицетворение.
...