我正在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下出现的每个包。
服务是否有办法检查其他用户注册表(即使用户当前未登录)?
答案 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)
我的假设是它与权限有关。注册表的不同区域具有不同的权限。作为故障排除步骤,我会尝试以另一个用户身份运行我的服务,以查看结果是否发生变化。如果是这样,那么你可能想要考虑模仿。