我正在与AD服务器,我想获得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不包含在user / contact / person 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没有为每个用户配置,而是按照每个域配置(直到启用细粒度的密码策略)
更多读物: