繁体   English   中英

Windows服务从虚拟注册表中读取

[英]Windows service reading from virtualized registry

如果我错了,请更正我,因为我敢肯定我在某处读过:Windows服务已禁用注册表虚拟化。 此外,对于x64二进制文件,虚拟化被禁用。

我有一个用C#编写的Windows服务,需要从HKEY_LOCAL_MACHINE \\ SOFTWARE加载值。 当我将服务编译为x86并启动它时,它无法读取该值。 当我编译与x64相同的代码并启动它时,它将读取该值。 我希望我的服务能够在x64机器之外的x86机器上运行,但是它还必须能够读取此值。 如何获取Windows服务以读取非虚拟值?

Windows服务禁用了注册表虚拟化。 此外,对于x64二进制文件,虚拟化被禁用。

是的,是的,它对于64位进程和“ 非交互式进程,例如服务 ”已禁用。

看看我以前关于SO的文章,了解有关注册表视图的一些详细信息。 请不要将视图虚拟化混淆。 他们不同。 需要使用视图将32位应用程序与64位应用程序隔离。

在C#中,您可以简单地要求操作系统打开64位版本的注册表来执行以下操作:

RegistryKey baseKey = RegistryKey.OpenBaseKey(
    RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey key = baseKey.OpenSubKey("Software", false);
object value = key.GetValue("");

如果您的应用程序/服务将在32位计算机上运行,​​即使您要求RegistryView.Registry64您也将始终获得常规注册表。 在64位计算机上运行时,您将始终获得注册表的正常版本(= 64位版本)。

附带问题:为什么需要将应用程序编译为X86或X64? 不能简单地保留AnyCPU?

虚拟化的目的不同,它并不是要将注册表与32位应用程序分开,而是要增强与传统应用程序的兼容性,我们都希望64位本机应用程序将以正确的方式使用注册表。 要访问注册表的非虚拟版本,您必须使用REG_KEY_DONT_VIRTUALIZE标志打开注册表项。 不能在Microsoft.Win32类中使用此标志,因此必须DllImport它们和P / Invoke。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM