作为服务运行时,HKEY_Classes_root中缺少键

时间:2012-11-12 14:39:28

标签: c# windows-services registry

我正在Windows 8 x64上开发一个c#.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下出现的每个包。

服务是否有办法检查其他用户注册表(即使用户当前未登录)?

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

我的假设是它与权限有关。注册表的不同区域具有不同的权限。作为故障排除步骤,我会尝试以另一个用户身份运行我的服务,以查看结果是否发生变化。如果是这样,那么你可能想要考虑模仿。