Метод UserPrincipal.GetGroups () выдает исключение после изменения DomainController - PullRequest
1 голос
/ 02 мая 2019

У нас есть приложение winforms, которое получает группы из активного каталога. Теперь все работало нормально, пока мы не заменили старый контроллер домена на новый.

С тех пор наше приложение генерирует исключение, когда вызывается метод UserPrincipal.GetGroups () . Исключение выдается, потому что оно пытается подключиться к старому DC.

Исключительное сообщение переведено:

Сервер не работает surottdc04.TOSOT.CH

Кто-нибудь имеет представление, кэшируется ли старая dc-информация где-нибудь или откуда приложение получает старую информацию?

На следующем снимке экрана вы можете увидеть фрагмент кода, в котором выдается исключение:

enter image description here

Как вы можете видеть, в окне просмотра есть правильный новый DC surottdc06 , это было предположительно взято из контекста текущего зарегистрированного пользователя. Но в Исключении все еще есть старый DC surottdc04 , почему?

UPDATE

Итак, мы выяснили, что когда мы передаем контекст методу в качестве параметра, то он работает, но без контекста метод пытается подключиться к старому DC.

Это одно из возможных решений, но вопрос все еще в том, где метод получает старую информацию о DC и пытается подключиться туда, когда метод вызывается без параметров?

public void GetGroups()
{

    var sid = WindowsIdentity.GetCurrent().User.Value;

    using (var context = new PrincipalContext(ContextType.Domain, "tosot.ch"))
    {
        using (var userPrinciple = UserPrincipal.FindByIdentity(context, sid))
        {
            /*
                * this works, we just pass the context which we've used to 
                * create the UserPrincipal instance again to fetch the groups
                */
            var ret = userPrinciple.GetGroups(context);


            /*
                * this works NOT: when calling without context argument,
                * it seems, the context used is not the same 
                * as the userPrinciple instance is linked to.
                * Instead it uses a selfmade context with an yet exsting,
                * but currently not online domain controller - why that??
                * (this 'old' domain controller is currently not running, 
                *  but it's yet not removed from the domain ...)
                */
            ret = userPrinciple.GetGroups();
        }
    }
}

1 Ответ

0 голосов
/ 08 мая 2019

Я предполагаю, что DNS все еще возвращает IP старого DC.

В командной строке запустите:

nslookup tosot.ch

Вы видите IP для surottdc04? Если это так, то это ваша проблема.

Я столкнулся с этой проблемой, хотя никогда не мог ее исправить. Эти инструкции могут помочь, но это похоже на старую статью, так что это больше не может быть сделано так: https://support.microsoft.com/en-us/help/555846

Обновление: Или вы можете использовать C #, чтобы увидеть, какие контроллеры домена он видит для текущего домена. Посмотрите, появляется ли старый?

foreach (DomainController dc in Domain.GetCurrentDomain().DomainControllers) {
    Console.WriteLine(dc.Name);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...