UserPrincipals.GetAuthorizationGroups Wystąpił błąd (1301) podczas wyliczania grup. Po uaktualnieniu do kontrolera domeny Server 2012

Badania:

Podobny problem z obejściem, ale nie faktyczne rozwiązanie istniejącego problemu

Podobny problem wskazujący na aktualizację Microsoft End Point jako winowajcę

Powyższe linki są najbardziej odpowiednie dla mojego problemu. Podczas tworzenia tego posta oglądałem również wszystkie podobne pytania wymienione przez Stack Overflow i tylko powyższe pytania pasują do mojego problemu.

Tło:

UżywamUserPrincipal.GetAuthorizationGroups w przypadku uprawnień do dostępu do określonej strony z uruchomionymi usługami IIS 7.5 na serwerze 2008 R2 na stronie formularzy internetowych C # .NET 4.0 przez 2 i pół roku. 15 maja 2013 r. Usunęliśmy podstawowy kontroler domeny z serwerem Server 2008 (nie r2) i zastąpiliśmy go kontrolerem domeny Server 2012. Następnego dnia zaczęliśmy otrzymywać wyjątek wymieniony poniżej.

Używam głównego kontekstu do uwierzytelniania formularzy. Uzgadnianie nazwy użytkownika / przekazu powiodło się, a cookie uwierzytelniania jest poprawnie ustawione, ale kolejne wywołanie kontekstu głównego, które również wywołujeUserPrincipal.GetAuthorizationGroups zawiesza się sporadycznie. Rozwiązaliśmy kilka problemów z BPA, które pojawiły się w kontrolerze domeny Server 2012, ale nie rozwiązało to jeszcze problemu. Wprowadziłem również crona, który działa na dwóch oddzielnych serwerach. Oba serwery ulegną awarii w rozdzielczości SID grupy w różnym czasie, chociaż działają na tej samej podstawie kodu. (Środowisko programistyczne i środowisko produkcyjne).

Problem rozwiązuje się tymczasowo po ponownym uruchomieniu serwera WWW, a także na serwerze dev sam się rozwiąże po 12 godzinach braku działania. Serwer produkcyjny zwykle przestaje działać prawidłowo do czasu ponownego uruchomienia bez samodzielnego rozwiązania.

W tym momencie próbuję udoskonalić cron ukierunkowany na konkretne kontrolery domeny w sieci, a także na nowy kontroler domeny i używając standardowego zapytania LDAP, które obecnie nie daje bardziej ukierunkowanych czasów wyjątkowych. Jak dotąd znaleźliśmy na jednym serwerze internetowym, że nie ma wzoru na dni, w których zawodzi, ale odzyska się w ciągu około 12 godzin. Ostatnie wyniki pokazują, że awaria grupy SID nie powiodła się między 8:00 a 20:00, a następnie powraca do normy. Kilka dni później zakończy się niepowodzeniem o 20:00 i odzyska o 8:00, a następnie uruchomi się dobrze przez kolejne 12 godzin i ponownie zawiedzie. Mamy nadzieję, że zobaczymy, czy jest to tylko konkretny problem z komunikacją z serwerem, czy też jest to cały zestaw kontrolerów domeny.

Wyjątek:

Exception information: 
Exception type: PrincipalOperationException 
Exception message: An error (1301) occurred while enumerating the groups.  
The group's SID could not be resolved.
at System.DirectoryServices.AccountManagement.SidList.TranslateSids(String target, IntPtr[] pSids)
at System.DirectoryServices.AccountManagement.SidList..ctor(SID_AND_ATTR[] sidAndAttr)
at System.DirectoryServices.AccountManagement.AuthZSet..ctor(Byte[] userSid, NetCred credentials, ContextOptions contextOptions, String flatUserAuthority, StoreCtx userStoreCtx, Object userCtxBase)
at System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOfAZ(Principal p)
at System.DirectoryServices.AccountManagement.UserPrincipal.GetAuthorizationGroups()

Pytanie:

Biorąc pod uwagę powyższe informacje, czy ktoś ma jakiekolwiek pojęcie, dlaczego wycofanie systemu Windows Server 2008 (nie r2) i wdrożenie nowego serwera DC 2012 Server spowodowałobyUserPrincipal.GetAuthorizationGroups zawieść z błędem rozdzielczości SID 1301? Doceniono by również pomysły na wyeliminowanie możliwych przyczyn.

Zrzeczenie się:

To jest mój pierwszy post na Stack Overflow, często badam tutaj, ale do tej pory nie dołączyłem do dyskusji. Wybacz mi, czy powinienem był napisać gdzie indziej i nie krępuj się wskazać lepsze kroki przed wysłaniem.

AKTUALIZACJA 13-CZERWCA-2013:

12 czerwca poruszyłem kwestię możliwości usunięcia przedmiotów powodujących problem. Okres czasu był zbyt krótki, aby ustalić, czy poprawiony kod rozwiązał problem, ale będę kontynuował aktualizację, gdy pracujemy nad rozwiązaniem, które może przy odrobinie szczęścia ktoś tutaj może udzielić pomocy.

Oryginalny kod

    public bool isGroupMember(string userName, ArrayList groupList)
    {
        bool valid = false;

            PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domain_server + ".domain.org:636", null, ContextOptions.Negotiate | ContextOptions.SecureSocketLayer);

            // find the user in the identity store
            UserPrincipal user =
                UserPrincipal.FindByIdentity(
                    ctx,
                    userName);

            // get the groups for the user principal and
            // store the results in a PrincipalSearchResult object
            PrincipalSearchResult<Principal> groups =
                user.GetAuthorizationGroups();

            // display the names of the groups to which the
            // user belongs
            foreach (Principal group in groups)
            {
                foreach (string groupName in groupList)
                {
                    if (group.ToString() == groupName)
                    {
                        valid = true;
                    }
                }

            }
        return valid;
    }

Zaktualizowany kod

        public bool isGroupMember(string userName, ArrayList groupList, string domain_server)
        {
        bool valid = false;

            try
            {

                using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domain_server + ".domain.org:636", null, ContextOptions.Negotiate | ContextOptions.SecureSocketLayer))
                {

                    // find the user in the identity store
                    UserPrincipal user =
                        UserPrincipal.FindByIdentity(
                            ctx,
                            userName);

                    try
                    {
                        // get the groups for the user principal and
                        // store the results in a PrincipalSearchResult object
                        using (PrincipalSearchResult<Principal> groups = user.GetAuthorizationGroups())
                        {
                            // display the names of the groups to which the
                            // user belongs

                            foreach (Principal group in groups)
                            {
                                foreach (string groupName in groupList)
                                {

                                    if (group.ToString() == groupName)
                                    {
                                        valid = true;
                                    }
                                }

                                group.Dispose();

                            }
                        }//end using-2
                    }
                    catch
                    {
                        log_gen("arbitrary info");
                        return false;
                    }
                }//end using-1
            }
            catch
            {
                log_gen("arbitrary info");
                return false;
            }

        return valid;

    }

questionAnswers(10)

yourAnswerToTheQuestion