本文主要是介绍window7 登陆机制 CredentialProvider,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
下面是我自己弄的一个例子,就是自定义window7登陆,
1.1 首先拦截了其余的登陆方式
1.2 简单的模拟智能卡登陆模式
1.3 模拟智能卡登陆失败,需要输入window登陆密码
才能进入
1.4 里面有俩个项目,看清楚了,下面是项目结构
1.5 关于自定义登陆的一些文章,有详细的介绍
http://baike.baidu.com/link?url=AIJWwcDTVUxlx0CTOPyQCu8UFxzRs-OeL5DI9DI2DQi8xAdBiOTLPrnelx1b1SYGMSToCfFCiklJbh3w0Y–o_
https://blog.leetsys.com/2012/01/02/capturing-windows-7-credentials-at-logon-using-custom-credential-provider/
https://kb.swivelsecure.com/wiki/index.php/Microsoft_Windows_Credential_Provider_Integration
https://github.com/LastSquirrelIT/MultiOneTimePassword-CredentialProvider
1.6项目下载 ,包括微软的五个例子
http://download.csdn.net/detail/li740207611/9497173
SSCredProvider__ 我的
Untitled Folder 微软的,里面有些我也修改了,没有原版得了
1.7使用 就是运行相应项目目录下面的 Register.reg
把登陆的dll 或者fileter 添加到注册表里面。然后把项目自带的或者生成的dll拷贝到
c/window/system32/ 目录下面
注意:这些是在32位的操作系统下面进行的,如果想兼容64位系统,首先需要使用vs生成属性平台改为64位,然后生成64位的dll,就可以了。如果是32位的dll是不行的。
细节
CSSCredential.h文件 控件的定义
CSSCredential.cpp文件
初始化
ISSUnknown_REF_IMPL(CSSCredential)CSSCredential::CSSCredential()
{SS_AUTO_FNC_TRACE;SSWACredProvAddRef();ISSUnknown_REF_INIT;m_cpus = CPUS_INVALID;m_dwCredUIFlags = 0;m_pCredentialProvider = NULL;m_pcpce = NULL;loginSuccess = 0;SS_AUTO_FNC_TRACE;int x = 0;for(x=0; x<_countof(m_pwszFieldStrings); x++){m_pwszFieldStrings[x] = NULL;::SHStrDupW(L"", &m_pwszFieldStrings[x]);}//在这里设置链接和登录的图标下面显示的字符::CoTaskMemFree(m_pwszFieldStrings[SSFI_LARGE_TEXT]);//设置显示的用户名::SHStrDupW(L"Logan", &m_pwszFieldStrings[SSFI_LARGE_TEXT]);::CoTaskMemFree(m_pwszFieldStrings[SSFI_COMMAND_LINK]);//设置显示的链接名字::SHStrDupW(L"your link", &m_pwszFieldStrings[SSFI_COMMAND_LINK]);::CoTaskMemFree(m_pwszFieldStrings[SSFI_SUBMIT_BUTTON]);//设置提交按钮显示::SHStrDupW(L"Submit", &m_pwszFieldStrings[SSFI_SUBMIT_BUTTON]);}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
动态控件显示
STDMETHODIMP CSSCredential::SetSelected(BOOL *pbAutoLogon)
{SS_AUTO_FNC_TRACE;//在这里可以进行,登录界面图标的隐藏的切换,当点击登录或者Enter 键的时候if(loginSuccess == 1){//当window密码和pin码不一样的时候,就弹出密码框::MessageBox(::GetForegroundWindow(), TEXT("请在输入框输入Windows密码"), TEXT("Windows 密码错误"), MB_ICONQUESTION|MB_OK);//set SSFI_PASSWORD to visiablem_pcpce->SetFieldState(this,SSFI_PASSWORD,CPFS_DISPLAY_IN_SELECTED_TILE);/*设置提交按钮在密码框后面 SSFI_SUBMIT_BUTTON是提交按钮控件的id,后面的是密码的更详细的姐失控可以看msdn 都有解释*/m_pcpce->SetFieldSubmitButton(this, SSFI_SUBMIT_BUTTON, SSFI_PASSWORD);}*pbAutoLogon = FALSE;return S_OK;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
提交按钮控件
//修改提交按钮显示的位置,初始化的时候使用,动态显示需要在SetSelected 控制
STDMETHODIMP CSSCredential::GetSubmitButtonValue(DWORD index, DWORD *pdwAdjacentTo)
{SS_AUTO_FNC_TRACE;if(m_cpus == CPUS_CHANGE_PASSWORD){*pdwAdjacentTo = SSFI_NEWPASSWORD_CONFIRM;} else {//set submit keyboard follow the SSFI_PIN//::MessageBox(::GetForegroundWindow(), TEXT("pin"), TEXT("submit"), MB_ICONQUESTION|MB_YESNO);//设置提交按钮在哪个控件后面显示*pdwAdjacentTo = SSFI_PIN;}return S_OK;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
获取用户输入信息
CSSCredential::GetSerialization(CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE *pcpgsr, CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION *pcpcs, PWSTR *ppwszOptionalStatusText, CREDENTIAL_PROVIDER_STATUS_ICON *pcpsi)
{SS_AUTO_FNC_TRACE;LPWSTR lpPasswordEncrypted = NULL;LPWSTR lpPasswordNewEncrypted = NULL;LPWSTR lpDomainUsername = NULL;BYTE *pRgb = NULL;DWORD cbRgb = 0;SS_LOG_V(LL_TRACE, _T("CredInfo : %s,%s"), m_pwszFieldStrings[SSFI_USERNAME], m_pwszFieldStrings[SSFI_PASSWORD]);//设置用户名 SSFI_USERNAME 是id ,在定义控件的地方看看都有SetStringValue(SSFI_USERNAME,L"logan");//下面是用户名 密码 还有pin码的获取PWSTR pin_psw = NULL;GetStringValue(SSFI_PIN, &pin_psw);::MessageBox(::GetForegroundWindow(), pin_psw, TEXT(" pin "), MB_ICONQUESTION|MB_YESNO);CoTaskMemFree(pin_psw);loginSuccess = 1;//为了动态显示密码输入框 主要是为了测试PWSTR u_psw = NULL;GetStringValue(SSFI_USERNAME,&u_psw);::MessageBox(::GetForegroundWindow(), u_psw, TEXT(" usename"), MB_ICONQUESTION|MB_YESNO);CoTaskMemFree(u_psw);PWSTR psw = NULL;GetStringValue(SSFI_PASSWORD,&psw);::MessageBox(::GetForegroundWindow(), psw, TEXT(" password "), MB_ICONQUESTION|MB_YESNO);CoTaskMemFree(psw);//下面的是系统的,不用管}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
这篇关于window7 登陆机制 CredentialProvider的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!