2012-09-07 17 views
5

यदि स्थानीय उपयोगकर्ता खाता (यानी स्थानीय प्रशासक खाता) सक्रिय है तो मैं सी # से कैसे जांच सकता हूं?यदि उपयोगकर्ता खाता सक्रिय है तो C# में जांचें

जो मैं वास्तव में चाहता हूं वह "नेट उपयोगकर्ता प्रशासक" आदेश से "खाता सक्रिय" = "हां" (या "नहीं") आउटपुट के लिए सी # प्रतिस्थापन है।

मुझे डर है कि यह प्रश्न this पर डुप्लिकेट जैसा दिखता है, लेकिन मुझे नहीं पता कि रूट DirectoryEntry ऑब्जेक्ट के पैरामीटर के लिए क्या पास करना है। "Ldap: //" + Environment.MachineName, "ldap: //127.0.0.1", "WinNT: //" + Environment.MachineName जैसी विभिन्न चीजों का प्रयास किया, लेकिन उनमें से कोई भी काम नहीं किया। मुझे खोजकर्ता द्वारा फेंक दिया गया अपवाद मिलता है। FindAll() सभी तीन मामलों में कॉल करें।

+0

पाने के लिए क्या अपवाद आप हो रही है 2 के स्तर पैरामीटर को बदलने की जरूरत? – BlackICE

+0

"ldap: //" + पर्यावरण के साथ। माचिननाम मुझे संदेश के साथ एक कॉमेक्सप्शन मिलता है "सर्वर परिचालन नहीं है।" और त्रुटि कोड = -2147016646। "Ldap: //127.0.0.1" के साथ ही। – candritzky

+0

"WinNT: //" + Environment.MachineName के साथ मुझे संदेश के साथ एक असमर्थित अपवाद प्राप्त होता है "प्रदाता खोज का समर्थन नहीं करता है और WinNT: // नहीं खोज सकता।" – candritzky

उत्तर

5
class Program 
{ 
    static void Main(string[] args) 
    { 

     // Create the context for the principal object. 
     PrincipalContext ctx = new PrincipalContext(ContextType.Machine); 

     UserPrincipal u = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "Administrator"); 
     Console.WriteLine(String.Format("Administrator is enable: {0}", u.Enabled)); 

    } 
} 
+0

धन्यवाद, यह भी काम करता है। लेकिन FindByIdentity कॉल को परिणाम देने से पहले कई सेकंड लगते हैं। हालांकि यह अच्छा कोड है, यह प्रदर्शन परिप्रेक्ष्य से सबसे अच्छा समाधान नहीं है। – candritzky

+0

मैंने देखा कि साथ ही, लेकिन मुझे लगता है कि कुछ ओवरहेड कनेक्शन खोल रहा है या ऐसा कुछ है, क्योंकि जब मैंने बाद के प्रश्नों को देखा तो वे बहुत तेज थे। – BlackICE

1

आप क्वेरी कर सकता है WMI के Win32_UserAccount

यह बॉयलरप्लेट क्या एमएस के WMI कोड निर्माता एक संदर्भ के रूप में बाहर थूक है;

using System; 
using System.Management; 
using System.Windows.Forms; 

namespace WMISample 
{ 
    public class MyWMIQuery 
    { 
     public static void Main() 
     { 
      try 
      { 
       ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT Disabled FROM Win32_UserAccount WHERE name = 'alexk'"); 

       foreach (ManagementObject queryObj in searcher.Get()) 
       { 
        Console.WriteLine("-----------------------------------"); 
        Console.WriteLine("Win32_UserAccount instance"); 
        Console.WriteLine("-----------------------------------"); 
        Console.WriteLine("Disabled: {0}", queryObj["Disabled"]); 
        Console.ReadKey(); 
       } 
      } 
      catch (ManagementException e) 
      { 
       MessageBox.Show("An error occurred while querying for WMI data: " + e.Message); 
      } 
     } 
    } 
} 

(मैं उपकरण चाहेंगे लेकिन हमेशा की तरह MSDN लिंक मर चुके हैं)

+0

उसने ऐसा किया! मुझे स्थानीय डोमेन खातों में परिणामों को प्रतिबंधित करने के लिए WMI क्वेरी में "डोमेन = '" + पर्यावरण। माचिननाम + "'" जोड़ना पड़ा, लेकिन फिर यह काम करता है। आपका बहुत बहुत धन्यवाद! – candritzky

0

This से भिन्न है, लेकिन वे DirectoryEntry directoryEntry = new DirectoryEntry(string.Format("WinNT://{0}/{1}", computerName, username)); का उपयोग करें कि मदद मिलेगी?

+0

नहीं, काम नहीं करता है। एक खाली परिणाम सेट देता है। – candritzky

1

इसे आजमाएं।

var server = "YOURMACHINENAME"; 
var username = "Guest"; 
var de = new DirectoryEntry {Path = "WinNT://" + server + ",computer"}; 
var result = de.Children 
    .Cast<DirectoryEntry>() 
    .First<DirectoryEntry>(d => d.SchemaClassName == "User" && d.Properties["Name"].Value.ToString() == username); 

var flags = (int)result.Properties["UserFlags"].Value; 
var disabled = (flags & 2) == 2; 
+0

पूरी तरह से काम करता है। धन्यवाद! – candritzky

0

ध्यान में रखते हुए यह एक स्थानीय उपयोगकर्ता है, तो आप आपको क्या चाहिए पाने के लिए Win32 एपीआई funcion NetGetUserInfo कॉल करने के लिए की जरूरत है।

pinvoke.net में उदाहरण है लगभग कि तुम क्या जरूरत है, फिर भी आप neccesary info

+0

धन्यवाद। यह भी काम कर सकता है। अभी तक कोशिश नहीं की है। मुझे लगता है कि आप USER_INFO_2.usri2_flags फ़ील्ड (UF_ACCOUNTDISABLE) का जिक्र कर रहे हैं। हालांकि मैं बेहतर पी/Invoke से बचने और एक शुद्ध सी # डब्ल्यूएमआई या एलडीएपी समाधान के साथ चिपकने के लिए बेहतर होगा। – candritzky

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