本次小学期的题目是windows下的凭证改编。本人负责的是Win7 下的credentials Provider 的编写以及其他杂七杂八的工作。当然给我印象最深的就是credentials provider的部分。作为一个比较新的技术(个人感觉在现在中国的局域网上能找的信息中,只要是在xp之后的技术,资料都是少得可怜。),资料少的可怜。在百度,这个关键词到了第三页的信息中中文信息就没有用了。谷歌被墙了,实际上在谷歌中,基本上也找不到有用的中文信息。至于在msdn中貌似只有英文贴。所以基本上能用的信息算是比较少的。

下面贴出一些我在寻找过程中比较有用的网页。

MSDN 上提供的示例:http://www.microsoft.com/en-us/download/confirmation.aspx?id=5372

WindowsVista Sample Credential Providers Overview 中文翻译http://blog.csdn.net/linbaotong/article/details/7925645

改编一个属于你自己的凭证:http://blog.csdn.net/mikefeng/article/details/1569475

一些相关的知识:http://blog.csdn.net/patdz/article/details/7522195

(下面全部以SampleAllControlsCredentialProvider为例)

首先是界面方面的修改。示例中credential provider 的界面编写的语言不祥。但可以肯定的是界面不是用mfc编写的。实际上,如果是要改写示例的话,千万不要用MFC的任何相关的东西,包括CString。否则就会出现这样的情况。

在改写界面的话,主要改写的内容是:

common.h(line 25), 这一部分的内容,你可以在这部分中添加你想要的元素的序号。注意注释中强调的,SFI_NUM_FIELDS必须放在最后一个,否则会出现奇怪的问题。

之后是staticconstFIELD_STATE_PAIRs_rgFieldStatePairs[]以及staticconstCREDENTIAL_PROVIDER_FIELD_DESCRIPTORs_rgCredProvFieldDescriptors[]的内容。同样是添加你所想要的表项。比如我修改如下:

(图中修改的内容是去掉了checkbox和combobox,commandink,添加了一个pin码的写入框)

至此,common.h上的修改已经结束了。

之后转到CSampleCredentialc.cpp中修改。

HRESULTCSampleCredential::Initialize(

constCREDENTIAL_PROVIDER_FIELD_DESCRIPTOR*rgcpfd,

constFIELD_STATE_PAIR*rgfsp

)

修改初始化函数,按照他自己给你的格式修改即可。

界面的修改就到此结束了。

在界面修改后,如果你要使你的组件工作,只要改写诸如HRESULTCSampleCredential::GetComboBoxValueCount(

DWORDdwFieldID,

DWORD*pcItems,

DWORD*pdwSelectedItem

) 一类的函数既可以了。

之后便是认证的部分。

在认证部分,你只需要修改CSampleCredential::GetSerialization这一部分的内容即可。

关于这一部分,示例中的代码给原理是:

读取账户密码框的数据,写入变量KERB_INTERACTIVE_LOGONkil; 中,然后改写标记:

*pcpgsr=CPGSR_RETURN_CREDENTIAL_FINISHED; 这个标记一旦被写入了。在登陆的过程中我们程序的部分就结束了。

在这一部分中,需要注意的是kil中的账户密码必须是windows中存在的账户密码。也就是

说如果你想要用自己的账户密码来登陆,你的程序中就需要在编写的时候写入系统的账户密码。比如下面这样:

hr=UnicodeStringInitWithString(L"Administrator",&kil.UserName);

hr=UnicodeStringInitWithString(L"",&kil.Password);

整个改写的过程基本上就是这样。Over.

之后是使用你的凭证,运行你的运行包中提供的注册表文件,然后把生成的dll文件复制到system32中即可。注意的是如果要提示你是否覆盖的话,最好先删掉原来的程序再试。

然后就是多个凭证的问题。在win7后会存在有多个凭证。如果你想要系统中只存在一个凭证的话,你就需要这么做:

备份(千万要记得备份!)

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\CredentialProviders里面的东西后,再删除掉所有的东西(这个过程中有一两个凭证不可删除,很正常)。然后安装你自己的凭证,到时候你就会发现登录的时候只存在你自己的凭证。

不过程序中还是没有解决的问题就是示例在锁定之后就无法正常登录,只能切换系统自带的凭证来登陆。

程序的最后效果如下:

最后附上一个肯定会有用的函数,unicode字符转char*。

boolUnicodeToAnsi(constWCHAR*pSrc,char*pDes)

{

chardefaultChar[100];

BOOLbUseDefaultChar;

intiByte=WideCharToMultiByte(CP_ACP,0,pSrc,-1,pDes,1024,defaultChar,&bUseDefaultChar);

if(iByte==0)

{

//_stprintf(tszErrMsg,theApp.GetText(_T("%s, cann't convert the source to ansi code page, theerror code is 0x%x\n")).c_str(), lpszInput, GetLastError());

//AfxMessageBox(tszErrMsg);

}

returntrue;

}

http://blog.csdn.net/nachtz/article/details/37775767

『转』credential Provider 简易改写攻略的更多相关文章

  1. 圣魔大战3(Castle Fantisia)艾伦希亚战记完美攻略

    作为城堡幻想曲系列续作,艾伦希亚战记继承了前作的战棋+养成模式进行游戏. (城堡幻想曲3,纠正大家个错误哦,不是圣魔大战3,圣魔大战是城堡幻想曲2,圣魔大战不是个系列,艾伦西亚战记==艾伦希亚战记,一 ...

  2. 『片段』OracleHelper (支持 多条SQL语句)

    C# 调用 Oracle 是如此尴尬 >System.Data.OracleClient.dll —— .Net 自带的 已经 过时作废. >要链接 Oracle 服务器,必须在 本机安装 ...

  3. [日推荐] 『Streeter』极乐商店邀你一起来尬舞啊!-store.dreawer.com

    你听的舞蹈有哪些?Jazz?Poppin?Hiphop?现代舞?民族舞?... 今天推荐一款小程序『Streeter』,几乎包含所有舞蹈视频,偷偷学好了,邀请你来尬舞啊 Streeter 这个Logo ...

  4. 『TensorFlow』模型保存和载入方法汇总

    『TensorFlow』第七弹_保存&载入会话_霸王回马 一.TensorFlow常规模型加载方法 保存模型 tf.train.Saver()类,.save(sess, ckpt文件目录)方法 ...

  5. 『计算机视觉』Mask-RCNN_训练网络其一:数据集与Dataset类

    Github地址:Mask_RCNN 『计算机视觉』Mask-RCNN_论文学习 『计算机视觉』Mask-RCNN_项目文档翻译 『计算机视觉』Mask-RCNN_推断网络其一:总览 『计算机视觉』M ...

  6. 『cs231n』通过代码理解风格迁移

    『cs231n』卷积神经网络的可视化应用 文件目录 vgg16.py import os import numpy as np import tensorflow as tf from downloa ...

  7. 『计算机视觉』Mask-RCNN_推断网络其三:RPN锚框处理和Proposal生成

    一.RPN锚框信息生成 上文的最后,我们生成了用于计算锚框信息的特征(源代码在inference模式中不进行锚框生成,而是外部生成好feed进网络,training模式下在向前传播时直接生成锚框,不过 ...

  8. 『计算机视觉』Mask-RCNN_推断网络其二:基于ReNet101的FPN共享网络暨TensorFlow和Keras交互简介

    零.参考资料 有关FPN的介绍见『计算机视觉』FPN特征金字塔网络. 网络构架部分代码见Mask_RCNN/mrcnn/model.py中class MaskRCNN的build方法的"in ...

  9. 『TensorFlow』SSD源码学习_其五:TFR数据读取&数据预处理

    Fork版本项目地址:SSD 一.TFR数据读取 创建slim.dataset.Dataset对象 在train_ssd_network.py获取数据操作如下,首先需要slim.dataset.Dat ...

随机推荐

  1. Ugly Number II leetcode java

    问题描述: Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime fa ...

  2. 移动端自动化测试-Mac-IOS-Appium环境搭建

    第一步 安装JDK,本机如果带有1.7及以上版本的,则可忽略此安装步骤. 百度下载JDK,并配置环境变量 vim ~/.bash_profile 检查是否安装成功 java -version 第二步 ...

  3. 第二阶段——个人工作总结DAY03

    1.昨天做了什么:昨天实现了一个活动跳转到另一个活动. 2.今天做了什么:今天打算将所有的都实现,并且只用一个监听事件封装. 3.遇到的困难:无.

  4. 4月18 数据库的CRUD操作

    php主要是实现B/S Brower Server;此外还有C/S:Client Server暂时不考虑: LAMP: Linux系统 A阿帕奇服务器 Mysql数据库 Php语言,而现在学的是在wi ...

  5. mysql使用sql语句根据经纬度计算距离排序

    CREATE TABLE `locationpoint` ( `id` int(11) NOT NULL, `province` varchar(20) NOT NULL, `city` varcha ...

  6. Echarts 简单报表系列四:雷达图

    代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  7. jackson实体转json时 为NULL不参加序列化的汇总

    首先加入依赖 <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson ...

  8. MSSQL索引视图(indexed view)之简述及使用

    乍一听到这个名字,可能感到有点陌生,这个对象是干嘛的呢?原理是什么?不用着急,我们看看下面的内容,慢慢就明白了.顾名思义,索引视图就是建有索引的视图,这是MSSQL提供的一项技术,用于提升某些SQL语 ...

  9. jvm加载类(更新中)

    作为jvm的用户,从使用者角度来看,我们给jvm输入一个class文件,得到了一个Class对象.我们可以猜想下jvm加载类的过程:class文件有规定的格式,jvm去解析class文件流,读magi ...

  10. jetty隐藏版本号教程

    一.查看版本号 直接访问端口不像apache/tomcat/nginx会直接有版本号 但实际查看返回http头时还是带着版本号 二.隐藏版本号操作 编缉$JETTY_HOME/start.ini将je ...