Код работал больше года, пока его не перенесли на новый хост в другом домене AD. . Новый хост, как и старый, представляет собой сервер 2016 года, присоединенный к AD, а учетные записи Windows, которые я использовал для тестирования, представляли собой учетную запись локального администратора и учетную запись администратора домена. Я получил одинаковые сообщения об ошибках, используя обе учетные записи. Единственное другое отличие, которое приходит на ум, это то, что код работал под Net Core 6 на старом хосте, а теперь на новом хосте он работает под Net Core 8. Я не читал ничего об изменениях в Net Core 8, которые бы повлияет на использование библиотеки Microsoft.Win32.
Это приложение обрабатывает файлы журналов с почтового сервера и записывает их в базу данных SQL, поэтому это его единственная функция, следовательно, настройки UAC имеют был выключен. Код пытается создать дополнительный ключ реестра в разделе HKLM\SOFTWARE\WOW6432Node. Это упрощенная версия этого кода.
Код: Выделить всё
public class TestCase
{
private const string MYAPPROOTKEY = "SOFTWARE\\WOW6432Node\\MyApp";
public TestCase()
{
// Current Windows Acct is a member of Domain Administrators and
// it is a member of the local Administrator's Group
WindowsIdentity _WindowsIdentity = WindowsIdentity.GetCurrent();
RegistryKey _HKLM = Microsoft.Win32.Registry.LocalMachine;
RegistryKey _MyAppKey = OpenSubKey(_HKLM, MYAPPROOTKEY);
if (_MyAppKey is null)
{
RegistrySecurity _RegistrySecurity =
CreateElevatedRegistryRule(_WindowsIdentity);
_HKLM.SetAccessControl(_RegistrySecurity);
// throws Exception: Attempted to perform an unauthorized operation.
RegistryKey _MyAppRootKey =
Microsoft.Win32.Registry.LocalMachine.CreateSubKey(MYAPPROOTKEY,
RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryOptions.None);
// Throws Exception: Access to the registry key
// 'HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\MyApp'
// is denied.
}
}
private static RegistryKey OpenSubKey(RegistryKey p_RegistryKey, string p_SubKey)
{
RegistryKey _RegistryKey = null;
try
{
_RegistryKey = p_RegistryKey.OpenSubKey(p_SubKey, RegistryKeyPermissionCheck.ReadWriteSubTree,
RegistryRights.ReadKey
| RegistryRights.EnumerateSubKeys
| RegistryRights.QueryValues
| RegistryRights.ReadPermissions);
}
catch (System.Exception ex)
{
string _Msg = ex.Message;
System.Exception _ApplicationException = FormatExceptionMsg.PrepareApplicationException(MethodBase.GetCurrentMethod(), ex);
DebugLogger.Write(LogEventLevel.Error, _ApplicationException, _Msg);
SerilogConsoleLogger.Write(LogEventLevel.Error, _Msg);
}
return _RegistryKey;
}
private static RegistrySecurity CreateElevatedRegistryRule(WindowsIdentity p_WindowsIdentity)
{
RegistrySecurity _RegistrySecurity = null;
try
{
_RegistrySecurity = new RegistrySecurity();
_RegistrySecurity.AddAccessRule(new RegistryAccessRule(
p_WindowsIdentity.Owner,
RegistryRights.ReadKey
| RegistryRights.WriteKey
| RegistryRights.ReadPermissions
| RegistryRights.SetValue
| RegistryRights.CreateSubKey
| RegistryRights.Delete
| RegistryRights.EnumerateSubKeys
| RegistryRights.QueryValues,
InheritanceFlags.None,
PropagationFlags.None,
AccessControlType.Allow));
}
catch (System.Exception ex)
{
string _Msg = ex.Message;
System.Exception _ApplicationException = FormatExceptionMsg.PrepareApplicationException(MethodBase.GetCurrentMethod(), ex);
DebugLogger.Write(LogEventLevel.Error, _ApplicationException, _Msg);
SerilogConsoleLogger.Write(LogEventLevel.Error, _Msg);
}
return _RegistrySecurity;
}
}
Параметр реестра для UAC можно найти по адресу: «SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System»
Незнакомые мне настройки и значения, которые могут быть источником этого исключения:
FilterAdministratorToken = 0EnableUIADesktopToggle = 0
ConsentPromptBehaviorAdmin = 0
ConsentPromptBehaviorUser = 3
EnableLUA = 1
Заранее благодарим за помощь.
Подробнее здесь: https://stackoverflow.com/questions/780 ... rows-denie