2016-04-05 23 views
1

私は、WindowsログオンUIで資格情報が提供される方法を変更するはずの学校プロジェクトに取り組んでいます。 いくつかの検索の後、有名なVista RTM(Longhorn)サンプルとテクニカルドキュメントが見つかりました。私はすべてのサンプルがC++で開発されていることを発見しました。C#のWindows資格プロバイダ

私はC/C++エクスペリエンスを持っていないので、私は自分自身をまともなC#プログラマーと考えています。このC#を実行することが可能かどうかを知りたいと思います。

また、ログインを検証するためにREST APIとデータを交換する必要があるため、C#はより使いやすいものになります。

これは私が見つけたhttps://stackoverflow.com/a/23496878/3626447ですが、@mageosで提供されている情報はあまりにも「生」です。

誰かが役に立つリソースを知っていますか?

+1

http://pgina.org/やプラグインを書くことが許さザッツを想定し、最も簡単な方法です。 –

+0

残念ながら、それは@Alex Kではありません。 これは私の最初のアプローチでしたが、許可されませんでした。 – loveMeansNothing

+0

何か便利なものを見つけられましたか?私も同じボートに乗っています –

答えて

2

あなたが提供するリンクは完全に正しいです。 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

関連する問題