【问题标题】:How to get password expiry date using C++ win32 API?如何使用 C++ win32 API 获取密码到期日期?
【发布时间】:2012-10-29 05:50:09
【问题描述】:

我正在使用带有 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的错误代码。

谁能解释发生了什么问题?

【问题讨论】:

    标签: c++ windows winapi active-directory


    【解决方案1】:

    错误转换为 ADS_PROPERTY_NOT_FOUND。莫非这个用户的密码没有过期?

    【讨论】:

    • 要么将此作为评论.. 要么作为答案。如果它是一个“问题”,那么它就不是一个答案。 (答案可能是“ADS_PROPERTY_NOT_FOUND 会为不会过期的密码返回”,如果它确实被认为是一个真实的陈述。)
    • @ Nik B.@ pst: 不,我已经检查过了,该用户的密码将过期...当我使用该用户登录时,它显示“密码将在 2 天后过期,你想更改密码”对话框...就是这样,我不知道到底是什么问题!??!?!?
    【解决方案2】:

    我知道这是一篇旧帖子,但我寻找了同样的东西并找到了这篇帖子,对我来说,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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 2011-10-19
      相关资源
      最近更新 更多