window7 登陆机制 CredentialProvider

window7 登陆机制 CredentialProvider

example

下面是我自己弄的一个例子,就是自定义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]);

}

动态控件显示

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 visiable
     m_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;
}

提交按钮控件

//修改提交按钮显示的位置,初始化的时候使用,动态显示需要在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;
}

获取用户输入信息

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);



    //下面的是系统的,不用管
  }
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
Window 7是微软推出的一款操作系统,采用了更加灵活实用的用户界面以及更加强大的应用程序性能,广泛应用于各个领域。而远程银河麒麟是一种远程桌面软件,它能够将不同系统的设备连接到同一个网络当中,实现跨平台远程控制,大大提高了工作效率。将这两者结合起来,就可以实现在Window 7操作系统上对远程银河麒麟进行远程控制。 Window 7远程银河麒麟具有诸多优势。首先,远程控制可以省去很多不必要的设备开销,只需要一个主机就可以连接到其他设备进行控制,这对于一些财政有限的单位来说十分节省成本。其次,远程控制可以加强单位内部的信息安全,因为所有数据只需要在一个主机上传输,大大减少了数据泄露的风险。此外,远程控制可以快速响应工作需求,在需要时随时进行远程操作,大大提高了工作效率。 当然,在使用Window 7远程银河麒麟时也要注意一些问题。首先,网络环境要保证稳定,否则会影响远程连接的质量。另外,远程控制是需要权限设置的,需要确保只有经过授权的人员才能进行远程操作,保证信息的安全性。最后,还需要关注软件的使用问题,及时更新和维护软件版本,确保软件的稳定性和功能强大性。 总之,Window 7远程银河麒麟的使用可以大大提高工作效率和信息安全性,是一个十分优秀的远程控制软件。同时,在使用中也需要注意一些问题,确保软件使用的稳定性和正确性。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值