Active Directory de usuario contraseña fecha de caducidad .NET / Política de Grupo OU

StackOverflow https://stackoverflow.com/questions/3764327

  •  04-10-2019
  •  | 
  •  

Pregunta

He buscado en el sitio de información y se encontró lo siguiente: ASP.NET C # Active Directory - Ver cuánto tiempo antes de la contraseña de un usuario expira

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

Mi pregunta es la siguiente: ¿y si el usuario tiene una directiva de grupo de unidad organizativa que tiene un valor de fecha, MaxPasswordAge diferente, anulando el especificado en la directiva de grupo de dominio? Como llegar mediante programación de objetos de directiva de grupo de la OU?

Editar: Para hacer esta pregunta un poco más claro, estoy añadiendo esta edición. Lo que busco es ser capaz de decir cuando la contraseña del usuario caduca. Por lo que yo entiendo que valor de fecha o bien puede ser gobernado por los dominios de la política local o por la política del objeto de grupo. Tengo un proveedor Linq2DirectoryService que se traduce LINQ a las consultas LDAP. Así que una consulta LDAP para obtener el valor de caducidad fecha sería óptimo para este subj. Si la respuesta incluye qué objetos envoltorios soportados por .NET se incluyen en esta ecuación - sería un muerto en respuesta !

¿Fue útil?

Solución

Permítanme comenzar con http://support.microsoft.com/kb/323750 cuales contiene ejemplos de Visual Basic y VBScript y http: // www. anitkb.com/2010/03/how-to-implement-active-directory.html que describe cómo los impactos maxPwdAge OU configuración de ordenadores, no a los usuarios. También tiene un comentario que apunta a AloInfo.exe como una herramienta de MS que pueden ser utilizados para obtener las edades de 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();
        }
    }
}

Otros consejos

El siguiente código que funcionó para mí para obtener la fecha de caducidad de contraseña en ambos dominios y cuentas de usuario local:

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

El 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");
    }

Algunas de las respuestas anteriores se basan en el método DirectoryEntry.InvokeGet, lo que dice la EM no debe ser utilizado . Así que aquí hay otro enfoque:

public static DateTime GetPasswordExpirationDate(UserPrincipal user)
{
    DirectoryEntry deUser = (DirectoryEntry)user.GetUnderlyingObject();
    ActiveDs.IADsUser nativeDeUser = (ActiveDs.IADsUser)deUser.NativeObject;
    return nativeDeUser.PasswordExpirationDate;
}

Usted tendrá que añadir una referencia a la biblioteca Activeds COM normalmente se encuentra en C:. \ Windows \ System32 \ Activeds.tlb

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top