0

我正在使用带有 win32 Api 的 C++,并且我想获取使用 ADSI 的用户的密码到期日期。

CoInitialize(NULL);

LPWSTR pszADsPath=L"LDAP://CN=arjun,CN=Users,DC=raja,DC=com";
//HRESULT hr;
IADsUser *pUser;

hr = ADsGetObject(pszADsPath, IID_IADsUser, (void**) &pUser);
if(SUCCEEDED(hr))
{
    DATE expirationDate;
    VariantInit(&var);
    hr = pUser->get_PasswordLastChanged(&expirationDate);
    hr = pUser->get_PasswordExpirationDate(&expirationDate);

    if (SUCCEEDED(hr))
        VariantTimeToSystemTime(expirationDate,&lpExpirationDate);

    pUser->Release();
}

调用get_PasswordLastChanged将成功并返回上次更改密码的日期,但我需要到期日期。

使用get_PasswordExpirationDate,我得到S_OK(成功),但它也给出了一个错误代码-2147463155

谁能解释出了什么问题?

4

2 回答 2

1

该错误转换为 ADS_PROPERTY_NOT_FOUND。会不会是这个用户的密码没有过期?

于 2012-10-29T05:59:33.287 回答
0

我知道这是一篇旧帖子,但我寻找了同样的东西并找到了这篇帖子,对我来说,OP 的代码(稍作改动)有效。我添加了 ldap url 并使用端口 636。以防万一有人搜索相同的东西:

CCoInitialize CoInitialize;

if( !CoInitialize.IsSuccessful() )
{
    stringstream Text;
    Text << L"CoInitialize returned <" << CoInitialize.GetMessage() << L">" << endl;
    this->WriteLogThreadSafe( Text.str() );

    // Continue anyway because it could be it was already initialized.
}

LPWSTR pszADsPath=L"LDAP://<YOUR LDAP SERVER>:636/<YOUR DN>";
//HRESULT hr;
IADsUser *pUser;

HRESULT hr = ADsGetObject(pszADsPath, IID_IADsUser, (void**) &pUser);
if(SUCCEEDED(hr))
{
    SYSTEMTIME SystemTime = {};
    DATE expirationDate = {};
    VARIANTARG var = {};
    VariantInit(&var);
    hr = pUser->get_PasswordLastChanged(&expirationDate);
    hr = pUser->get_PasswordExpirationDate(&expirationDate);

    if (SUCCEEDED(hr))
        VariantTimeToSystemTime( expirationDate,&SystemTime );

    pUser->Release();
}
于 2022-02-09T13:21:39.460 回答