【发布时间】:2012-10-25 11:24:21
【问题描述】:
我想使用 c++ win32 API 显示密码到期对话框...
我是使用 System.directoryservice 命名空间完成的...
但现在我需要 Win32 API..
那里有获取密码有效期的功能吗?
提前致谢
【问题讨论】:
标签: c++ windows winapi active-directory
我想使用 c++ win32 API 显示密码到期对话框...
我是使用 System.directoryservice 命名空间完成的...
但现在我需要 Win32 API..
那里有获取密码有效期的功能吗?
提前致谢
【问题讨论】:
标签: c++ windows winapi active-directory
您可以使用以下函数获取密码到期日期:
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;
}
其中lpszPathName 是LDAP 或WinNT 路径,lpExpirationDate 是指向SYSTEMTIME 结构的指针。
请注意,您必须包含 Windows.h、Iads.h 和 Adshlp.h 并链接到 ADSIid.Lib 和 ActiveDS.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 调用之一来检索当前用户和计算机/域名:GetUserName、GetComputerNameGetUserNameEx、NetWkstaUserGetInfo
如果您需要检索多个域用户的密码过期日期,最好使用ADsBuildEnumerator 而不是ADsGetObject(参见 MSDN 上的示例)。
【讨论】:
get_PasswordExpirationDate(); 我也使用 ADSI 函数,但我无法仅获得上述函数...**我如何获得此函数**?我也在一个网站上看到了这个例子......但是get_PasswordExpirationDate();这些功能只会产生问题......
IADsUser 接口。例如:pADs->QueryInterface(IID_IADsUser, (void**) &pUser); PS:我是 Nikolay。 Nikole 是一个女性名字。
'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' 的成员`现在知道了吗?
pIADsrootDSE 是IADs,不支持PasswordExpirationDate。正如我之前所说,您必须使用IADsUser。您可以致电ADsGetObject 或QueryInterface 获取。
pIADsrootDSE 似乎是Root DSE。所以你不能只在上面使用QueryInterface。最后,pIADsrootDSE 是 NULL。