2010-04-11 5 views
6

auf einer Vista-dev Maschine, die ich diesen Code verwenden erfolgreich Benutzer „Administrator“, um das Passwort zu ändern:Directory Passwort ändern: Unterschiedliches Verhalten zwischen Vista/Server2008

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

Als ich es bewegte über Maschine meines Server 2008 dev dieser Code hat nicht funktioniert, und ich wurde gezwungen, den folgenden Code zu verwenden:

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

Meine Frage ist, warum?

In beiden Fällen habe ich meine Directory Objekt als solches:

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

Dank! 8)

Für den Fall, dass Sie es hilfreich finden, ist es der eigentliche Code.

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

Alle Details, wie Sie wussten, dass es fehlgeschlagen - dh gab es eine Ausnahme? –

+0

Oh, und wenn es eine Ausnahme gab, könnten Sie bitte die gesamte Ausnahme posten? Das heißt, posten Sie die vollständige Ausgabe von ex.ToString(). –

+0

Keine Ausnahmen. :( – sholsapp

Antwort

5

Sind Sie (oder können Sie upgraden auf) .NET 3.5? Die AD-Integration für Benutzer, Gruppen, Computer wurde in .NET 3.5 massiv verbessert. Weitere Informationen finden Sie im MSDN-Artikel 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(); 

und fertig:

In Ihrem Fall könnte man so etwas tun! Der Provider WinNT: ist sehr begrenzt in was es tun kann und sollte vermieden werden, wenn immer möglich.

+0

Danke! Ich mag diese Lösung und werde sie im Austausch für den WinNT-Provider verwenden. – sholsapp

+0

Benötige ich das alte Passwort, um ein neues zu setzen? – VansFannel

0

überprüfen Benutzereigenschaften, für die Sie Kennwort festlegen möchten, wenn

Benutzer-Passwort nicht

Eigenschaft wird geprüft, ändern kann dann kippe u Kennwort festlegen, indem Sie directoryEntry.Invoke("SetPassword", "new"); Verwenden Admin-Anmeldeinformationen während Directory Objekt erstellen oder deaktivieren Sie "Benutzer kann das Passwort nicht ändern" -Eigenschaft

Verwandte Themen