问题标签 [registry-virtualization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
4702 浏览

windows - 如何为应用程序创建带有虚拟化注册表的“沙盒”?

我们有一个第三方原生应用程序(相信用 CI 编写),我们希望在一台机器上运行多个实例。

然而,应用程序从一个特定的注册表项读取和写入,以便找到配置文件的位置。它在运行期间连续读取此位置。注册表项位于 HKLM 中。这意味着,如果我们尝试运行具有 2 个不同位置的配置文件的应用程序的 2 个不同实例,则进程会互相踩踏。

是否可以“虚拟化”进程正在使用的注册表(或在沙箱中运行每个进程),以便它们都可以认为它们正在写入单个位置,但实际上它们正在从不同的地方写入和读取,他们赢了不踩对方脚趾?

0 投票
1 回答
1054 浏览

windows - 注册表虚拟化失败

我有一个 32 位程序试图在运行 Windows 8.1 的 Windows 64 位设置中访问存储在 HKLM\Software\Microsoft\VisualStudio 中的密钥。

通常它工作得很好,它实际上会从 Software\Wow6432Node 读取该密钥。

但是,我有一台读取失败的机器(看起来与其他机器没有什么不同)。当我使用 Process Monitor 查看注册表访问时,它显示它正在尝试从 VirtualStore 读取它,但它不存在,因此失败。

为什么 Windows 没有像在其他安装中那样向我的应用程序显示合并视图?

谢谢,马努

0 投票
1 回答
317 浏览

c# - 如果我知道用户的 SID,HKEY_USERS 的可靠性如何?

我正在尝试访问注册表值(由另一个程序编写),当从登录用户的上下文访问时,这些值应该可以通过 HKEY_CURRENT_USER 注册表基本键随时可用。不幸的是,我正在从服务访问此信息,因此根据我收集的信息,我有两个选择:

  • 为访问注册表的每段代码模拟登录用户,并通过 HKEY_CURRENT_USER/SOFTWARE/Company/Product 使用 HKEY_CURRENT_USER 基本键访问注册表...
  • 获取登录用户的 SID 并通过 HKEY_USERS/{SID}/SOFTWARE/Company/Product... 使用 HKEY_USERS 基本密钥访问注册表

我非常想使用第二种解决方案,因为它对于我正在使用的大型代码库来说要简单得多。我最近才了解注册表虚拟化及其可能导致的问题,所以我想验证我的上述解决方案是否有效,并询问是否有任何其他解决方案可以解决我的问题。

感谢您提供有关该主题的任何知识,或者您可以指出我可能无法找到的文章。

0 投票
0 回答
194 浏览

c# - 禁用文件和注册表虚拟化后,我的 C# 应用程序在安装后无法正常工作

我们有独立的 C# 桌面应用程序,它也使用 VB6 代码将一些逻辑写入 .md5 文件。

由于 Windows 文件和注册表虚拟化,某些机器上的某些注册表项无法获取值,因为系统会将注册表读取重定向到注册表中的某个其他位置。为了解决这个问题,我们为我们的应用程序禁用了虚拟化。

这个问题已经解决了,但现在我们面临一个与 VB6 代码相关的新问题,这很奇怪。当我使用Visual Studio(VS15)通过我的代码库运行应用程序时,当我直接从本地代码库运行exe时它工作正常,但当我通过开始菜单运行应用程序时(安装应用程序后)它确实不起作用并给出下面给出的例外。如果我以管理员身份运行应用程序,它工作正常。

我得到的例外来自VB6代码:

tvsFilename = tvsReleaseFolder & "\Packages\" & tvsPackageName & ".md5" tvTextStream = tvFSOCP.OpenTextFile(tvsFilename, Scripting.IOMode.ForAppending, False, Scripting.Tristate.TristateFalse)

HRESULT 异常:0x800A0035 (CTL_E_FILENOTFOUND)。

我检查了对该位置的访问权限,并且所有权限都授予了用户。

如果它需要管理员权限,为什么代码库可以正常工作,因为我通常从代码库或未以管理员身份运行的 Visual Studio 运行 exe。它仅在我安装应用程序并正常运行时发生。

我再次检查以启用虚拟化并安装更新的应用程序,现在它可以工作了。

但是我们必须为我们的应用程序禁用虚拟化才能获得正确的注册表位置。

我检查了使用 CreateTextFile() 函数从 VB6 代码创建虚拟文本文件,发现问题存在于 VB6 代码中,因为它适用于代码库但不适用于已安装的应用程序版本,如果我禁用虚拟化我的应用程序。

我搜索了很多主题,但没有发现任何相关的问题。任何帮助都会给我进一步前进的方向。

0 投票
2 回答
43 浏览

delphi-xe2 - 如何让 Delphi 应用程序被调试看到真实的注册表 - 而不是虚拟的

背景:

我正在开发一个 Windows 服务并使用注册表来获取参数(使用服务条目下方的键参数)。

Delphi 是作为 AppWave 应用程序安装的(我不能在这里说长话),因此在调试时它会转到虚拟副本 [1] 而不是真正的交易 [2]。

在使用 Process Monitor 记录服务的注册表活动后,我检测到了这一点。如果我在Delphi之外运行服务,应用程序可以正常访问真实密钥。

问题:有什么方法可以绕过 Streaming Core 并调试访问真实注册表项的应用程序?

模组注意事项:由于没有AppWave标签,我无法包含它 - 我试过了。

  1. 虚拟副本:HKEY_LOCAL_MACHINE\software\Embarcadero\StreamingCore\Profiles\fabricio\Applications\{<<GUID>>}\Virtualization\Keys\whklm\SYSTEM\CurrentControlSet\services\[service]\Parameters]
  2. 真正的交易:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\[service]\Parameters
0 投票
2 回答
107 浏览

windows-vista - 应用程序的系统范围配置文件的标准位置?

从 Windows Vista 开始,我们来自 Redmond 的朋友正在改掉将配置文件存储在C:\Program Files\<AppName>\config.ini. 好的,他们介绍了Registry Virtualization,但修复你的东西总是更好,对吧?

我打算修复一个作为服务运行的 pre-Vista 应用程序,它需要维护一个机器范围的配置文件。

我在哪里存储配置文件?获取该位置路径的最便携/面向未来的方法是什么?