改造windows開機、鎖屏登陸流程須要使用微軟停供的Credential Providers工程,編譯出來是dll,安裝在C:\windows\system32目錄下,而後註冊註冊表(運行工程生成的Register.reg文件)便可。html
代碼可下載:git
Win7: Samples/Win7Samples/security/credentialproviders
Win8: Samples/CredentialProvidergithub
通常這種工程的開發邏輯是,將本來的用戶密碼登陸改造爲指紋、指靜脈、人臉一類的驗證方式。不過windows系統最終執行的終究仍是用戶名、密碼驗證。只不過在那以前可添加一層攔截,加入指紋、指靜脈、人臉一類的驗證方式,這裏不過的話,直接無限循環後面就進行不了。windows
而後再將保存好的用戶名密碼取出,自動進行windows系統驗證。ide
因而有了一個問題,當用戶,在登陸系統後,經過控制面板更改了用戶密碼。再登陸系統時,程序取出原來存儲的用戶密碼後,就沒法登陸成功了。本來驗證指紋、指靜脈、人臉後即可自動登陸的程序便卡住了。函數
因此,須要在登陸失敗後,彈出窗口要求用戶從新輸入密碼。.net
我最開始想到的是,微軟提供的系統函數:NetUserChangePasswordcode
這個函數實際上是用來修改密碼的。參數須要輸入用戶名、原密碼、新密碼。若是原密碼和新密碼都輸入同一個密碼的話,實際上並無改密碼。但能夠經過返回值判斷這個密碼是否是對的。orm
例如如今系統密碼爲123,調用NetUserChangePassword,輸入原密碼123,新密碼123。等於把123改成123。什麼也沒改,但能夠經過返回值判斷這個密碼是否是對的。htm
若是輸入原密碼321,新密碼321,由於原密碼不符合,因此返回值是錯的。判斷密碼是錯的。
而後我在Credential Providers系統登陸以前,調用NetUserChangePassword判斷密碼是否正確,不對則彈出窗口輸入新密碼。
結果發現無論輸入的密碼是否是對的,NetUserChangePassword返回值都是 錯。
則很奇怪,可能在系統登陸成功以前,NetUserChangePassword仍是沒法調用的吧。
最後我認識到,
Credential Providers這個工程裏面有個函數叫ReportResult。
這裏會返回系統登陸結果,能夠在這裏彈出窗口輸入密碼。
Credential Providers的工程,其餘一些重要函數這裏也說下:
SetUsageScenario函數能夠區分是鎖屏仍是開機,可選擇不一樣界面
Initialize初始化界面
SetSelected初始化界面後選擇顯示什麼
GetSerialization函數,一些登陸前的準備工做,能夠在這裏添加循環和別的驗證方式攔截,另外,登陸判斷是不在這裏
ReportResult返回登陸結果
具體能夠參考這篇文章:https://www.mycode.net.cn/platform/windows/1945.html