【发布时间】: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