0

私は古いコードを継承しました(hoaryとは、WTF-yよりも多くの文書化されていないバグ修正でいぼを意味します)。少し問題を引き起こしている部分があります。リモートレジストリに接続してプログラムの追加/削除キーを取得する方法は次のとおりです。

try
{
    remoteKey = RegistryKey.OpenRemoteBaseKey(
        RegistryHive.LocalMachine, addr.Value).OpenSubKey(
        "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall");
    return 1;
}
catch (IOException e)
{
    IOException myexception = e;
    //Console.WriteLine("{0}: {1}: {2}",
    //    e.GetType().Name, e.Message, addr.Value);
    return 2;
}
catch (UnauthorizedAccessException e)
{
    UnauthorizedAccessException myexception = e;
    //Console.WriteLine("{0}: {1}: {2}",
    //    e.GetType().Name, e.Message, addr.Value);
    return 3;
}
catch (System.Security.SecurityException e)
{
    System.Security.SecurityException myexception = e;
    //Console.WriteLine("{0}: {1}: {2}",
    //    e.GetType().Name, e.Message, addr.Value);
    return 4;
}

今、私は2つの問題を抱えています:

  • なぜIOExceptionが発生するのかはわかっています。Windows以外のマシンの場合は、それがスローされます。UnauthorizedAccessExceptionとSecurityExceptionの違いはあまり明確ではありません。誰かアイデアがありますか?

  • このコード全体は、ローカルログオンをすべてに使用するわけではないと誰もが考える前に設計されました。とにかく、レジストリにリモート接続するための認証をどのように行うかを理解できません。このコードは、WMIからこの情報を取得できない場合にのみ使用されるように見えます。

どちらかで助けがあれば素晴らしいでしょう。

4

3 に答える 3

1

リモートレジストリメソッドを呼び出すスレッドの資格情報を変更するには、おそらく偽装を使用する必要があります。MSDNの詳細については、ここ(linky)を参照してください。基本的に、スレッドには、マネージドおよびアンマネージド呼び出しを行うために使用されるセキュリティコンテキストがあります。

于 2008-09-08T04:48:12.050 に答える
1

MSDNによると、UnauthorizedAccessExceptionはOpenSubKeyによってスローされません。ですから、必要ないと思います。

于 2008-09-08T04:48:36.620 に答える
0

JohnのMSDNへのポインタは、UnauthorizedAccessExceptionの目的に答えました。これは、OpenRemoteBaseKeyを使用してリモートでキーにアクセスしようとした場合にのみ表示されます。

コンピューターのセキュリティコンテキストを変更することについては少し警戒しています-レジストリにアクセスするためにWMI(すでに大部分の手間のかかる作業に使用しています)を使用することについてのリファレンスをここで見つけたので、試してみるかもしれません代わりに。

于 2008-09-08T05:00:45.670 に答える