あなたが提供するリンクは完全に正しいです。 ICredentialProvider、ICredentialProviderCredential
最初に、それらを参照できるように公開する必要があります。私の経験では、Windows SDKのIDLを使う方が簡単です。あなたが必要とするidlファイルは\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\um\credentialprovider.idl
になります。
キャッチ#1:あなたがそうでないタイプの唯一の一部が輸出を取得します、library CredentialProviders { ... }
ステートメントにそこにあるすべての定義をラップする必要があります)
あなたのVSネイティブツールを開き、midl
とそのコンパイル: midl "C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\um\credentialprovider.idl"
これは、タイプライブラリ(tlbファイル)を作成します。これは、.NETでタイプをC#タイプに変換するために使用されます。あなたは今、あなたが.NETで使用できる相互運用機能DLLを作成するために
tlbimp
ユーティリティを使用することができます。
tlbimp.exe credentialprovider.tlb /out:CredentialProvider.Interop.dll
キャッチ#2:コンパイルtlbimp
では、残念ながら、メソッド呼び出し(HRESULT
)のための戻り値の型を取り除き、 .NET例外サブシステムを使用する必要があります。この場合、winlogon(またはcredUIホストapp)が例外を再発行し、プロセスを強制終了するため、この機能は動作しません。解決策は、tlbimp2
と呼ばれるユーティリティを使用することです。この時点では、コードプレックスでSVNでホストされています。コードのみが利用可能です。私はコードをダウンロードし、VS2017でツールを再コンパイルする必要がありました(私は添付のレポにアーティファクトをアップロードしました)。 Winlogonのためにコンパイルするためにこれを実行する必要があります:COMオブジェクトを実装できるライブラリを起動することができます。 .NETフレームワークでdllプロジェクトを開始します。プロジェクトを編集し、 "COM interopの登録"フラグが選択されていることを確認します。コンパイルされたInteropライブラリを参照してください。
前述のように、ICredentialProvider、ICredentialProviderCredentialの2つのインターフェイスが実装されている必要があります。コードは次のようになります。
[ComVisible(true)]
[Guid("<random-guid>")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITestWindowsCredentialProvider: ICredentialProvider
{
}
ICredentialProviderCredentialインターフェイスでは、まったく同じことができます。実装に
:すべてのメソッドE_NOTIMPL
から
[ComVisible(true)]
[Guid("<another-unique-id>")] // <-- This is what we are going to use for registration
[ClassInterface(ClassInterfaceType.None)]
public class TestWindowsCredentialProvider : ITestWindowsCredentialProvider
{
private const int E_NOTIMPL = unchecked((int) 0x80004001);
...
public int SetSerialization(ref _CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION pcpcs)
{
return E_NOTIMPL;
}
...
}
に戻ると、すべてのout
パラメータの値を提供します。今私たちは基本的なオブジェクトを持っています。 ICredentialProvider :: GetCredentialAtメソッドを実装するまで、ICredentialProviderCredentialの実装を遅延させることができます。
レジストリ設定HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers
の下にコンポーネントの実装GUID(この中かっこを覚えておいてください)という名前のキーを追加することで、この資格プロバイダを登録できます。
これを実行すると、ログオンサービスとcredUI呼び出しがコンポーネントをロードして照会します。しかし、警告:例外があれば、winlogonのクラッシュにより、にログインできなくなります。ベストプラクティスとしてVMを使用します。
これらの手順をすべて実行した後も、引き続き認証情報プロバイダを実装する必要があります。これはCredential Provider driven Windows Logon Experienceという文書で最もよく説明されています。最終的には、バックグラウンドで実行しなければならない可能性のあるものをUIに編成し、ユーザーにマップする必要があります。
ICredentialProviderCredential :: GetSerializationメソッドの実装に関するユーザー情報を正しくシリアル化すると、ユーザーにログインすることができます。
例
私はこの例を作っている、あなたがそれをここに見つけることができます:https://github.com/phaetto/windows-credentials-provider
http://pgina.org/やプラグインを書くことが許さザッツを想定し、最も簡単な方法です。 –
残念ながら、それは@Alex Kではありません。 これは私の最初のアプローチでしたが、許可されませんでした。 – loveMeansNothing
何か便利なものを見つけられましたか?私も同じボートに乗っています –