Active Directory utente Password data di scadenza .NET Criteri di gruppo / OU

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

  •  04-10-2019
  •  | 
  •  

Domanda

Ho cercato il sito per informazioni e ho trovato questo: ASP.NET C # Active Directory - Vedere quanto tempo prima la password di un utente scade

che spiega come ottenere il valore di quando la password scade come da criterio di dominio.

La mia domanda è questa: cosa succede se l'utente ha un criterio di gruppo OU che ha un valore diverso MaxPasswordAge, sovrascrivendo quello specificato in Criteri di gruppo di dominio? Come ottenere programatically oggetti Criteri di gruppo del OU?

Modifica Per fare questa domanda un po 'più chiaro, io sono l'aggiunta di questa modifica. Quello che sto dopo è quello di essere in grado di dire quando la password dell'utente scade. Per quanto mi sembra di capire che il valore della data può essere sia governato da domini la politica locale o con oggetti Criteri di gruppo. Ho un provider Linq2DirectoryService che traduce LINQ to query LDAP. Quindi una query LDAP per ottenere il valore data di scadenza sarebbe ottimale per questo subj. Se la risposta comprende ciò che gli oggetti wrapper supportati da .NET sono compresi in questa equazione - sarebbe un morto sulla risposta !

È stato utile?

Soluzione

Vorrei iniziare con http://support.microsoft.com/kb/323750 che contiene visivi Esempi di base e VBScript e http: // www. anitkb.com/2010/03/how-to-implement-active-directory.html che delinea come i maxPwdAge UO impatti di impostazione computer, non gli utenti. Essa ha anche un commento indicando AloInfo.exe come uno strumento da MS che possono essere utilizzati per ottenere le età della password.

Ecco l'esempio:

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

Altri suggerimenti

Il seguente codice ha funzionato per me per ottenere la data di scadenza della password sia di dominio e account utente locali:

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

Usa seguente metodo per ottenere la data di scadenza del conto -

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

Alcune delle risposte precedenti si basano sul metodo DirectoryEntry.InvokeGet, che MS dice che non dovrebbe essere usato . Quindi, ecco un altro approccio:

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

Sarà necessario aggiungere un riferimento alla libreria Activeds COM tipicamente presenti in C:. \ Windows \ System32 \ Activeds.tlb

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top