安全异常 不允许请求的注册表访问

本文关键字:注册表 访问 请求 异常 不允许 安全 | 更新日期: 2023-09-27 18:31:56

我在WPF(.NET 4.0)中有一个工具应用程序,需要访问注册表并更改子项值。但是当我尝试在 Windows Server 2008 x64 中执行 x86 中内置的应用程序时,我收到错误"不允许安全异常请求的注册表访问"。当我在 Windows 8 x64 中执行相同的应用程序时,该应用程序运行良好。

我试图授予注册表项的权限,甚至更改所有者,但这并不好。

应用程序正在以管理员身份运行,我将此值设置为清单文件:

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
  <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
    <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
  </requestedPrivileges>
  <applicationRequestMinimum>
    <defaultAssemblyRequest permissionSetReference="Custom" />
    <PermissionSet class="System.Security.PermissionSet" version="1" ID="Custom" SameSite="site" Unrestricted="true" />
  </applicationRequestMinimum>
</security>

这是更改值的方法:

localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
localKey = localKey.OpenSubKey(RegistryHelper.Path64, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.SetValue);
if (localKey != null)
{
    localKey.SetValue(RegistryHelper.CsKey, CryptographyHelper.Encrypt(CryptographyHelper.DefaultKey, cs.ConnectionString));
    localKey.SetValue(RegistryHelper.ProviderKey, provider);
    localKey.Close();
}
localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
localKey = localKey.OpenSubKey(RegistryHelper.Path32, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.SetValue);
if (localKey != null)
{
    localKey.SetValue(RegistryHelper.CsKey, CryptographyHelper.Encrypt(CryptographyHelper.DefaultKey, cs.ConnectionString));
    localKey.SetValue(RegistryHelper.ProviderKey, provider);
    localKey.Close();
}

当我将构建更改为 AnyCPU 时,应用程序会在 WinServer 2008 x64 上按预期更改值,但在构建为 x86 时不会更改。在我的 Windows 8 x64 中,它可以在 x86 和 x64 中完美运行。你们有什么线索吗?

安全异常 不允许请求的注册表访问

因此,当尝试从 Windows Server 2008 上运行的 32 位应用程序访问显式指定的 64 位注册表视图位置时,会发生异常。这是因为在 Windows Server 2008 上,注册表会反映出来,导致 32 位应用程序无法访问值的 64 位副本。在更高版本的 Windows 上,例如在 Win8 x64 上,注册表值是共享的,因此 32 位应用程序可以访问任一视图。

虽然你还没有解释为什么应用程序需要写入Windows Server 2008上的两个物理位置,但我认为这对你来说不会是一个问题,因为你可以使用AnyCPU目标构建来更新32位和64位位置,因为你的代码会依次显式打开每个视图。 所以我认为你不需要 32 位构建,所以这个问题只是一个好奇心,对吧?

答案读取 x64 注册表项的问题也可能在这里有所帮助。