Frage

Auf einer Vista dev Maschine habe ich diesen Code erfolgreich zu ändern Benutzer "Administrator" Kennwort:

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

Als ich zog es zu meinem Server 2008 Dev-Maschine, dass Code nicht funktioniert hat, und ich war gezwungen, den folgenden Code zu verwenden:

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

Meine Frage ist, warum?

Für beide Fälle, habe ich mein Directory Objekt als solches:

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

Danke! 8)

Falls Sie Jungs finden es hilfreich, heren den eigentlichen 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" });
        }
    }
}
War es hilfreich?

Lösung

Sind Sie (oder könnten Sie ein Upgrade auf) .NET 3.5? Die AD-Integration für Benutzer, Gruppen, Computer hat in .NET 3.5 massiv verbessert - überprüfen Sie die MSDN-Artikel aus Verwalten von Verzeichnissicherheit Principals in .NET Framework 3.5 .

In Ihrem Fall könnten Sie so etwas wie tun:

// 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 Sie sind fertig! Der WinNT: Anbieter ist sehr begrenzt in dem, was sie tun können und sollten, wenn überhaupt möglich vermieden werden.

Andere Tipps

überprüfen Sie die Benutzereigenschaften, für die Sie auf festgelegtes Passwort, wenn

  

Benutzer kann Kennwort nicht ändern

Eigenschaft überprüft wird dann u set password kann nicht von directoryEntry.Invoke("SetPassword", "new");Use Admin-Anmeldeinformationen verwenden beim Erstellen Directory Objekts oder deaktivieren „Benutzer kann Kennwort nicht ändern“ Eigenschaft

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top