Истечение срока действия пароля пользователя Active Directory date.NET/OU групповая политика
Я искал на сайте информацию и нашел это: ASP.NET C# Active Directory-посмотрите, сколько времени до истечения срока действия пароля пользователя
что объясняет, как получить значение, когда пароль истекает в соответствии с политикой домена.
мой вопрос таков: что делать, если у пользователя есть групповая политика OU, которая имеет другое значение MaxPasswordAge, переопределяющее значение, указанное в групповой политике домена? Как программно получить объект групповой политики OU?
Edit: чтобы сделать этот вопрос немного более ясно, я добавляю это изменить. То, что я после того, чтобы иметь возможность сказать, когда истекает пароль пользователя. Насколько я понимаю, значение даты может управляться локальной политикой доменов или политикой групповых объектов. У меня есть поставщик Linq2DirectoryService, который переводит Linq в запросы Ldap. Таким образом, запрос LDAP для получения значения истечения срока действия даты был бы оптимальным для этого subj. Если вы ответите, какие объекты обертки, поддерживаемые .net, включены в это уравнение - это был бы мертвый ответ!
4 ответов
позвольте мне начать с http://support.microsoft.com/kb/323750 который содержит примеры Visual Basic и VBScript и http://www.anitkb.com/2010/03/how-to-implement-active-directory.html который описывает, как параметр maxPwdAge OU влияет на компьютеры, а не на пользователей. Он также имеет комментарий, указывающий на AloInfo.exe как инструмент от MS, который можно использовать для получения возраста пароля.
вот пример:
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();
}
}
}
следующий код работал для меня, чтобы получить срок действия пароля как на доменных, так и на локальных учетных записях пользователей:
public static DateTime GetPasswordExpirationDate(string userId, string domainOrMachineName)
{
using (var userEntry = new DirectoryEntry("WinNT://" + domainOrMachineName + '/' + userId + ",user"))
{
return (DateTime)userEntry.InvokeGet("PasswordExpirationDate");
}
}
используйте следующий метод, чтобы получить срок действия учетной записи -
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");
}
некоторые из предыдущих ответов зависят от DirectoryEntry.InvokeGet метод,который MS говорит, что не следует использовать. Итак, вот еще один подход:
public static DateTime GetPasswordExpirationDate(UserPrincipal user)
{
DirectoryEntry deUser = (DirectoryEntry)user.GetUnderlyingObject();
ActiveDs.IADsUser nativeDeUser = (ActiveDs.IADsUser)deUser.NativeObject;
return nativeDeUser.PasswordExpirationDate;
}
вам нужно добавить ссылку на библиотеку ActiveDS COM, обычно находящуюся в C:\Windows\System32\activeds - ... tlb.