2012-05-15 9 views
23

के साथ उपयोगकर्ताओं को ढूंढने के लिए प्रिंसिपलशियर का उपयोग करना "या" (नहीं "और") का उपयोग करके एकाधिक पैरामीटर के आधार पर खोज करने के लिए System.DirectoryServices.AccountManagement.PrincipalSearcher का उपयोग करना संभव है।"या" पैरामीटर

यानी

// This uses an and 
//(&(objectCategory=person)(!UserAccountControl:1.2.840.113556.1.4.803:=2)(&(SAMAccountName=tom*)(DisplayName=tom*))) 
var searchPrinciple = new UserPrincipal(context); 
searchPrinciple.DisplayName = "tom*"; 
searchPrinciple.SamAccountName = "tom*"; 

var searcher = new PrincipalSearcher(); 
searcher.QueryFilter = searchPrinciple; 

var results = searcher.FindAll(); 

और मैं (LDAP में), एक खोज इस के समान PrincipalSearcher (नहीं DirectorySearcher)

// (&(objectCategory=person)(!UserAccountControl:1.2.840.113556.1.4.803:=2)(|(SAMAccountName=tom*)(DisplayName=tom*))) 

उत्तर

-4

FindAll विधि का उपयोग करना चाहते हैं डोमेन प्रिंसिपल में निर्दिष्ट खोज संदर्भ उन ऑब्जेक्ट्स के लिए जिनके पास क्वेरी फ़िल्टर पर सेट किए गए समान गुण हैं। FindAll विधि उन सभी ऑब्जेक्ट्स को लौटाती है जो आपूर्ति ऑब्जेक्ट से मेल खाते हैं जबकि FindOne विधि केवल एक ही मिलान करने वाली प्रमुख वस्तु को लौटाती है। http://msdn.microsoft.com/en-us/library/bb384378(v=vs.90).aspx

मैं आपको क्या चाहिए पता नहीं है, लेकिन आप अन्य द्वारा 1 प्रॉपर्टी और 1 से कोई खोज करते हैं और फिर विलय करने के लिए, फिल्टर और आदि सूची में LINQ इस्तेमाल कर सकते हैं ...

+0

हाँ, इस समाधान मैं वर्तमान में उपयोग कर रहा हूँ है, मैं वहाँ उम्मीद थी एक होगा एक खोज में, इसे और अधिक साफ करने का तरीका। हालांकि धन्यवाद। – doobist

13

यह abviously संभव नहीं है, यहाँ एक workarround है:

List<UserPrincipal> searchPrinciples = new List<UserPrincipal>(); 
searchPrinciples.Add(new UserPrincipal(context) { DisplayName="tom*"}); 
searchPrinciples.Add(new UserPrincipal(context) { SamAccountName = "tom*" }); 
searchPrinciples.Add(new UserPrincipal(context) { MiddleName = "tom*" }); 
searchPrinciples.Add(new UserPrincipal(context) { GivenName = "tom*" }); 

List<Principal> results = new List<Principal>(); 
var searcher = new PrincipalSearcher(); 
foreach (var item in searchPrinciples) 
{ 
    searcher = new PrincipalSearcher(item); 
    results.AddRange(searcher.FindAll()); 
} 
+2

आपको इसका उपयोग करके डुप्लिकेट को संभालना होगा। यदि डिस्प्ले नाम, दिया गया नाम और खाता नाम सभी में "टॉम" नाम होता है तो आपके पास डुप्लीकेट होंगे। –

+0

मैं इसे भी चाहता था, हालांकि कई प्रश्नों के बिंदु पर यह काफी कम प्रदर्शनकारी है? मुझे आश्चर्य है कि मुझे डायरेक्टरीशियर पर वापस क्यों नहीं आना चाहिए यदि इसे प्रिंसिपलशियर – PandaWood

4

नहीं जरूरी अन्य उत्तर में से कुछ के रूप में के रूप में स्वच्छ लेकिन यहाँ कैसे मैं एक परियोजना मैं पर काम कर रहा हूँ में यह इसलिए लगाए गए हैं। मैं चाहता था कि दो खोजों को चलाने के कारण दोनों धीमी गति से कोशिश करने और कम करने के लिए दोनों खोजों को एसिंक चलाया जाए।

public async static Task<List<ADUserEntity>> FindUsers(String searchString) 
{ 
    searchString = String.Format("*{0}*", searchString); 
    List<ADUserEntity> users = new List<ADUserEntity>(); 

    using (UserPrincipal searchMaskDisplayname = new UserPrincipal(domainContext) { DisplayName = searchString }) 
    using (UserPrincipal searchMaskUsername = new UserPrincipal(domainContext) { SamAccountName = searchString }) 
    using (PrincipalSearcher searcherDisplayname = new PrincipalSearcher(searchMaskDisplayname)) 
    using (PrincipalSearcher searcherUsername = new PrincipalSearcher(searchMaskUsername)) 
    using (Task<PrincipalSearchResult<Principal>> taskDisplayname = Task.Run<PrincipalSearchResult<Principal>>(() => searcherDisplayname.FindAll())) 
    using (Task<PrincipalSearchResult<Principal>> taskUsername = Task.Run<PrincipalSearchResult<Principal>>(() => searcherUsername.FindAll())) 
    { 
     foreach (UserPrincipal userPrincipal in (await taskDisplayname).Union(await taskUsername)) 
      using (userPrincipal) 
      { 
       users.Add(new ADUserEntity(userPrincipal)); 
      } 
    } 

    return users.Distinct().ToList(); 
} 

मेरी एड्यूसर एंटीटी कक्षा में एसआईडी के आधार पर समानता जांच है। मैंने दो खोजकर्ता परिणामों के Union() पर Distinct() जोड़ने की कोशिश की लेकिन यह काम नहीं किया।

मैं अपने उत्तर पर किसी भी रचनात्मक आलोचना का स्वागत करता हूं क्योंकि मैं जानना चाहता हूं कि क्या कोई तरीका है जिससे मैं इसे सुधार सकता हूं।

+1

के साथ नहीं किया जा सकता है, केवल विशिष्ट उपयोगकर्ताओं को लौटने के लिए, आप LINQ का उपयोग पहचानकर्ता (उदाहरण के लिए एसआईडी) द्वारा समूह में कर सकते हैं: 'वापसी उपयोगकर्ताओं को बदलें। डिस्टिंट()। टोलिस्ट(); 'वापसी उपयोगकर्ताओं के साथ। समूह (उपयोगकर्ता => उपयोगकर्ता.आईडी)। चयन करें (समूह => समूह। फर्स्ट())। ToList();' –

-4
PrincipalContext pContext = new PrincipalContext(ContextType.Machine, Environment.MachineName); 
GroupPrincipal gp = GroupPrincipal.FindByIdentity(pContext, "Administrators"); 
bool isMember = UserPrincipal.Current.IsMemberOf(gp); 
3

मैं जानता हूँ कि इस की देर तरह है, लेकिन इस निर्माण जब ई खोज रहा उपयोग करते हैं:

public static Task<IEnumerable<SomeUserModelClass>> GetUsers(//Whatever filters you want) 
{ 
    return Task.Run(() => 
    { 
     PrincipalContext context = new PrincipalContext(ContextType.Domain); 
     UserPrincipal principal = new UserPrincipal(context); 
     principal.Enabled = true; 
     PrincipalSearcher searcher = new PrincipalSearcher(principal); 

     var users = searcher.FindAll().Cast<UserPrincipal>() 
      .Where(x => x.SomeProperty... // Perform queries) 
      .Select(x => new SomeUserModelClass 
      { 
       userName = x.SamAccountName, 
       email = x.UserPrincipalName, 
       guid = x.Guid.Value 
      }).OrderBy(x => x.userName).AsEnumerable(); 

     return users; 
    }); 
} 
+0

आप मूल रूप से पूरी निर्देशिका पढ़ रहे हैं, और ग्राहक में फ़िल्टरिंग प्रदर्शन। यह किसी भी मध्यम आकार की निर्देशिका और बड़े के लिए स्केल नहीं करेगा। –

+0

मैंने खोज निष्पादित करने से पहले, उपयोगकर्ता प्रिंसिपल ऑब्जेक्ट पर फ़िल्टर करने और खोज के दायरे को एक विशिष्ट प्रारंभिक ओयू तक सीमित करने के बाद जोड़ा है। –

संबंधित मुद्दे