L'interrogation Active Directory à partir d'MVC résultat: Tenté d'accéder à un déchargé domaine d'application. (Exception de HRESULT: 0x80131014)

J'ai un problème à l'aide de c# sur .Net 4 dans une application web MVC, où quand j'ai une requête Active Directory, je fréquemment obtenez un message d'erreur: Tenté d'accéder à un déchargé domaine d'application. (Exception de HRESULT: 0x80131014).

La chose étrange est que cela fonctionne parfaitement pour un temps, et puis il va juste commencer à se produire, et puis tout simplement disparaître de nouveau.

J'ai fait quelques modifications à la fonction pour le faire fonctionner , mais ils semblent tous à l'échec. Je me demande si je fais quelque chose de mal, ou si il ya une meilleure façon de le faire.

Voici ma fonction actuelle, qui va accepter un identifiant de connexion, et un PrincipalContext. L'identifiant de connexion peuvent être à l'utilisateur DisplayName je.e "John Smith", ou DOMAINNAME\josmi. La valeur par défaut est d'utiliser les 2 premières lettres de leur prénom, et puis les 3 premières lettres de leur nom de famille. Il y a une case là-bas, si ce n'est pas le cas. Cette partie si bien.

public List<ADGroup> GetMemberGroups(string loginId, PrincipalContext principalContext, int tries = 0)
{
var result = new List<ADGroup>();
try
{
var samAccountName = "";
if (loginId.Contains(" "))
{
var fName = loginId.Split(Char.Parse(" "))[0].ToLower();
var sName = loginId.Split(Char.Parse(" "))[1].ToLower();
if (sName.Trim().Length == 2)
samAccountName = string.Format("{0}{1}", fName.StartsWith(".") ? fName.Substring(0, 4) : fName.Substring(0, 3), sName.Substring(0, 2));
else
samAccountName = string.Format("{0}{1}", fName.StartsWith(".") ? fName.Substring(0, 3) : fName.Substring(0, 2), sName.Substring(0, 3));
}
else
samAccountName = loginId.Substring(loginId.IndexOf(@"\") + 1);
var authPrincipal = UserPrincipal.FindByIdentity(principalContext, IdentityType.SamAccountName, samAccountName);
if (authPrincipal == null)
throw new Exception(string.Format("authPrincipal is null for loginId - {0}", loginId));
var firstLevelGroups = authPrincipal.GetGroups();
AddGroups(firstLevelGroups, ref result);
}
catch
{
if (tries > 5)
throw;
tries += 1;
System.Threading.Thread.Sleep(1000);
GetMemberGroups(loginId, principalContext, tries);
}
return result;
}
private void AddGroups(PrincipalSearchResult<Principal> principal, ref List<ADGroup> returnList)
{
foreach (var item in principal)
{
if (item.GetGroups().Count() > 0)
AddGroups(item.GetGroups(), ref returnList);
returnList.Add(new ADGroup(item.SamAccountName, item.Sid.Value));
}
}

Cette fonction est appelée comme ceci:

MembershipGroups = ad.GetMemberGroups(user.SamAccountName, new PrincipalContext(ContextType.Domain));

La l'erreur que j'ai PARFOIS obtenir est:

Système.AppDomainUnloadedException:
Tenté d'accéder à un déchargé
domaine d'application. (Exception de HRESULT:
0x80131014) à
Système.StubHelpers.StubHelpers.InternalGetCOMHRExceptionObject(Int32
rh, IntPtr pCPCMD, Objet pThis) à
Système.StubHelpers.StubHelpers.GetCOMHRExceptionObject(Int32
rh, IntPtr pCPCMD, Objet pThis) à
Système.DirectoryServices.AccountManagement.UnsafeNativeMethods.IADsPathname.Récupérer(Int32
lnFormatType) à
Système.DirectoryServices.AccountManagement.ADStoreCtx.LoadDomainInfo()
au
Système.DirectoryServices.AccountManagement.ADStoreCtx.get_UserSuppliedServerName()
au
Système.DirectoryServices.AccountManagement.ADDNLinkedAttrSet.BuildPathFromDN(String
dn) à
Système.DirectoryServices.AccountManagement.ADDNLinkedAttrSet.MoveNextPrimaryGroupDN()
au
Système.DirectoryServices.AccountManagement.ADDNLinkedAttrSet.MoveNext()
au
System.DirectoryServices.AccountManagement.FindResultEnumerator1.MoveNext()
at
System.DirectoryServices.AccountManagement.FindResultEnumerator
1.System.Collections.IEnumerator.MoveNext()

  • Je vais avoir le même problème avec aléatoire AppDomainUnloadedExceptions lors de l'appel en S.DS.AM et ne peut pas trouver une solution. Ici en espérant que la fixation d'une prime obtiendrez des globes oculaires sur ce...
  • Un truc qui au moins a travaillé pour moi, c'est quand vous initialisez le PrincipalContext passer le nom de domaine dans le constructeur. PrincipalContext domaine = new PrincipalContext(ContextType.Domaine,"AD");
  • commentaire semble avoir fait le tour pour moi. J'ai eu le même message d'erreur et en passant dans le domaine semble avoir fait le tour.
InformationsquelleAutor Ryk | 2011-07-07