Как начать поток в другом контексте безопасности?

Как запустить поток в контексте безопасности другого пользователя? Когда процесс запускает поток, обычно передается контекст безопасности, но как запускать поток в другом контексте безопасности с принципалом другого пользователя?

Ответы

Ответ 1

Я считаю, что вы можете просто установить CurrentPrincipal в качестве первой операции кода потока после запуска потока, и только тогда начните выполнение кода, который должен работать с другим директором.

Это должно позаботиться о любых проверках на основе ролей .NET. Если вам нужна олицетворение, а также для вызовов в ОС, вы можете олицетворять WindowsIdentity.

Код (может работать или не работать - не проверял его):

public void Run(object principalObj) {
    if (principalObj == null) {
        throw new ArgumentNullException("principalObj");
    }
    IPrincipal principal = (IPrincipal)principalObj;
    Thread.CurrentPrincipal = principal;
    WindowsIdentity identity = principal.Identity as WindowsIdentity;
    WindowsImpersonationContext impersonationContext = null;
    if (identity != null) {
        impersonationContext = identity.Impersonate();
    }
    try {
        // your code here
    } finally {
        if (impersonationContext != null) {
            impersonationContext.Undo();
        }
    }
}

...

Thread thread = new Thread(Run);
thread.Start(yourPrincipal);

Ответ 2

Я использовал методы как этот для успеха олицетворения.

Термин "олицетворение" в контекст программирования относится к метод, выполняющий код под другой пользовательский контекст, чем пользователь, который первоначально начал приложение, то есть пользовательский контекст временно изменен один или несколько раз во время выполнение приложения.

Причиной этого является выполнять задачи, которые текущий пользователь контекст приложения не разрешено делать. Конечно, вы могли бы предоставить пользователю выполнение приложения больше привилегий, но обычно это плохая идея (из-за ограничения безопасности) или невозможно (например, если у вас нет полного административный доступ к машине для сделайте это).