2012-11-12 31 views
0

我正在开发Windows 8 x64上的c#.net 3.5 Windows服务。在作为服务运行时在HKEY_Classes_root中缺少密钥

我需要看看特定的软件包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个子键。

什么可能导致此行为?

UPDATE: 的问题是,该服务是不同的用户下运行,并在服务查询注册表,因此不会出现每次只出现在HKEY_CURRENT_USER包。

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

+0

您是否在'HKEY_LOCAL_MACHINE \ Software \ Classes'中看到了额外的键? 'HKEY_Classes_Root'是本地机器和用户类的组合。 –

+0

您的应用程序正在编译为什么架构? x86或x64? – Arran

+0

这些是Windows应用商店的应用密钥,我肯定会采取安全措施来防止黑客入侵它们。尝试使用该服务的其他用户帐户。 –

回答

0

HKEY_CLASSES_ROOT关键实际上是它合并其他两个按键的虚拟键:

HKEY_LOCAL_MACHINE\Software\Classes 
HKEY_CURRENT_USER\Software\Classes 

这是最有可能希望用户部分下存在的价值。请记住,服务不会在普通用户(如控制台应用程序)的上下文中运行。

有关注册表项的更多信息,请浏览:

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

但是,您可以设置为里面确实有这些值的特定用户运行服务。

0

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