Удаленное подключение к реестру и получение исключений

StackOverflow https://stackoverflow.com/questions/49166

  •  09-06-2019
  •  | 
  •  

Вопрос

Я унаследовал старый седой фрагмент кода (под седым я имею в виду бородавчатый, с большим количеством недокументированных исправлений ошибок, чем WTF-y), и есть одна часть, которая доставляет мне немного хлопот.Вот как он подключается к удаленному реестру, чтобы получить ключ установки и удаления программ:

try
{
    remoteKey = RegistryKey.OpenRemoteBaseKey(
        RegistryHive.LocalMachine, addr.Value).OpenSubKey(
        "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall");
    return 1;
}
catch (IOException e)
{
    IOException myexception = e;
    //Console.WriteLine("{0}: {1}: {2}",
    //    e.GetType().Name, e.Message, addr.Value);
    return 2;
}
catch (UnauthorizedAccessException e)
{
    UnauthorizedAccessException myexception = e;
    //Console.WriteLine("{0}: {1}: {2}",
    //    e.GetType().Name, e.Message, addr.Value);
    return 3;
}
catch (System.Security.SecurityException e)
{
    System.Security.SecurityException myexception = e;
    //Console.WriteLine("{0}: {1}: {2}",
    //    e.GetType().Name, e.Message, addr.Value);
    return 4;
}

Теперь у меня две проблемы:

  • Я знаю, почему IOException — если это машина, отличная от Windows, она выдаст это.Разница между UnauthorizedAccessException и SecurityException мне не очень понятна.У кого-нибудь есть идеи?

  • Весь этот фрагмент кода был разработан еще до того, как кто-то подумал, что вы не можете использовать локальную учетную запись для всего.В любом случае я не могу понять, как вы выполняете аутентификацию для удаленного подключения к реестру, и этот код выглядит так, как будто он используется только в одном случае, когда он не может получить эту информацию из WMI.

Любая помощь с любым из них была бы замечательной.

Это было полезно?

Решение 3

Указатель Джона на MSDN ответил, для чего предназначено UnauthorizedAccessException — оно появляется только тогда, когда вы пытаетесь получить удаленный доступ к ключу с помощью OpenRemoteBaseKey.

Мы немного опасаемся изменения контекста безопасности на компьютере — я нашел ссылку здесь об использовании WMI (который мы уже используем для подавляющего большинства тяжелой работы) для доступа к реестру, поэтому я мог бы попробовать это вместо этого.

Другие советы

Вероятно, вам придется использовать олицетворение, чтобы изменить учетные данные потока, вызывающего методы удаленного реестра.Глянь сюда (ссылка) для получения некоторой информации в MSDN.По сути, ваш поток имеет контекст безопасности, который используется для выполнения управляемых и неуправляемых вызовов.

В соответствии с MSDN, UnauthorizedAccessException не брошен от OpenSubKey.Так что я считаю, что это не нужно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top