CredentialProvider开发
来源:互联网 发布:淘宝骑行头盔 编辑:程序博客网 时间:2024/05/21 01:20
看到网上关于CredentialProvider的开发资料寥寥无几,于是把自己的经验分享出来,不对的望指正.
先百科一下:
Windows Vista 在平台集成方面为开发人员提供了许多新的机会。新的凭据提供程序模型是变动最大的方面之一,由于它
的出现,实现操作系统支持的新用户身份验证方案变得容易了许多。它已取代了 GINA(图形标识与身份验证)模型,而直言不讳
地说,后者一向因为开发人员难以理解和实现以及昂贵的 Microsoft支持费用而广为诟病。那么Windows® 登录插件接口的一个变
化竟会如此令人兴奋,其原因何在?用户打开计算机时首先看到的是登录屏幕。由于登录体验是由凭据提供程序来控制和管理的,
这使得自定义登录体验以及集成最符合组织需要的身份验证方法变得容易了许多。简而言之,凭据提供程序为开发和实现更好、更
可靠的安全性提供了一种更容易的方式。
好了,具体基本的了解自己百度吧,这里就不赘述了。
截获用户输入的用户名和密码
在CredentialProvider(以下简称CP)开发过程中,看了下MSDN的Demo,知道在GetSerilization函数中可以获取到用户输入的用户名
和密码,然后一个一个函数分析得出以下结论:
CP在 HRESULT CSampleCredential::GetSerialization中获得用户输入的用户名和密码,并进行一系列加密,拷贝,再传给winlogon进行验证。
我贴上GetSerilization的几行代码分析下(以MSDN的SampleAllControlCredentialProvider为例):
UNREFERENCED_PARAMETER(ppwszOptionalStatusText);
UNREFERENCED_PARAMETER(pcpsiOptionalStatusIcon);
HRESULT hr;
WCHAR wsz[MAX_COMPUTERNAME_LENGTH+1];
DWORD cch = ARRAYSIZE(wsz);
//获得本机的名字
if (GetComputerNameW(wsz, &cch))
{
PWSTR pwzProtectedPassword;
//密码的拷贝,注意,在这个函数CP是进行将其加密后再传出来值
//pwzProtectedPassword,这里的cpus是
//CREDENTIAL_PROVIDER_USAGE_SCENARIO( 这里就字面理解吧,想详细自己查MSDN )
//在这个函数中有个加密判断部分,也就是CredIsProtectedW函数,这是判断当前
//密码是否被加密了,然后设置bCredAlreadyEncrypted
//这个布尔值,如果在这个函数之前没有其它对密码的操作的话,肯定未加密啊。所以,按逻辑,自己改,让下面只执行SHStrDupW函数,
//也就是字符串拷贝函数,将其拷贝进要输出的pwzProtectedPassword,中就行了。
hr = ProtectIfNecessaryAndCopyPassword(_rgFieldStrings[SFI_PASSWORD], _cpus, &pwzProtectedPassword);
if (SUCCEEDED(hr))
{
KERB_INTERACTIVE_UNLOCK_LOGON kiul;
// 获得主机名,用户名和密码(都是未加密的),并包装在Kuil中返回,在这里可以改动一下自己体验,让它不管你输入什么用户名密码,
// 它都按照你设置的与winlogon进行交互,自己看函数具体实现。
hr = KerbInteractiveUnlockLogonInit(wsz, _rgFieldStrings[SFI_EDIT_TEXT], pwzProtectedPassword, _cpus, &kiul);
if (SUCCEEDED(hr)){
// 用于获得的密码和用户名(封装在kiul中)进行向winlog.exe交互验证
hr = KerbInteractiveUnlockLogonPack(kiul, &pcpcs->rgbSerialization, &pcpcs->cbSerialization);
基本上截获用户名和密码就到这里了,好简单也是。
弹出注册资源对话框并截取输入的编辑框信息
在CP Demo中,有个CommandLink函数,这个函数就是下图中的Register下划线的控件的执行函数。
我直接贴代码吧:
//显示注册Dlg
void ShowDlg()
{
DialogBoxParamA(g_hinst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc, 0);
}
//Dlg的回调函数,处理按键,关闭等操作
BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
char user[20];
char passWord[20];
char phoneNum[15];
char email[30];
switch (message)
{
case WM_CLOSE:
EndDialog(hDlg, 0);
return (TRUE);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDCANCEL:
SendMessage(hDlg, WM_CLOSE, 0, 0);
return (TRUE);
case IDOK:
::GetDlgItemText(hDlg, IDC_EDIT1, user, 20);
::GetDlgItemText(hDlg, IDC_EDIT2, passWord, 20);
::GetDlgItemText(hDlg, IDC_EDIT3, phoneNum, 15);
::GetDlgItemText(hDlg, IDC_EDIT4, email, 30);
MessageBox(hDlg, user, "UserName", MB_OKCANCEL);
MessageBox(hDlg, passWord, "PassWord", MB_OKCANCEL);
MessageBox(hDlg, phoneNum, "PhoneNum", MB_OKCANCEL);
MessageBox(hDlg, email, "Email", MB_OKCANCEL);
MessageBox(hDlg, "用户注册成功!", "Congratulations", MB_ICONINFORMATION);
return (TRUE);
}
return (FALSE);
}
return (FALSE);
}
// 用户点击CommadLink后执行此函数
HRESULT CSampleCredential::CommandLinkClicked(DWORD dwFieldID)
{
HRESULT hr;
// Validate parameter.
if (dwFieldID < ARRAYSIZE(_rgCredProvFieldDescriptors) &&
(CPFT_COMMAND_LINK == _rgCredProvFieldDescriptors[dwFieldID].cpft))
{
ShowDlg();
hr = S_OK;
}
else
{
hr = E_INVALIDARG;
}
return hr;
}
以上涉及到win32对话框资源的导入,对话框控件信息的获取,字符转换等知识点。
OK,完了。
·遇到error C2664: 字符转换错误(const char*向 LPCSTR转换)
解决:因为VS2013在这儿默认用的是UNICODE字符,所以直接改掉项目字符集就行了,
直接在 项目右键-》属性-》配置属性-》常规-》字符集-改为使用多字节字符集
参考资料:
http://blog.csdn.net/guzhou_diaoke/article/details/8801733
http://blog.csdn.net/tinna_zhang/article/details/18654073
http://blog.csdn.net/nachtz/article/details/37775767
最后,感谢以上资料提供者。
- CredentialProvider开发
- window7 登陆机制 CredentialProvider
- 登录方式CredentialProvider的优点
- win7-CredentialProvider使用域账户登录
- msdn 基于credentialprovider的混合凭据提供程序登录体验
- 瀚海电脑锁2012重新CredentialProvider和Gina实现的登陆认证软件
- Com组件的内存分配和释放,CredentialProvider SHStrDup 字符串拷贝问题
- 开发
- 开发!
- 开发
- 开发
- 开发
- 开发
- 开发........
- 开发
- 开发
- 开发
- 开发
- 百度的招聘广告为何比小米差 人工智能告诉你
- 15. 3Sum
- readlines and readline的区别
- 使用DataGridView进行增删改查,并同步到数据库
- IM即时通信(二) 文本传输
- CredentialProvider开发
- SVM算法Python实现语句细节
- LUCKY STRING
- grub启动Linux
- CentOS 7 配置iptables
- python出现super.__init__:TypeError:must be type,not classobj
- linux内核配置与编译、文件系统的制作
- 单源最短路径( Dijkstra算法)JAVA实现
- 我的软件工程目标