2013-05-15 7 views
12

मैं यह निर्धारित करने की कोशिश कर रहा हूं कि एडी में कोई उपयोगकर्ता खाता सक्षम है या नहीं।क्यों UserPrincipal.Enabled अलग-अलग मान देता है?

string domain = "my domain"; 
string group = "my security group"; 
string ou = "my OU"; 

//init context 
using (var cnt= new PrincipalContext(ContextType.Domain, domain)) 
{ 
    //find the necessary security group 
    using (GroupPrincipal mainGroup 
       = GroupPrincipal.FindByIdentity(cnt, IdentityType.Guid, group)) 
    { 
     if (mainGroup != null) 
     { 
      //get the group's members 
      foreach (var user in mainGroup.GetMembers() 
            .OfType<UserPrincipal>() 
            .Where(u => u.DistinguishedName.Contains(ou))) 
      { 
       //ensure that all the info about the account is loaded 
       //by using FindByIdentity as opposed to GetMembers 
       var tmpUser= UserPrincipal.FindByIdentity(cnt, 
                  user.SamAccountName); 
       //actually I could use `user` variable, 
       //as it gave the same result as `tmpUser`. 

       //print the account info 
       Console.WriteLine(tmpUser.Name + "\t" + 
            tmpUser.Enabled.HasValue + "\t" + 
            tmpUser.Enabled.Value);      
      } 
     } 
    } 
} 

समस्या है, जब मैं एक प्रशासनिक खाते के अंतर्गत इस कोड चलाने के लिए, मैं वास्तविक परिणाम प्राप्त है, जबकि जब मैं यह एक गैर priviledged खाते के अंतर्गत चलाने के लिए, user.Enabled रिटर्न false: इसके लिए मैं निम्नलिखित कोड का उपयोग कुछ खातों के लिए, जबकि यह true होना चाहिए।

केवल समान क्ष & मैं खोज करने में कामयाब एक

  1. UserPrincipal.Enabled returns False for accounts that are in fact enabled?
  2. Everything in Active Directory via C#.NET 3.5 (Using System.DirectoryServices.AccountManagement)

जो यहाँ मदद नहीं कर रहे हैं।

ऐसा क्यों है? इस जानकारी को गैर-निजीकृत खाते के तहत प्राप्त करने के मेरे विकल्प क्या हैं?


यहाँ एक और तरीका है: How to determine if user account is enabled or disabled:

private bool IsActive(DirectoryEntry de) 
{ 
    if (de.NativeGuid == null) 
     return false; 

    int flags = (int)de.Properties["userAccountControl"].Value; 

    if (!Convert.ToBoolean(flags & 0x0002)) 
     return true; 
    else 
     return false; 
} 

एक ही दृष्टिकोण Active Directory Objects and C# में वर्णित है।

हालांकि एक अप्रतिबंधित उपयोगकर्ता खाते के तहत चलते समय, userAccountControl विशेषता null है और खाते की स्थिति निर्धारित करना संभव नहीं है।


वैकल्पिक हल यहाँ PrincipalContext Constructor उपयोग करने के लिए, ई का उपयोग करने के लिए पर्याप्त विशेषाधिकार के साथ एक उपयोगकर्ता की साख को निर्दिष्ट है।

यह मेरे लिए अस्पष्ट रहता है, क्यों गैर-वंचित उपयोगकर्ता को एडी तक पहुंच थी, और कुछ निश्चित खाता विशेषताओं के मूल्य नहीं मिल सके। शायद इसका सी # के साथ कुछ लेना देना नहीं है, और इसे एडी में कॉन्फ़िगर किया जाना चाहिए ...

उत्तर

1

आपको उन खातों के लिए सक्रिय निर्देशिका में अनुमतियां सौंपनी होगी जो एडी प्रश्नों का पालन करेंगे। मेरे अनुप्रयोगों के काम करने के लिए मुझे यही करना था (हालांकि हम उपयोगकर्ता खातों पर अन्य प्रशासनिक कार्य कर रहे हैं)।

अनुमतियों को प्रतिनिधि कैसे करें (या नीचे ब्लॉकक्वाट देखें) के निर्देशों के लिए Here देखें।

  • निम्नलिखित चरणों को करके नियंत्रण जादूगर के प्रतिनिधिमंडल शुरू:
    • ओपन सक्रिय निर्देशिका उपयोगकर्ताओं और कंप्यूटर

      आप प्रतिनिधिमंडल को चलाने के लिए निम्न प्रक्रिया में भेजा सकता है।

    • कंसोल पेड़ में, डोमेन नोड पर डबल क्लिक करें।
    • विवरण मेनू में, संगठनात्मक इकाई पर राइट क्लिक करें, प्रतिनिधि नियंत्रण पर क्लिक करें, और अगला क्लिक करें।
    • उन उपयोगकर्ताओं या समूह का चयन करें जिन्हें आप आम प्रशासनिक कार्यों का प्रतिनिधि बनाना चाहते हैं।ऐसा करने के लिए, निम्न चरणों का पालन करें:
    • उपयोगकर्ता या समूह पृष्ठ पर, जोड़ें पर क्लिक करें।
    • चुनिंदा उपयोगकर्ता, कंप्यूटर या समूह में, उन उपयोगकर्ताओं और समूहों के नाम लिखें जिन पर आपको संगठनात्मक इकाई के नियंत्रण का प्रतिनिधि होना है, ठीक क्लिक करें। और अगला क्लिक करें।
    • प्रतिनिधि कार्यों को असाइन करने के लिए असाइन करें। ऐसा करने के लिए निम्नलिखित सामान्य कार्य करें।
    • कार्यों को डिलीग करने के कार्यों पर, निम्न सामान्य कार्यों को प्रतिनिधि पर क्लिक करें।
    • पृष्ठ को प्रतिनिधि देने के कार्यों पर, उन कार्यों का चयन करें जिन्हें आप प्रतिनिधि बनाना चाहते हैं, और ठीक क्लिक करें। उदाहरण के लिए समाप्त

क्लिक करें: उपयोगकर्ता/कंप्यूटर वस्तुओं को स्थानांतरित करने के लिए व्यवस्थापक को सौंपने के लिए, आपको ई उपयोगकर्ता और कंप्यूटर में अग्रिम मोड का उपयोग करें और प्रतिनिधिमंडल चला सकते हैं। ऑब्जेक्ट चलने के लिए इसमें ओयू दोनों में लेखन विशेषाधिकार होना चाहिए। नए मूल्यों को लिखने के लिए, प्रशासकों खाता उपयोगकर्ता खाते पर मूल्यों सौंप दिया जाना चाहिए (विशिष्ट OU में पूर्ण विशेषाधिकार के रूप में अच्छी तरह से। यदि खातों userAccountControl विशेषता बाकी

कुछ में देख लायक है। मुझे लगता है कि सुना है इस विशेषता को खोने वाले खाते सही ढंग से रिपोर्ट नहीं कर सकते हैं। अधिकांश परिदृश्यों में यह विशेषता NormalAccount पर सेट की जानी चाहिए।

+0

यदि आप अपने लिंक से सटीक निर्देश जोड़ सकते हैं, तो आपका उत्तर टूटा लिंक होने से बेहतर और सुरक्षित होगा! – ForceMagic

+1

धन्यवाद। लिंक से प्रासंगिक जानकारी के ब्लॉकक्वाट जोड़ा गया। –

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