【问题标题】:Password Expiry Date using c++?使用c ++的密码到期日期?
【发布时间】:2012-10-25 11:24:21
【问题描述】:

我想使用 c++ win32 API 显示密码到期对话框...

我是使用 System.directoryservice 命名空间完成的...

但现在我需要 Win32 API..

那里有获取密码有效期的功能吗?

提前致谢

【问题讨论】:

    标签: c++ windows winapi active-directory


    【解决方案1】:

    您可以使用以下函数获取密码到期日期:

    HRESULT GetPasswordExpirationDate(LPTSTR lpszPathName, LPSYSTEMTIME lpExpirationDate)
    {
        HRESULT hr;
        IADsUser *pUser;
        hr = ADsGetObject(lpszPathName, IID_IADsUser, (void**) &pUser);
        if(SUCCEEDED(hr))
        {
            DATE expirationDate;
            hr = pUser->get_PasswordExpirationDate(&expirationDate);
            if (SUCCEEDED(hr))
                VariantTimeToSystemTime(expirationDate, lpExpirationDate);
    
            pUser->Release();
        }
    
        return hr;
    }
    

    其中lpszPathNameLDAPWinNT 路径,lpExpirationDate 是指向SYSTEMTIME 结构的指针。

    请注意,您必须包含 Windows.hIads.hAdshlp.h 并链接到 ADSIid.LibActiveDS.Lib 才能使其工作。

    示例用法:

    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    
    SYSTEMTIME expirationDate;
    HRESULT hr = GetPasswordExpirationDate(_T("WinNT://ComputerName/UserName,user"),
        &expirationDate);
    
    if (SUCCEEDED(hr))
    {
        //TODO: do whatever you want with the expirationDate here
    }
    
    CoUninitialize();
    

    您可能希望使用以下 API 调用之一来检索当前用户和计算机/域名:GetUserNameGetComputerNameGetUserNameExNetWkstaUserGetInfo

    如果您需要检索多个域用户的密码过期日期,最好使用ADsBuildEnumerator 而不是ADsGetObject(参见 MSDN 上的示例)。

    【讨论】:

    • @Nikole: 我无法获得get_PasswordExpirationDate(); 我也使用 ADSI 函数,但我无法仅获得上述函数...**我如何获得此函数**?我也在一个网站上看到了这个例子......但是get_PasswordExpirationDate();这些功能只会产生问题......
    • 有点难以理解你的意思。但我怀疑你只是忘了查询IADsUser 接口。例如:pADs->QueryInterface(IID_IADsUser, (void**) &pUser); PS:我是 Nikolay。 Nikole 是一个女性名字。
    • 抱歉拼写错误 Nikolay...我的代码部分是,'IADs * pIADsrootDSE = NULL; _BSTR(&var) = SysAllocString(L"No"); V_VT(&var) = VT_BSTR; hr = pIADsrootDSE->Put(L"BiometricStatus",var ); hr = pIADsrootDSE->SetInfo();' 这些代码有效...但我正在使用'hr = pIADsrootDSE->get_PasswordExpirationDate(&expirationDate);' 发生以下错误...错误 C2039: 'get_PasswordExpirationDate' : 不是 'IADs' 的成员`现在知道了吗?
    • @SanjuMonu 好吧。首先,pIADsrootDSEIADs,不支持PasswordExpirationDate。正如我之前所说,您必须使用IADsUser。您可以致电ADsGetObjectQueryInterface 获取。
    • @SanjuMonu 您的下一个问题是pIADsrootDSE 似乎是Root DSE。所以你不能只在上面使用QueryInterface。最后,pIADsrootDSENULL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多