2016-04-04 23 views
1

Bir etki alanı kullanıcı makinelerinin üyesi yöneticilerine olup olmadığını kontrol etmek bazı kodlar var grubu:Yavaş AD grup üyeliği arama

public static bool ActiveDirectoryGroupMembershipOk(string userid, string groupName) 
{ 
    using (PrincipalContext ctx = new PrincipalContext(ContextType.Machine, "my_pc_name")) 
    { 
     using (GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "administrators")) 
     { 
      if (grp != null) 
      { 
       foreach (Principal p in grp.GetMembers(false)) 
       { 
        if (p is UserPrincipal && p.SamAccountName.Equals(userid, StringComparison.InvariantCultureIgnoreCase)) 
        { 
         return true; 
        } 
       } 
      } 
     } 
    } 
    return false; 
} 

Çalışır, ancak aşağıdaki kod satırı tamamlamak için biraz saniye sürer:

using (GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "administrators")) 

Üyelik aramanın daha hızlı bir yolu var mı?

Önemli mi, önemsiz mi bilmiyorum, ancak userid bir Etki Alanı Kullanıcısıdır ve windows grubu yerel bilgisayar üzerindedir.

+0

Benim deneyimimdeki AD her zaman yavaştır, bu yüzden sonuçları önbelleğe alma eğilimindeyim. Sizin durumunuzda, bir global global değişken grp kullanırım ve FindByidentity'yi bir kere – Pikoh

+0

numaralı telefondan ararım. Yani bu benim ilk isteğim, bu yavaş. Bir grubun üyeleri yerine kullanıcının üyeliklerine bakmakla ilgili farklı bir yazı okudum - bu daha hızlı olabilirdi. [Link] (http://stackoverflow.com/questions/1675813/faster-way-to-find-out-if-a-user-exists-on-a-system) Ancak bu kodu işe yaratamadım. –

cevap

0

Kullanıcıyı bir grupta aramaktan ziyade kullanıcının rol üyeliğini kontrol etmenin daha hızlı görüneceğini gördüm. Sn Sarışın'ın cevabın bir parçasını kullanıyor (AD etki alanını varsayarak) hala bunu yapmak için daha iyi bir yol bulmuş

public static bool ActiveDirectoryGroupMembershipOk(string userid, string groupName) 
{ 
    bool membershipOk = false; 
    using (var pc = new PrincipalContext(ContextType.Machine, "my_pc_name")) 
    { 
     using (var p = Principal.FindByIdentity(pc, IdentityType.SamAccountName, userid)) 
     { 
      // if user account exists, check the group membership 
      if(p != null) 
      { 
       System.Security.Principal.WindowsIdentity wi = new System.Security.Principal.WindowsIdentity(userid); 
       System.Security.Principal.WindowsPrincipal wp = new System.Security.Principal.WindowsPrincipal(wi); 
       membershipOk = wp.IsInRole(groupName); 
      } 
     } 
    } 
    return membershipOk; 
} 
0

: Burada

benim söz konusu kodun daha hızlı gerçekleştirir koddur