Удаленное подключение к реестру и получение исключений
Вопрос
Я унаследовал старый седой фрагмент кода (под седым я имею в виду бородавчатый, с большим количеством недокументированных исправлений ошибок, чем 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.Так что я считаю, что это не нужно.