背景:用户是针对于固定域的,要求使用域账户登录。
在CredentialProvider实例中,如果用户没有使用域账户,程序会默认获取到当前的计算机名称
if (GetComputerNameW(wsz, &cch))
并作为域的参数传递给
hr = KerbInteractiveUnlockLogonInit(wsz, _rgFieldStrings[SFI_EDIT_TEXT], pwzProtectedPassword, _cpus, &kiul);
经过试验,可以使用第一种方案:在获取到用户输入的账户名后,判断是否使用“\”
WCHAR wsz[MAX_COMPUTERNAME_LENGTH+1] = {0};
WCHAR wUserName[MAX_COMPUTERNAME_LENGTH+1] = {0};
DWORD cch = ARRAYSIZE(wsz);
//判断是否为域账户登录 2014.01.21
PWSTR pwStrDomainName = _rgFieldStrings[SFI_EDIT_TEXT];
string strDomainName = "";
CRegHelper::WcharArr2String(pwStrDomainName,50,strDomainName);
int nPos = strDomainName.find("\\");
if((nPos>0)&&(nPos<strDomainName.size()))
{
CRegHelper::WriteKeyEventLog("使用域账户登录");
CRegHelper::WriteKeyEventLog((char *)strDomainName.c_str());
//使用域账户登录
for(int i = 0; i< nPos; i++)
{
wsz[i] = pwStrDomainName[i];
}
for(int j = nPos+1,p = 0; j<strDomainName.size(); j++,p++)
{
wUserName[p] = pwStrDomainName[j];
}
wcscpy(_rgFieldStrings[SFI_EDIT_TEXT] , wUserName);
}
else
{
//没有使用域账户登录
if(!GetComputerNameW(wsz, &cch))
{
DWORD dwErr = GetLastError();
return HRESULT_FROM_WIN32(dwErr);
}
}
。。。。。。。。。。。。
然后传递给构造kiul 的函数中就可以了。
hr = KerbInteractiveUnlockLogonInit(wsz, _rgFieldStrings[SFI_EDIT_TEXT], pwzProtectedPassword, _cpus, &kiul);
if (SUCCEEDED(hr))
{
hr = KerbInteractiveUnlockLogonPack(kiul, &pcpcs->rgbSerialization, &pcpcs->cbSerialization);
}
还有第二种方案,是观察微软的登录界面,猜测的:
在用户输入登录账户的时候,在 CSampleCredential::GetStringValue 函数中,判断是否有“\”符号出现,如果有出现,则提示用户使用“***”域登录。
这种方案还没有经过实际测试,正在开发中。后续再继续写。