背景:用戶是針對於固定域的,要求使用域賬戶登錄。
在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 函數中,判斷是否有“\”符號出現,如果有出現,則提示用戶使用“***”域登錄。
這種方案還沒有經過實際測試,正在開發中。後續再繼續寫。