win7-CredentialProvider使用域賬戶登錄

背景:用戶是針對於固定域的,要求使用域賬戶登錄。


在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 函數中,判斷是否有“\”符號出現,如果有出現,則提示用戶使用“***”域登錄。

這種方案還沒有經過實際測試,正在開發中。後續再繼續寫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章