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,那么第二次调用(在块内)不会失败,而是返回原始用户的路径。

4

1 回答 1

1

有一些事情需要发生才能使这项工作:

  1. 模拟用户的配置文件需要使用LoadUserProfile显式加载- 这不仅仅是通过模拟用户来完成的。请注意,此 API 要求调用进程必须具有 SE_RESTORE_NAME 和 SE_BACKUP_NAME 权限。
  2. 如果使用从ApplicationSettingsBase继承的 Settings 类,那么您需要实现一个知道如何为每个用户加载配置的自定义SettingsProvider
  3. 默认情况下,设置属性是缓存的。您需要自定义 getter 以每次强制执行 Reload() 以确保调用 SettingsProvider。

这是一个很好的示例,展示了如何调用 LoadUserProfile API - http://www.codeproject.com/Articles/125810/A-complete-Impersonation-Demo-in-C-NET

于 2013-04-09T04:14:39.033 回答