2010-09-21 839 views
10

He buscado en el sitio de información y encontrado esto: ASP.NET C# Active Directory - See how long before a user's password expiresusuario de Active Directory fecha de expiración de la contraseña .NET/OU directiva de grupo

que explica cómo obtener el valor de cuando caduque la contraseña de acuerdo con la directiva de dominio.

Mi pregunta es esta: ¿qué ocurre si el usuario tiene una política de grupo OU que tiene un valor MaxPasswordAge diferente, anulando el especificado en la Política de grupo de dominio? ¿Cómo obtener programáticamente el objeto de política de grupo de la OU?

Editar: Para hacer esta pregunta un poco más clara, estoy agregando esta edición. Lo que busco es poder decir cuándo caduca la contraseña del usuario. Por lo que yo entiendo, el valor de la fecha puede ser gobernado por la política local de los dominios o por la política de objetos grupales. Tengo un proveedor Linq2DirectoryService que traduce Linq a consultas Ldap. Entonces, una consulta LDAP para obtener el valor de expiración de la fecha sería óptima para este subj. Si tu respuesta incluye qué envoltorios de objetos soportados por .net están incluidos en esta ecuación, ¡sería una respuesta inactiva!

+0

Sin comentarios ...? ¿Qué hay de la Consola de administración de directivas de grupo, mi entorno es Server 2003? ¿Alguien tiene experiencia con esa pieza de software? ¡Ayudar a las personas! – dexter

Respuesta

13

Déjenme comenzar con http://support.microsoft.com/kb/323750 que contiene ejemplos de Visual Basic y VBScript y http://www.anitkb.com/2010/03/how-to-implement-active-directory.html que describe cómo la configuración de OU de maxPwdAge afecta a las computadoras, no a los usuarios. También tiene un comentario que apunta al AloInfo.exe como una herramienta de MS que se puede usar para obtener las edades de la contraseña.

Aquí está el ejemplo:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.DirectoryServices; 

namespace LDAP 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string domainAndUsername = string.Empty; 
      string domain = string.Empty; 
      string userName = string.Empty; 
      string passWord = string.Empty; 
      AuthenticationTypes at = AuthenticationTypes.Anonymous; 
      StringBuilder sb = new StringBuilder(); 

      domain = @"LDAP://w.x.y.z"; 
      domainAndUsername = @"LDAP://w.x.y.z/cn=Lawrence E."+ 
         " Smithmier\, Jr.,cn=Users,dc=corp,"+ 
         "dc=productiveedge,dc=com"; 
      userName = "Administrator"; 
      passWord = "xxxpasswordxxx"; 
      at = AuthenticationTypes.Secure; 

      DirectoryEntry entry = new DirectoryEntry(
         domain, userName, passWord, at); 

      DirectorySearcher mySearcher = new DirectorySearcher(entry); 

      SearchResultCollection results; 
      string filter = "maxPwdAge=*"; 
      mySearcher.Filter = filter; 

      results = mySearcher.FindAll(); 
      long maxDays = 0; 
      if(results.Count>=1) 
      { 
       Int64 maxPwdAge=(Int64)results[0].Properties["maxPwdAge"][0]; 
       maxDays = maxPwdAge/-864000000000; 
      } 

      DirectoryEntry entryUser = new DirectoryEntry(
         domainAndUsername, userName, passWord, at); 
      mySearcher = new DirectorySearcher(entryUser); 

      results = mySearcher.FindAll(); 
      long daysLeft=0; 
      if (results.Count >= 1) 
      { 
       var lastChanged = results[0].Properties["pwdLastSet"][0]; 
       daysLeft = maxDays - DateTime.Today.Subtract(
         DateTime.FromFileTime((long)lastChanged)).Days; 
      } 
      Console.WriteLine(
         String.Format("You must change your password within"+ 
             " {0} days" 
            , daysLeft)); 
      Console.ReadLine(); 
     } 
    } 
} 
+0

Ah, vuelve a leer Me doy cuenta de que su entorno de servidor es 2003, por lo que no puede utilizar las Políticas de Contraseña de Granulometría descritas en http://technet.microsoft.com/en-us/library/cc770394%28WS. 10% 29.aspx ya que requiere 2008+. Creo que el artículo enumerado es una solución que cubre cualquier situación que tenga. –

+0

sí Estoy familiarizado con ese ejemplo para leer el valor de maxPwdAge a través del filtro. Pero mi pregunta es ... ¿se sobrescribe el valor si existe un objeto de política de grupo que rige las contraseñas para un usuario? Si ese valor no se sobrescribe por el hecho de que hay un gpo definido para ese usuario específico, entonces el código que proporcionó no es bueno. Debo verificar que ahora ... – dexter

+0

pude volver a la tarea. Como se sospecha, su código no será suficiente para una detección de expiación de contraseña general. La razón por la cual un GPO puede anular la Política de dominio predeterminada en cualquier nivel. Lo que se debe usar, parece, es esto: http://www.pinvoke.net/default.aspx/advapi32.lsaopenpolicy – dexter

8

El siguiente código que funcionó para mí para obtener la fecha de caducidad de contraseña en ambas cuentas de usuario de dominio y locales:

public static DateTime GetPasswordExpirationDate(string userId, string domainOrMachineName) 
{ 
    using (var userEntry = new DirectoryEntry("WinNT://" + domainOrMachineName + '/' + userId + ",user")) 
    { 
     return (DateTime)userEntry.InvokeGet("PasswordExpirationDate"); 
    } 
} 
+0

Recibí un error: la excepción ha sido lanzada por el objetivo de una invocación. –

+0

@GerkeGeurts ¿Cómo se ve típicamente 'userId'? ¿Es esto lo mismo que 'samAccountName'? – styfle

+0

userId es de hecho el nombre de la cuenta SAM. –

2

Uso siguiente método para obtener la fecha de caducidad de la cuenta-

public static DateTime GetPasswordExpirationDate(string userId) 
    { 
     string forestGc = String.Format("GC://{0}", Forest.GetCurrentForest().Name); 
     var searcher = new DirectorySearcher(); 
     searcher = new DirectorySearcher(new DirectoryEntry(forestGc)); 
     searcher.Filter = "(sAMAccountName=" + userId + ")"; 
     var results = searcher.FindOne().GetDirectoryEntry(); 
     return (DateTime)results.InvokeGet("PasswordExpirationDate"); 
    } 
Cuestiones relacionadas