2009-08-19 10 views
20

में सक्रिय निर्देशिका उपयोगकर्ता बनाएँ सक्रिय निर्देशिका में मुझे एक नया उपयोगकर्ता बनाने की आवश्यकता है। मैं निम्नलिखित की तरह कई उदाहरण मिल गया है:.NET (C#)

using System; 
using System.DirectoryServices; 

namespace test { 
    class Program { 
     static void Main(string[] args) { 
     try { 
      string path = "LDAP://OU=x,DC=y,DC=com"; 
      string username = "johndoe"; 

      using (DirectoryEntry ou = new DirectoryEntry(path)) { 
       DirectoryEntry user = ou.Children.Add("CN=" + username, "user"); 

       user.Properties["sAMAccountName"].Add(username); 

       ou.CommitChanges(); 
      } 
     } 
     catch (Exception exc) { 
      Console.WriteLine(exc.Message); 
     } 
     } 
    } 
} 

मुझे इस कोड मैं कोई त्रुटि मिल चलाने के लिए, लेकिन कोई नया उपयोगकर्ता बनाए।

जिस खाते में मैं परीक्षण चला रहा हूं उसके पास लक्ष्य संगठनात्मक इकाई में उपयोगकर्ता बनाने के लिए पर्याप्त विशेषाधिकार हैं।

क्या मुझे कुछ याद आ रहा है (संभवतः उपयोगकर्ता ऑब्जेक्ट की कुछ आवश्यक विशेषता)?

कोई विचार क्यों कोड अपवाद नहीं देता है?

संपादित
मेरे लिए काम किया है:

  1. CommitChanges पर user (धन्यवाद रोब) बुलाया जाना चाहिए
  2. :

    int NORMAL_ACCOUNT = 0x200; 
    int PWD_NOTREQD = 0x20; 
    DirectoryEntry user = ou.Children.Add("CN=" + username, "user"); 
    user.Properties["sAMAccountName"].Value = username; 
    user.Properties["userAccountControl"].Value = NORMAL_ACCOUNT | PWD_NOTREQD; 
    user.CommitChanges(); 
    

    तो वहाँ वास्तव में समस्याओं के एक जोड़े थे पासवर्ड नीति उपयोगकर्ता को बनाने के लिए रोक रही थी (धन्यवाद मार्क)

उत्तर

16

मुझे लगता है कि आप गलत DirectoryEntry पर CommitChanges बुला रहे हैं।MSDN प्रलेखन (http://msdn.microsoft.com/en-us/library/system.directoryservices.directoryentries.add.aspx) में यह कहा गया है निम्नलिखित (मेरे द्वारा अतिरिक्त बल)

आप निर्माण स्थायी बनाने के लिए नई प्रविष्टि पर CommitChanges विधि कॉल करना होगा। जब आप इस विधि को कॉल करते हैं, तो आप नई प्रविष्टि पर अनिवार्य संपत्ति मान सेट कर सकते हैं। प्रत्येक प्रदाता के पास गुणों के लिए अलग-अलग आवश्यकताएं होती हैं जिन्हें CommitChanges विधि में कॉल करने से पहले सेट करने की आवश्यकता होती है। यदि उन आवश्यकताओं को पूरा नहीं किया जाता है, तो प्रदाता एक अपवाद फेंक सकता है। परिवर्तन करने से पहले कौन से गुण सेट किए जाने चाहिए यह निर्धारित करने के लिए अपने प्रदाता से जांचें।

तो तुम user.CommitChanges() यह काम करना चाहिए, तो आप सिर्फ खाता नाम से भी अधिक गुणों को सेट करने की जरूरत है तो आप एक अपवाद मिलना चाहिए करने के लिए अपने कोड परिवर्तित करते हैं।

चूंकि आप वर्तमान में ओयू पर CommitChanges() को कॉल कर रहे हैं, जिसे बदला नहीं गया है, इसमें कोई अपवाद नहीं होगा।

+0

अच्छा पकड़ !! :-) –

+1

कार्रवाई में "मैनुअल" पढ़ने की शक्ति :) – balexandre

8

अपने OU पथ OU=x,DC=y,DC=com मान लिया जाये कि वास्तव में मौजूद है - यह :-)

चीजें काम की जांच करने चाहिए:

  • आप "SAMAccountName" के लिए मान जोड़ने - क्यों नहीं करते

    user.Properties["sAMAccountName"].Value = username; 
    

नहीं तो आप Sever के साथ खत्म हो सकता है: तुम सिर्फ अपने मूल्य सेट अल samAccountNames - और कि काम नहीं करेगा .....

  • आप कुछ भी करने के लिए userAccountControl संपत्ति की स्थापना नहीं कर रहे हैं - का उपयोग करके देखें:

    user.Properties["userAccountControl"].Value = 512; // normal account 
    
  • आप में एक से अधिक डोमेन नियंत्रकों की क्या ज़रूरत है आपका संगठन? यदि आप, और आप इस "सर्वर-कम" बाध्यकारी (एलडीएपी पथ में किसी भी सर्वर को निर्दिष्ट नहीं करते) का उपयोग कर रहे हैं, तो आप आश्चर्यचकित हो सकते हैं कि उपयोगकर्ता कहां बनाया जाता है :-) और इसमें आधे घंटे तक कई मिनट लगेंगे पूरे नेटवर्क में सिंक्रनाइज़ करने के लिए

  • क्या आपके पास सख्त पासवर्ड नीति है? शायद यह समस्या है। मुझे याद है कि हमें उपयोगकर्ता को "पासवर्ड की आवश्यकता नहीं है" विकल्प के साथ पहले बनाना होगा, पहले करें। कॉमिट चेंज(), फिर एक शक्तिशाली पर्याप्त पासवर्ड बनाएं, इसे उपयोगकर्ता पर सेट करें, और उस उपयोगकर्ता विकल्प को हटा दें।

मार्क

0

चेक नीचे कोड

DirectoryEntry ouEntry = new DirectoryEntry("LDAP://OU=TestOU,DC=TestDomain,DC=local"); 

     for (int i = 3; i < 6; i++) 
     { 
      try 
      { 
       DirectoryEntry childEntry = ouEntry.Children.Add("CN=TestUser" + i, "user"); 
       childEntry.CommitChanges(); 
       ouEntry.CommitChanges(); 
       childEntry.Invoke("SetPassword", new object[] { "password" }); 
       childEntry.CommitChanges(); 
      } 
      catch (Exception ex) 
      { 

      } 
     }