0

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 の下にのみ表示されるすべてのパッケージが表示されないことです。

サービスが別のユーザー レジストリをチェックする方法はありますか (ユーザーが現在ログインしていない場合でも)?

4

2 に答える 2

0

キーは実際には、他の2つの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

ただし、これらの値を持つ特定のユーザーとして実行するようにサービスを設定できます。

于 2012-11-12T14:43:57.043 に答える
0

私の仮定は、それが許可に関係しているということです。レジストリの領域が異なれば、権限も異なります。トラブルシューティングの手順として、別のユーザーとしてサービスを実行して、結果が変わるかどうかを確認します。もしそうなら、あなたはなりすましを調べたいと思うかもしれません。

于 2012-11-12T14:44:00.747 に答える