2010-12-23 11 views
17

Aşağıdaki kod ile, bir kullanıcı için tüm Active Directory gruplarını almak için çalışıyorum başarısız:UserPrincipal.GetGroups bilinmeyen bir hata

private static IEnumerable<string> GetGroupNames(string userName) 
    { 
     using (var context = new PrincipalContext(ContextType.Domain)) 
     { 
      using (var userPrincipal = UserPrincipal.FindByIdentity(context, userName)) 
      { 
       var groupSearch = userPrincipal.GetGroups(context); 
       var result = new List<string>(); 
       foreach (var principal in groupSearch) 
       { 
        Log.LogDebug("User {0} is member of group {0}", userPrincipal.DisplayName, principal.DisplayName); 
        result.Add(principal.SamAccountName); 
       } 
       return result; 
      } 
     } 
    } 

Bu kodu doğru kullanıcı müdürü bulur, ama GetGroups ile çağrıldığında başarısız Bir PrincipalOperationException: Bilinmeyen hata (0x80005000).

Kök istisna:

at System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOf(Principal foreignPrincipal, StoreCtx foreignContext) 
    at System.DirectoryServices.AccountManagement.Principal.GetGroupsHelper(PrincipalContext contextToQuery) 
    at System.DirectoryServices.AccountManagement.Principal.GetGroups(PrincipalContext contextToQuery) 
    at [line of the GetGroup call] 

İç istisna (COMException):

at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) 
    at System.DirectoryServices.DirectoryEntry.Bind() 
    at System.DirectoryServices.DirectoryEntry.get_AdsObject() 
    at System.DirectoryServices.PropertyValueCollection.PopulateList() 
    at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName) 
    at System.DirectoryServices.PropertyCollection.get_Item(String propertyName) 
    at System.DirectoryServices.AccountManagement.ADUtils.RetriveWkDn(DirectoryEntry deBase, String defaultNamingContext, String serverN 

Another report with this problem.

Herhangi bir ipucu? PrincipalContext için adı argüman olarak Environment.UserDomainName ekleme

+1

Bu, tüm kullanıcılarda oluyor mu? Ya da sadece belirli bir kullanıcı üzerinde olur? .NET kitaplığında, kullanıcı DN "/" içerdiğinde bu COMException komutunu attığını biliyorum. Ayrıca bu sorunun yalnızca bir tanesini "/" içeren "DN" ile yalnızca –

+0

açıkladığınızı onaylıyorsanız, bu sorunla ilgili bir çözümüm var. Kullanıcı DN’si "/" içerdiğinde sorun yaşarım. Kullandığın düzeltmenin ne olduğunu söyler misin lütfen? – Lamelas84

+0

DN'de "/" içeren kullanıcılar için aynı sorunu yaşıyorum. Düzeltme neydi? – bahramzy

cevap

29

yardımcı:

using (var context = new PrincipalContext(ContextType.Domain, Environment.UserDomainName)) 
PrincipalContext (ContextType.Domain) yalnızca kullanıcı grupları UserPrincipal bulmak için çalışıyor ve neden hala bilmiyorum

. COM hata iletisi "bilinmeyen hata" çok yararlı değildir ve yalnızca ContextType ile PrincipalContext yapıcısı aşırı yükleme hemen hemen MSDN'de belgelenmemiş. Harvey Kwok tarafından işaret edilen .NET çerçevesiyle ilgili bir sorun gibi kokuyor.

+0

Geçerli kullanıcı üye olmadığında, 'UserPrincipal.IsMemberOf (GroupPrincipal) 'çağrısından tam olarak aynı sonucu aldım. Gerçekten, 'PrincipalContext (ContextType, string) 'kurucusunu kullanmak dahili sorunu çözer! – Astrogator

+0

Ayrıca, bu tam bir sorun vardı. "HRESULT 0x80072030" ile "DirectoryServicesCOMException" öğesini rasgele bir şekilde atar veya "uint" den "int" ye dönüştürülür. .ErrorCode == -2147016656'. Yalnızca üretimde değil, AD'ye yavaş bağlantı ile dev VM'lerde de değil. 'PrincipalContext (ContextType, string) '.ctor kullanıldığında sorun çözülmüştür. –