0

我正在 Windows 8 x64 上开发 ac# .net 3.5 windows 服务。

我需要查看特定的包 ID 是否在节点 HKEY_CLASSES_ROOT\ActivatableClasses\Package 下。

这是代码

internal static bool IsPackageInstalled
    {
        get
        {
            try
            {
                var packageKey = Registry.ClassesRoot.OpenSubKey(@"ActivatableClasses\Package");
                if (packageKey != null)
                {
                    return packageKey.GetSubKeyNames().Any(key => key.StartsWith(MyPackageName, StringComparison.InvariantCultureIgnoreCase));
                }                                                                
            }
            catch (Exception ex)
            {


            }

            return false;
        }
    }

在控制台应用程序中运行此代码时,它可以正常工作并返回 true。

但是在 Windows 服务中运行代码时,我得到了错误。我尝试调试它,发现在服务中子键名称列表仅包含 2 个键,而实际上有 21 个子键。

是什么导致了这种行为?

更新: 问题是服务在不同的用户下运行,因此当服务查询注册表时,仅出现在 HKEY_CURRENT_USER 下的每个包都不会出现。

该服务有没有办法检查另一个用户注册表(即使用户当前没有登录)?

4

2 回答 2

0

HKEY_CLASSES_ROOT钥匙实际上是一个虚拟钥匙,它合并了另外两个钥匙:

HKEY_LOCAL_MACHINE\Software\Classes
HKEY_CURRENT_USER\Software\Classes

您想要的值很可能存在于 USER 部分下。请记住,服务不会在像控制台应用程序这样的普通用户的上下文中运行。

有关注册表项的更多信息,请参见此处:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724475(v=vs.85).aspx

但是,您可以将服务设置为作为具有这些值的特定用户运行。

于 2012-11-12T14:43:57.043 回答
0

我的假设是它与权限有关。注册表的不同区域具有不同的权限。作为故障排除步骤,我将尝试以其他用户身份运行我的服务,以查看结果是否发生变化。如果是这样,那么您可能想要研究模拟。

于 2012-11-12T14:44:00.747 回答