2010-04-11 9 views
6

En una máquina dev Vista He utilizado este código con éxito al cambio de usuario "administrador" contraseña:DirectoryEntry para cambiar la contraseña: Un comportamiento diferente entre Vista/Server 2008, a

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

Cuando la acercó a mi máquina dev Server 2008 ese código no funcionó, y tuve que usar el siguiente código:

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

Mi pregunta es, ¿por qué?

Para ambos casos, he creado mi objeto DirectoryEntry como tal:

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

Gracias! 8)

En caso de que a ustedes les resulte útil, aquí está el código real.

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

Cualquier detalle de cómo sabía que falló - es decir, ¿hubo una excepción? –

+0

Ah, y si hubiera una excepción, ¿podría publicar la excepción completa? Es decir, publicar la salida completa de ex.ToString(). –

+0

Sin excepciones. :( – sholsapp

Respuesta

5

¿Estás (o podrías actualizar a) .NET 3.5? La integración de AD para usuarios, grupos y computadoras se ha mejorado enormemente en .NET 3.5. Consulte el artículo de MSDN Managing Directory Security Principals in the .NET Framework 3.5 para obtener más información.

En su caso, usted podría hacer algo como:

// 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(); 

y ya está! El proveedor WinNT: es muy limitado en lo que puede hacer y debe evitarse si es posible.

+0

Gracias! Me gusta esta solución y la usaré a cambio del proveedor de WinNT. – sholsapp

+0

¿Necesito la contraseña anterior para configurar una nueva? – VansFannel

0

propiedades de comprobación de usuario para el que desea establecer una contraseña, si

usuario no puede cambiar la contraseña

propiedad se comprueba a continuación, u no puede establecer la contraseña mediante el uso de directoryEntry.Invoke("SetPassword", "new"); Uso de administración de credenciales al crear el objeto DirectoryEntry o desmarque la propiedad "usuario no puede cambiar la contraseña"

Cuestiones relacionadas