例如,如果你想在与进程相同的上下文中运行一个线程,你可以做类似这样的事情:
private void ImpersonateThread()
{
new Thread(() =>
{
Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
//Do the work...
}).Start();
}
如果运行应用程序池作为一个用户运行并且身份验证模式设置为 Windows 身份验证的网站(在 MS-IIS 上),这非常有用。然后您可能希望线程在用户访问网站时运行。
更新:
我只是想澄清一下。该行:
Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
只需将用户(用户仍未模拟到线程)转移到线程,以便其他组件可以看到用户是谁并在必要时使用该信息,例如:
System.Security.Principal.WindowsImpersonationContext impersonationContext;
impersonationContext =
((System.Security.Principal.WindowsIdentity)System.Threading.Thread.CurrentPrincipal.Identity).Impersonate();
//Do the work that you want within the impersonated users context.
impersonationContext.Undo();
在模拟和撤消之间,用户被模拟并且所有代码都以该用户身份运行。我知道此示例中的用户是相同的,但假设线程持有的用户与运行进程的用户完全不同(用户输入的内容或类似内容)。希望这可以帮助 :-)