1

ConfigurationManager.OpenExeConfigurationを取得して、現在偽装されているユーザーを使用することは可能ですか( WindowsImpersonationContextのコード サンプルと同様に偽装が行われている場合)。以下は小さな抜粋です。

using (safeTokenHandle)
{
    Console.WriteLine("Did LogonUser Succeed? " + (returnValue ? "Yes" : "No"));
    Console.WriteLine("Value of Windows NT token: " + safeTokenHandle);

    // Check the identity.
    Console.WriteLine("Before impersonation: "
        + WindowsIdentity.GetCurrent().Name);

    Configuration config;
    //config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
    //Console.WriteLine("Local user config path: {0}", config.FilePath);

    // Use the token handle returned by LogonUser. 
    using (WindowsIdentity newId = new WindowsIdentity(safeTokenHandle.DangerousGetHandle()))
    {
        using (WindowsImpersonationContext impersonatedUser = newId.Impersonate())
        {

            // Check the identity.
            Console.WriteLine("After impersonation: " + WindowsIdentity.GetCurrent().Name);

            // This line throws exception
            config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
            Console.WriteLine("Local user config path: {0}", config.FilePath);

        }
    }
    // Releasing the context object stops the impersonation 
    // Check the identity.
    Console.WriteLine("After closing the context: " + WindowsIdentity.GetCurrent().Name);
}

偽装されたスコープ内に呼び出しを追加すると、例外がスローされます。

Exception occurred. An error occurred loading a configuration file: Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))

偽装ブロックの前に OpenExeConfiguration も呼び出すと、2 回目の呼び出し (ブロック内) は失敗しませんが、元のユーザーのパスが返されます。

4

1 に答える 1

1

これを機能させるために必要なことがいくつかあります。

  1. 偽装されたユーザーのプロファイルは、LoadUserProfileを使用して明示的に読み込む必要があります。これは、ユーザーを偽装するだけでは行われません。この API では、呼び出しプロセスが SE_RESTORE_NAME および SE_BACKUP_NAME 特権を持っている必要があることに注意してください。
  2. ApplicationSettingsBaseから継承する Settings クラスを使用する場合、ユーザーごとに構成をロードする方法を知っているカスタムSettingsProviderを実装する必要があります。
  3. 設定プロパティはデフォルトでキャッシュされます。SettingsProvider が確実に呼び出されるようにするには、毎回 Reload() を強制するようにゲッターをカスタマイズする必要があります。

これは、LoadUserProfile API を呼び出す方法を示す良いサンプルです - http://www.codeproject.com/Articles/125810/A-complete-Impersonation-Demo-in-C-NET

于 2013-04-09T04:14:39.033 に答える