在我的ASP.NET MVC(C#)项目中,我必须了解用户密码是否已过期?我在互联网上找到了一些关于它的答案,但它们对我没用。
使用maxpwdage
+ pwdlastset
= password expired date
的第一种方法,第二种解决方案是使用useraccountcontrol
属性来了解它是否已过期。如果此属性的值为8389120,则用户密码已过期。
Altough用户密码在AD中过期,useraccountcontrol
值仍为512.我尝试使用maxpwdage
+ pwdlastset
,但我看不到像{{{{}}这样的属性1}}(我以管理员身份获得用户)
Active Directory user password expiration date .NET/OU Group Policy (第一种方式) https://support.microsoft.com/en-us/kb/305144 (第二种方式)
由于我上面提到的原因,他们都没有工作。
是否有其他方法可以执行此操作或如何查看maxpwdage
属性的值?
编辑:我从这里得到了我想要的用户
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;
属性。
答案 0 :(得分:0)
您可以使用代表时间间隔的TimeSpan。然后您只需检查今天的日期和过期日期。
DateTime expireDate = passwordLastChanged.AddDays(iMaxPwdAge);
TimeSpan ts = expireDate - DateTime.Now;
int iDaysTilExpired = ts.Days;
WriteLogMessage("Days til password expires:" + iDaysTilExpired);
还有一个很好的example,我为我的项目更改了一些部分,它对我有用。
修改:
您可以使用属性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();
}
}
}