2013-06-24 129 views
0

我需要验证如果LDAP用户帐户被锁定 我使用下面的代码检查用户是否被锁定在LDAP中?

const int ADS_UF_LOCKOUT = 0x00000010; 
DirectoryEntry entry = new DirectoryEntry (_path, domainAndUsername, pwd); 
if (((int)entry.Properties["useraccountcontrol"].Value & ADS_UF_LOCKOUT) == 1) 
{ 
    return true; 
} 

但是如果用户帐户被锁定,我收到“登录失败:错误的用户名/密码”

请帮忙。

回答

0

如果您想确定用户帐户是否被锁定,则无法使用您检查的用户帐户信息来确定此事实 - 因为用户帐户被锁定,您将被拒绝访问。

您不会被告知无法登录的原因是由于该帐户被锁定,这将被视为过度的信息披露。

如果您想要确定未被允许登录的原因是是由于帐户被锁定,您需要一个已经登录的帐户,该帐户可以检查帐户锁定状态,而不是尝试从失败连接。

+0

虽然我还没有验证它,但它似乎可以得到有关失败的其他信息:http://stackoverflow.com/a/16796531/19308 –

0

您也可以使用属性锁定时间:如果用户未锁定,则为0。 (使用管理员凭证连接到AD)。

DirectoryEntry _de = new DirectoryEntry (_path, domainAdmininstratorName, pwd); // get user as directory entry object 
object largeInteger = _de.Properties["lockoutTime"].Value; // it's a large integer so we need to get it's value by a little bit complex way 
long highPart = 
      (Int32) 
       largeInteger.GetType() 
        .InvokeMember("HighPart", BindingFlags.GetProperty, null, largeInteger, null); 
long lowPart = 
      (Int32) 
       largeInteger.GetType() 
        .InvokeMember("LowPart", BindingFlags.GetProperty, null, largeInteger, null); 
long result = (long) ((uint) lowPart + (((long) highPart) << 32)); 
if (result == 0) 
{ 
    // account is not locked 
} 
else 
{ 
// account is locked 
} 
相关问题