Windows 8 x64 で ac# .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 サービス内でコードを実行すると、false になります。私はそれをデバッグしようとしましたが、実際には 21 個のサブキーがあるのに、サービスのサブキー名のリストには 2 つのキーしか含まれていないことがわかりました。
何がこの動作を引き起こしたのでしょうか?
更新: 問題は、サービスが別のユーザーで実行されているため、サービスがレジストリを照会したときに、HKEY_CURRENT_USER の下にのみ表示されるすべてのパッケージが表示されないことです。
サービスが別のユーザー レジストリをチェックする方法はありますか (ユーザーが現在ログインしていない場合でも)?