2009-11-04 33 views
7

मेरे पास एक ऐसा एप्लिकेशन है जो यह देखने के लिए जांचता है कि उपयोगकर्ता कब शुरू होता है (यदि इसे नहीं बनाया जाता है) हर बार शुरू होता है। यह निम्नानुसार किया जाता है:यह पता लगाने का तेज़ तरीका है कि कोई उपयोगकर्ता सिस्टम पर मौजूद है या नहीं?

bool bUserExists = false; 
DirectoryEntry dirEntryLocalMachine = 
    new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer"); 

DirectoryEntries dirEntries = dirEntryLocalMachine.Children; 

foreach (DirectoryEntry dirEntryUser in dirEntries) 
{ 
    bUserExists = dirEntryUser.Name.Equals("UserName", 
     StringComparison.CurrentCultureIgnoreCase); 

    if (bUserExists) 
     break; 
} 

समस्या अधिकांश सिस्टमों पर है जहां इसे तैनात किया गया है। इसमें 6-10 सेकंड लग सकते हैं, जो बहुत लंबा है ... मुझे इसे कम करने के लिए एक रास्ता खोजने की जरूरत है (जितना संभव हो सके)। क्या बेहतर या तेज जिस तरह से मैं यह सत्यापित करने के लिए उपयोग कर सकता हूं कि कोई उपयोगकर्ता सिस्टम पर मौजूद है या नहीं?

मुझे पता है कि इसे हल करने के अन्य तरीके हैं, जैसे अन्य अनुप्रयोग 10 सेकंड के लिए सोते हैं, या यह उपकरण तैयार होने पर एक संदेश भेजता है, आदि ... लेकिन अगर मैं उस समय को बहुत कम कर सकता हूं उपयोगकर्ता को खोजने के लिए, यह मेरे जीवन को और अधिक आसान बना देगा।

+0

आप मशीन पर एक स्थानीय उपयोगकर्ता के लिए देख रहे हैं? –

+0

हाँ - केवल स्थानीय उपयोगकर्ता – Shaitan00

+0

क्या आपके उपयोगकर्ता को स्टार्टअप समाप्त होने से पहले मौजूद होना चाहिए? –

उत्तर

20

.NET 3.5 सिस्टम के अंतर्गत नई AD क्वेरीिंग कक्षाओं का समर्थन करता है। निर्देशिका सेवा। खाता प्रबंधन नामस्थान।

इसका उपयोग करने के लिए, आपको संदर्भ के रूप में "System.DirectoryServices.AccountManagement" जोड़ना होगा और using कथन जोड़ें।

using System.DirectoryServices.AccountManagement; 


using (PrincipalContext pc = new PrincipalContext(ContextType.Machine)) 
{ 
    UserPrincipal up = UserPrincipal.FindByIdentity(
     pc, 
     IdentityType.SamAccountName, 
     "UserName"); 

    bool UserExists = (up != null); 
} 

< .NET 3.5

नेट के संस्करण 3.5 से पहले के लिए, यहाँ एक साफ उदाहरण शीघ्र रिटर्न 1 एक आदेश में निम्नलिखित मैं dotnet-snippets

DirectoryEntry dirEntryLocalMachine = 
    new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer"); 

bool UserExists = 
    dirEntryLocalMachine.Children.Find(userIdentity, "user") != null; 
+0

दुख की बात है कि मैं .NET 3.5 का उपयोग नहीं कर सकता, मैं .NET 2.0 के साथ फंस गया हूं ... क्या समकक्ष है? – Shaitan00

+0

मैंने अपने उत्तर को अपडेट किया है जिसमें आप जो खोज रहे हैं उस पर एक महान लेख शामिल करें। यह आपकी वर्तमान विधि के समान ही है, लेकिन प्रत्येक ऑब्जेक्ट के माध्यम से गणना करने के बजाय, यह बच्चों का उपयोग करता है। ढूँढें() फ़ंक्शन। कृपया लिंक पर क्लिक करें क्योंकि लेख को संभालने के लिए आलेख में एक पूर्ण वर्ग है और यह बहुत अच्छा है। –

+0

यह काम करता है - लेकिन केवल इतना समय लगता है ... – Shaitan00

1

पर पाया है यदि 'उपयोगकर्ता नाम' मौजूद है।

नेट उपयोगकर्ता | "उपयोगकर्ता नाम"/सी

+1

यह पता लगाने के साथ क्या करना है कि कोई उपयोगकर्ता सी # में मौजूद है या नहीं? –

+0

इसका उपयोग सी # द्वारा किया जा सकता है, लेकिन मुझे डर है कि यह सबसे साफ समाधान नहीं है। – Henri

+0

मैं नेट उपयोगकर्ता का उपयोग करने के लिए spawning कमांड शैल शुरू नहीं करना चाहता, सी # के साथ कुछ बेहतर होगा। – Shaitan00

5

आप निर्देशिका खोजकर्ता का उपयोग करना चाहते हैं।

कुछ इस तरह:

static bool userexists(string strUserName) { 
    string adsPath = string.Format(@"WinNT://{0}", System.Environment.MachineName); 
    using(DirectoryEntry de = new DirectoryEntry(adsPath)) { 
     try { 
      return de.Children.Find(strUserName) != null; 
     } catch(Exception e) { 
      return false; 
     } 
    } 
} 

कि जल्दी होना चाहिए। साथ ही, यदि आप जो कुछ भी कर रहे हैं वह अस्तित्व की जांच कर रहा है तो आप गुणों को कम कर सकते हैं।

+0

यह एक तेज़ तरीका है और यह 3.5 से पहले .NET संस्करणों के साथ काम करता है (यदि यह आपका पर्यावरण है)। –

+0

परिणाम सेट कहां है? – Shaitan00

+0

मैं निर्देशिका एंटर्री (सक्रिय निर्देशिका और सामान) से परिचित नहीं हूं, जो कि 100% निश्चित होने के लिए गुणों की आवश्यकता नहीं है, यदि उपयोगकर्ता के पास केवल उपयोगकर्ता नाम है, तो उपयोगकर्ता पहले से मौजूद नहीं है? – Shaitan00

0

यह करना चाहिए (आप System.DirectoryServices.AccountManagement उपयोग नहीं कर सकते जब):

static bool userExists(string sUser) 
{ 
    using (var oUser = new DirectoryEntry("WinNT://" + Environment.MachineName + "/" + sUser + ",user")) 
    { 
     return (oUser != null); 
    } 
} 
संबंधित मुद्दे

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