赞
踩
看到网上关于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下划线的控件的执行函数。
我直接贴代码吧://显示注册Dl
- 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
最后,感谢以上资料提供者。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。