2010-04-11 7 views
6

एक विस्टा देव मशीन मैं इस कोड सफलतापूर्वक इस्तेमाल उपयोगकर्ता को बदलने के लिए पर "व्यवस्थापक" पासवर्ड:DirectoryEntry पासवर्ड बदलने के लिए: विस्टा/Server2008 के बीच अलग-अलग व्यवहार

directoryEntry.Invoke("SetPassword", "new"); 

जब मैं इसे अपने सर्वर 2008 देव मशीन पर स्थानांतरित कर दी वह कोड काम नहीं करता था, और मुझे निम्नलिखित कोड का उपयोग करने के लिए मजबूर किया गया था:

directoryEntry.Invoke("ChangePassword", new object[] { "old", "new" }); 

मेरा प्रश्न है, क्यों?

दोनों ही मामलों के लिए, मैं इस तरह के रूप में मेरे DirectoryEntry वस्तु बनाया:

DirectoryEntry directoryEntry = new DirectoryEntry(string.Format("WinNT://{0}/{1}", computerName, username)); 

धन्यवाद! 8)

यदि आप लोगों को यह उपयोगी लगता है, तो वास्तविक कोड है।

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Diagnostics; 
using System.DirectoryServices; 
using System.Security.Principal; 

namespace AccountMod 
{ 
    class Program 
    { 
     static void Main() 
     { 
      Console.WriteLine("Attempting reset...\n"); 
      try 
      { 
       String machineNameAndUser = WindowsIdentity.GetCurrent().Name.ToString(); 
       String machineName = WindowsIdentity.GetCurrent().Name.ToString().Substring(0, machineNameAndUser.IndexOf('\\')); 
      Console.WriteLine("Computer's name: " + machineName); 
      ResetPassword(machineName, "Administrator", "new"); 
      //ChangePassword("Administrator", "current", "new");      Console.WriteLine("Finished..."); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
       Console.WriteLine(e.StackTrace); 
       Console.WriteLine(e.InnerException); 
      } 
      Console.ReadKey(); 

     } 

     public static void ResetPassword(string computerName, string username, string newPassword) 
     { 
      DirectoryEntry directoryEntry = new DirectoryEntry(string.Format("WinNT://{0}/{1}", computerName, username)); 
      directoryEntry.Invoke("SetPassword", newPassword); 
      //directoryEntry.Invoke("ChangePassword", new object[] { "current", "new" }); 
     } 
    } 
} 
+0

किसी भी विवरण के बारे में आप जानते थे कि यह कैसे विफल रहा - यानी, क्या कोई अपवाद था? –

+0

ओह, और यदि कोई अपवाद था, तो क्या आप पूरे अपवाद को पोस्ट कर सकते हैं? यही है, ex.ToString() के पूर्ण आउटपुट पोस्ट करें। –

+0

कोई अपवाद नहीं। :( – sholsapp

उत्तर

5

क्या आप (या आप अपग्रेड कर सकते हैं) .NET 3.5? उपयोगकर्ताओं, समूहों, कंप्यूटरों के लिए एडी एकीकरण में .NET 3.5 में बड़े पैमाने पर सुधार हुआ है - विवरण के लिए एमएसडीएन आलेख Managing Directory Security Principals in the .NET Framework 3.5 देखें।

आपके मामले में, आप की तरह कुछ कर सकता है:

// establish context for local machine 
PrincipalContext ctx = new PrincipalContext(ContextType.Machine); 

// find the "Administrator" account 
UserPrincipal admin = UserPrincipal.FindByIdentity(ctx, "Administrator"); 

// set the password to a new value 
admin.SetPassword("new-top-secret-password"); 
admin.Save(); 

और आप काम हो गया! WinNT: प्रदाता यह कर सकता है कि यह क्या कर सकता है और यदि संभव हो तो इससे बचा जाना चाहिए।

+0

धन्यवाद! मुझे यह समाधान पसंद है और WinNT प्रदाता के बदले में इसका उपयोग करेगा। – sholsapp

+0

क्या मुझे नया सेट करने के लिए पुराने पासवर्ड की आवश्यकता है? – VansFannel

0

उपयोगकर्ता चेक गुण है जिसके लिए आप पासवर्ड सेट करना चाहते हैं, अगर

उपयोगकर्ता पासवर्ड

संपत्ति को बदल नहीं सकते तो जाँच यू खिचड़ी भाषा DirectoryEntry वस्तु बनाने के दौरान व्यवस्थापक क्रेडेंशियल directoryEntry.Invoke("SetPassword", "new"); उपयोग का उपयोग करके पासवर्ड सेट किया गया है या अनचेक करें "उपयोगकर्ता पासवर्ड नहीं बदल सकता" संपत्ति