アカウントのユーザー名とパスワードを使用して、プログラムでワークステーションのロックを解除するために使用したいWindowsサービスがあります。
この記事 https://technet.Microsoft.com/en-us/library/dn751047(v = ws.11).aspx は、Windowsでのログオン認証ワークフローを次の画像で説明しています:
上記のように、ステップ5で、ユーザーは資格情報をログオンUIに入力します。私が達成したいのは、Windowsサービスに資格情報を入力させ、winlogonにログインを実行させることです。
これを達成するためのwinlogon APIはありません。他の質問で見られるように、winapiのLogonUser
関数を使用すると、認証が正常に実行され、トークンが返されますが、アプリケーションデスクトップに切り替わらず、ログオンUIが画面に残ります。
ほとんどの記事とSOは、資格情報プロバイダーへのヒントに答えますが、すべての資格情報プロバイダーのサンプルは、ログオンUIとのユーザー対話を必要とします。
更新:一部のユーザーが質問を正確に理解しておらず、私の場合には役に立たない回避策を提案しています。私が達成しようとしているワークフローは次のとおりです:
今のところ、ステップ4と4.1を作成することに興味があります。
通過中...しかし、Microsoftのサンプルの中に、非同期入力を受け取る資格情報プロバイダーはありませんか?私は確かに、どのタイルが表示されても、許容できる指紋をスキャンするユーザーにログオンするものを書きました。私にとって、これはLogonUIとの対話が暗黙的である必要があるだけであることを意味しますが、おそらく何かが足りないのです。
しかし、おそらく私はそうではありません。非同期入力は、指をスキャンする場合のように、ハードウェアで動作するユーザーから送られることを意図していることに疑いはありませんが、私はこれを原則として思い出しません。そうでない場合は、資格情報を非同期で収集されたかのように提示するという形で、プログラムによるオプションを使用できます。コンピューターに接続されているデバイスからではなく、HTTPのサイドチャネルから、誰が何を知っているかがわかります。
では、資格プロバイダーがサービスからのRPCをリッスンして、サービスがサイドチャネルを介して収集した資格情報の通知を受け取ることはできますか?または、サービスで資格情報プロバイダーからのRPCをリッスンして、まだ利用可能な資格情報を尋ねますか?たとえセキュリティのためであっても、一方の方向が閉鎖されていても驚かないかもしれませんが、どちらか一方を機能させることができると思っていました。
あなたがこれをしたいかどうかにかかわらず、私は入りたくありません。
私はこれを容認するのではなく、問題の解決策をあなたに与えるだけです。また、プログラムによってWinLogonプロセスと対話することはありません。プログラム的にそれを回避しています。
Windows Autologinプロパティを使用します。そして、再起動してそのユーザーに変更します。これには、パスワードをレジストリにクリアテキストで格納する必要があることに注意してください。
これらのレジストリキーを具体的に設定する
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoAdminLogin HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultUserName HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultPassword
*編集*
4.には役立ちますが、4.1には役立ちません。再起動してロックを解除したくない場合を除きます。
調査する価値があると思われる別の代替案が古い質問で言及されています https://stackoverflow.com/a/35173886/4640588
あなたの仕事は、資格情報プロバイダーのインターフェースを実装することであり、サービスが資格情報を受け取った時点で、それらは簡単にLogonUIに転送できます-これを見てください answer 。
目標は、これらの資格情報をパックできるデフォルトのタイルを実装することです。
私自身の資格情報プロバイダーも、一部のユースケースで自動ログオン/ロック解除動作を持っています。
私が構築しているSeleniumベースのフレームワークに対して、ほぼ同じ要件がありました。要するに、私はユーザー(WinSTA0)のWindowsステーションでアプリケーションを実行する必要がありました。つまり、aユーザーは、 VM。
私はすでに資格情報マネージャーを使用してプロジェクトを作成しており、これを使用して次のワークフローを実現しました。
要件を正しく理解している場合は、サーバー(http、名前付きパイプなど)を公開して、自動ログインの資格情報と接触させる資格情報マネージャーを作成する必要があります。ここでUIに時間を費やす必要はありません。 Advice
実装のITestWindowsCredentialProvider
メソッドを使用してサーバーを起動し、UnAdvice
を使用してサーバーを停止します。
あなたがそこに着くのを助けるために私は以下を提案します:
また、全体像として、これらのすべてのプロセスがWindowsステーション、デスクトップへのアクセス(およびCOMコンポーネントの存続期間)が異なり、異なるユーザーとして実行されることを覚えておく必要があります。しかし、これがあなたにとってあまり関係があるとは思いません。
基本の認証情報マネージャーのコードはここにあります: https://github.com/phaetto/windows-credentials-provider
SasLibExと呼ばれる、これに対する商用ソリューションを作成しました。 SasLibExは、c/c ++とdelphiをネイティブでサポートする開発者向けのライブラリです。
SasLibExは次のことができます。