credential Provider 簡易改寫攻略

本次小學期的題目是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;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章