【问题标题】:missing keys in HKEY_Classes_root when running as a service作为服务运行时 HKEY_Classes_root 中缺少键
【发布时间】:2012-11-12 14:39:27
【问题描述】:

我正在 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 下的包在服务查询注册表时不会出现。

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

【问题讨论】:

  • 你看到HKEY_LOCAL_MACHINE\Software\Classes中的额外键了吗? HKEY_Classes_Root 是本地机器和用户类的组合。
  • 您的应用程序被编译成什么架构? x86 还是 x64?
  • 这些是 Windows 应用商店应用程序密钥,我肯定会假设安全性可以防止您破解它们。尝试使用该服务的其他用户帐户。

标签: c# windows-services registry


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-11-17
      • 2011-03-23
      • 2021-12-27
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多