Псевдокод:
AppDomain.CurrentDomain.SetPrincipalPolicy(
PrincipalPolicy.WindowsPrincipal);
...
// Приложение запущено от имени User0
WindowsIdentity wi1; // User1
WindowsIdentity wi2; // User2
using (var i1 = wi1.Impersonate())
{
textBox.AppendText(Environment.UserName + "\r\n"); // <- User1
textBox.AppendText(Thread.CurrentPrincipal.Identity.Name + "\r\n"); // <- User1
}
textBox.AppendText(Environment.UserName + "\r\n"); // <- User0
textBox.AppendText(Thread.CurrentPrincipal.Identity.Name + "\r\n"); // <- User1 !!!!
using (var i2 = wi2.Impersonate())
{
textBox.AppendText(Environment.UserName + "\r\n"); // <- User2
textBox.AppendText(Thread.CurrentPrincipal.Identity.Name + "\r\n"); // <- User1 !!!!
}
textBox.AppendText(Environment.UserName + "\r\n"); // <- User0
textBox.AppendText(Thread.CurrentPrincipal.Identity.Name + "\r\n"); // <- User1 !!!!
Получается, будучи единожды назначенным, Thread.CurrentPrincipal далее уже не зависит от имперсонированного пользователя?! Если к нему обратиться до первой имперсонации, то там окажется User0 и более уже не изменится. Попытки выполнить в любом месте
Thread.CurrentPrincipal = null ничего, разумеется, не изменили — значение остаётся тем-же.
Это баг или так задумано? И если последнее, то в чём идея?
PS NET 3.5, завтра проверю на 4-м