在我的 ASP.NET MVC (C#) 项目中,我必须了解用户密码是否过期?我在互联网上找到了一些相关答案,但它们对我没有用。
第一种方法是使用
maxpwdage
+pwdlastset
= password expired date
,第二种方法是使用 useraccountcontrol
属性来了解是否过期。如果该属性的值为 8389120,则用户密码已过期。
虽然AD中的用户密码已过期,
useraccountcontrol
值仍然是512。我尝试使用maxpwdage
+pwdlastset
,但我看不到像maxpwdage
这样的属性(我以管理员身份获得用户)
Active Directory 用户密码过期日期 .NET/OU 组策略 (第一种方式) https://support.microsoft.com/en-us/kb/305144(第二种方式)
由于我上面提到的原因,它们都不起作用。
还有其他方法可以做到这一点或者我如何查看
maxpwdage
属性的值?
编辑:我从这里得到了我想要的用户
DirectoryEntry dEntry = new DirectoryEntry
( "LDAP://a.b.c:123/OU=d, DC=e, DC=f", this.GetAdUserName(),
this.GetAdUserPassword() );
DirectorySearcher directorySearcher = new DirectorySearcher( dEntry );
directorySearcher.Asynchronous = true;
directorySearcher.CacheResults = true;
directorySearcher.Filter = "(&(sAMaccountName=" + identificationNumber + "))";
SearchResult user = directorySearcher.FindOne();
return user;
我正在检查用户的属性,但找不到
maxpwdage
属性。
您可以使用代表时间间隔的TimeSpan。然后您所需要做的就是检查今天的日期和过期日期。
DateTime expireDate = passwordLastChanged.AddDays(iMaxPwdAge);
TimeSpan ts = expireDate - DateTime.Now;
int iDaysTilExpired = ts.Days;
WriteLogMessage("Days til password expires:" + iDaysTilExpired);
还有一个很好的示例,我为我的项目更改了一些部分,它对我有用。
编辑:
您可以使用属性
msDS-UserPasswordExpiryTimeComputed
来获取用户密码到期日期。
还有
“maxPwdAge”属性保存在domainDNS 类(目录的根)上,因为它是策略的一部分。它不保存在用户对象上。如果您使用 .NET 2.0,您可以轻松获得:
using (DirectoryEntry domain = Domain.GetCurrentDomain())
{
DirectorySearcher ds = new DirectorySearcher(
domain,
"(objectClass=*)",
null,
SearchScope.Base
);
SearchResult sr = ds.FindOne();
TimeSpan maxPwdAge = TimeSpan.MinValue;
if (sr.Properties.Contains("maxPwdAge"))
maxPwdAge = TimeSpan.FromTicks((long)sr.Properties["maxPwdAge"][0]);
}
编辑2:
这是您可以使用的完整示例:
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();
}
}
}