※ 反灰部分請略過 ,是我研究後失敗的部分,但留存以備不時之需
最近需要研究自動登入功能
在網路上看到有一玩意兒叫做Credential Provider
就下載了一個範例來玩玩
步驟1:用VMware新增一個win10來測試
絕對務必要用VM試,除非你有信心改完程式登入不了後,還有其他辦法進去桌面
※ 我VM裝的是win10家用版,安裝的時候宿主機不會連網,因為若連網的話,
會需要輸入信箱帳密跟強迫設定登入pin碼,我覺得多這步很煩...
-> VM作以下設定才可以把檔案傳給VM用
Select the virtual machine and select Player > Manage > Virtual Machine Settings.
On the Options tab, select Shared Folders. 把設定設一設
然後宿主機這邊跟vm分享的資料夾也要按右鍵->properties -> Sharing把設定設一設
步驟2:下載範例專案
https://github.com/phaetto/windows-credentials-provider https://github.com/SteveSyfuhs/CredProvider.NET
-> 用Visual Studio 以admin權限開啟專案,並在Reference加入midl/CredProvider.NET.Interop2.dll
-> 我要試自動登入功能,需要修改程式碼一些地方
1. 開啟WindowsCredentialProviderTest\TestWindowsCredentialProviderTile.cs
//#define AUTOLOGIN 拿掉註解
2. WindowsCredentialProviderTest\TestWindowsCredentialProvider.cs
把SetUsageScenario改成這樣
case _CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_CREDUI:
case _CREDENTIAL_PROVIDER_USAGE_SCENARIO.CPUS_LOGON:
return HResultValues.S_OK;
註:Windows 10, 無論已經log in還是 session被locked,_CREDENTIAL_PROVIDER_USAGE_SCENARIO都是返回CPUS_LOGON
3. WindowsCredentialProviderTest\TestWindowsCredentialProviderTile.cs
GetSerialization function裡的username跟password 寫死 ,像這樣
var username = @".\yuan"; 紅的明顯,.\這個一定要加,代表domain
var password = "12";
另外,若安裝win os的時候是設定用pin登入,要改成用本機帳戶
-> 在project CredProvider.NET
WindowsCredentialProviderTest上按右鍵 ->properties -> build ->
最底下output那邊勾選 register for COM interop ->用X64編譯專案
-> build的時候會有一些error,把using CredProvider.NET.Interop改成using CredProvider.NET.Interop2;
再build一次應該就沒問題了。
-> 把 register-credentials-provider.reginstall.reg(在下載的專案裡面,自己搜尋一下)跟
build出的WindowsCredentialProviderTest.dll
Syfuhs.Security.CredentialProvider.Tester.exe & CredProvider.NET.dll
放到vm存取的到的share folder,供vm使用
步驟3(最後一步):開始在vm 試囉
-> 把share folder裡的CredProvider.NET.dllWindowsCredentialProviderTest.dll複製一份到
C:\Windows\System32
-> 使用regasm手動註冊com interop。Admin開cmd,下指令:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe "C:\Windows\System32\WindowsCredentialProviderTest.dll" /tlb /codebase)
註:unregister regasm.exe /unregister %WorkFolder%\xxx.dll
-> VM裡雙擊share folder裡的install.reg register-credentials-provider.reg,不用重開機,直接win+L lock screen
可以看到多一個登入選項,見下圖藍底Seconds passed...,倒數結束後就會登入了
進階玩法
-> copy from https://www.cnblogs.com/nightnine/p/7132658.html
●更改Tile Image
WindowsCredentialProviderTest\TestWindowsCredentialProviderTile.cs
new _CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR
{
cpft = _CREDENTIAL_PROVIDER_FIELD_TYPE.CPFT_TILE_IMAGE,
dwFieldID = 0,
pszLabel = "Icon",
},
new _CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR
{
cpft = _CREDENTIAL_PROVIDER_FIELD_TYPE.CPFT_SMALL_TEXT,
dwFieldID = 1,
pszLabel = "Rebootify",
guidFieldType=Guid.Parse("286BBFF3-BAD4-438F-B007-79B7267C3D48" ) ,
},
new _CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR
{
cpft = _CREDENTIAL_PROVIDER_FIELD_TYPE.CPFT_SUBMIT_BUTTON,
dwFieldID = 2,
pszLabel = "Login",
}
....
public int GetBitmapValue(uint dwFieldID, IntPtr phbmp)
{ ....
//phbmp = IntPtr.Zero; // TODO: show a bitmap
//+++
Bitmap tileIcon ;
tileIcon = new Bitmap(@"C:\Users\xxxxx\Desktop\xxxxxx.bmp");//換成你自己的圖檔路徑
Marshal.WriteIntPtr(phbmp, tileIcon.GetHbitmap()); //2020.03.26 Yuan:can't write this :phbmp = tileIcon.GetHbitmap();
it'll get negative return value
return HResultValues.S_OK;
//---
//return HResultValues.E_NOTIMPL;
}
效果如下圖
C:\Users\<accountName>\AppData\Roaming\Microsoft\Windows\AccountPictures 帳戶圖片路徑
Trouble shooting
●VM才用一陣子,宿主機的硬碟空間一直被吃掉,超靠杯的,
查了一下發現兇手在working directory裡面↓
打開working directory,holy shit!!!!!! 怎麼有那麼多snapshot
如果直接砍掉的話,vm會打不開
但我用的vmware版本是vmware workstation 14 player
根本沒有可以關掉跟刪除snapshot的選項
只好按這裡去下載pro版 ↓
pro版裡面就可以在options裡面找到snapshot的選項,預設是不會存。
參考資料:
Credential Providers in Windows 10
https://docs.microsoft.com/en-us/windows/win32/secauthn/credential-providers-in-windows
Credential provider usage scenario: CPUS_UNLOCK_WORKSTATION removed from Windows 10
★Creating Custom Windows Credential Providers in .NET 此篇文章主要參考這
https://syfuhs.net/2017/10/15/creating-custom-windows-credential-providers-in-net/