win7-CredentialProvider使用域账户登录

来源:互联网 发布:凌游网络出过什么游戏 编辑:程序博客网 时间:2024/05/05 23:46

背景:用户是针对于固定域的,要求使用域账户登录。


在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 函数中,判断是否有“\”符号出现,如果有出现,则提示用户使用“***”域登录。

这种方案还没有经过实际测试,正在开发中。后续再继续写。

1 1
原创粉丝点击