如何使用C ++在Active Directory中获取maxpwdAge属性值?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用C ++在Active Directory中获取maxpwdAge属性值?相关的知识,希望对你有一定的参考价值。
我正在使用AD Server,我想获得maxpwdAge属性值...
我已经为此尝试了ADSi,但它提出了一个问题。
VARIANT var;
bsNamingContext=L"maxpwdAge";
hr = ADsGetObject(pszADsPath, IID_IADsUser, (void**) &pUser);
if(SUCCEEDED(hr))
{
VariantInit(&var);
hr = pUser->Get(bsNamingContext, &var);
}
但是,它给出-2147463155(8000500d)错误...
但我正在使用bsNamingContext=L"cn";
它正确地给出了CN值...
有人可以解决吗?
答案
maxpwdAge不包含在用户/联系人/人LDAP类中,因此您无法以这种方式检索它。
您需要从域对象而不是用户对象查询它
试试这个:
Const ONE_HUNDRED_NANOSECOND = .000000100 ' .000000100 is equal to 10^-7
Const SECONDS_IN_DAY = 86400
Set objDomain = GetObject("LDAP://DC=fabrikam,DC=com") ' LINE 4
Set objMaxPwdAge = objDomain.Get("maxPwdAge") ' LINE 5
If objMaxPwdAge.LowPart = 0 Then
WScript.Echo "The Maximum Password Age is set to 0 in the " & _
"domain. Therefore, the password does not expire."
WScript.Quit
Else
dblMaxPwdNano = Abs(objMaxPwdAge.HighPart * 2^32 + objMaxPwdAge.LowPart)
dblMaxPwdSecs = dblMaxPwdNano * ONE_HUNDRED_NANOSECOND ' LINE 13
dblMaxPwdDays = Int(dblMaxPwdSecs / SECONDS_IN_DAY) ' LINE 14
WScript.Echo "Maximum password age: " & dblMaxPwdDays & " days"
End If
更新:
要将大整数转换为人类可读值,请使用IADsLargeInteger调度接口
注1:示例在VB中,但由于COM,您可以轻松地重写它。
注意2:没有为每个用户配置maxpwdAge,但是每个域都配置了maxpwdAge(直到启用了细粒度的密码策略)
进一步阅读:
- http://msdn.microsoft.com/en-us/library/ms974598.aspx [推荐]
- http://msdn.microsoft.com/en-us/library/cc220201%28prot.20%29.aspx
- http://ldapwiki.willeke.com/wiki/AD%20Determining%20Password%20Expiration
- http://ldapwiki.willeke.com/wiki/Domain%20Wide%20Account%20Policies
以上是关于如何使用C ++在Active Directory中获取maxpwdAge属性值?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Powershell 中模拟 Active Directory 用户?
如何使用 Active Directory 存储在 AcquireTokenAsync 中收到的令牌
如何在 Linux 上使用 pyodbc 对 Active Directory 帐户使用用户/密码身份验证
如何使用 java 在 OpenLdap 和 Active Directory 之间进行同步?