web-dev-qa-db-ja.com

プログラムでwinlogonと対話する方法は?

アカウントのユーザー名とパスワードを使用して、プログラムでワークステーションのロックを解除するために使用したいWindowsサービスがあります。

この記事 https://technet.Microsoft.com/en-us/library/dn751047(v = ws.11).aspx は、Windowsでのログオン認証ワークフローを次の画像で説明しています: authentication workflow

上記のように、ステップ5で、ユーザーは資格情報をログオンUIに入力します。私が達成したいのは、Windowsサービスに資格情報を入力させ、winlogonにログインを実行させることです。

これを達成するためのwinlogon APIはありません。他の質問で見られるように、winapiのLogonUser関数を使用すると、認証が正常に実行され、トークンが返されますが、アプリケーションデスクトップに切り替わらず、ログオンUIが画面に残ります。

ほとんどの記事とSOは、資格情報プロバイダーへのヒントに答えますが、すべての資格情報プロバイダーのサンプルは、ログオンUIとのユーザー対話を必要とします。

更新:一部のユーザーが質問を正確に理解しておらず、私の場合には役に立たない回避策を提案しています。私が達成しようとしているワークフローは次のとおりです:

  1. WindowsサービスはWindowsの起動時に開始されます(完了)。
  2. 同じWindowsサービスにはWebサービスがあり、API(完了)を介してHTTP要求を受け入れます。
  3. ユーザーは、別のデバイスからAPIを介してサービスに資格情報を提供します(完了)。
  4. 提供された資格情報は、ワークステーションへのログインに使用されます。
    4.1提供された資格情報は、ロック(WinKey + L)の場合にワークステーションのロックを解除するためにも使用されます。
  5. (オプション)サービスは、APIを介してWindowsアカウントを公開します。
  6. (オプション)ユーザーは、ログインに使用するアカウントをサービスに指定できます。

今のところ、ステップ4と4.1を作成することに興味があります。

28
Dog

通過中...しかし、Microsoftのサンプルの中に、非同期入力を受け取る資格情報プロバイダーはありませんか?私は確かに、どのタイルが表示されても、許容できる指紋をスキャンするユーザーにログオンするものを書きました。私にとって、これはLogonUIとの対話が暗黙的である必要があるだけであることを意味しますが、おそらく何かが足りないのです。

しかし、おそらく私はそうではありません。非同期入力は、指をスキャンする場合のように、ハードウェアで動作するユーザーから送られることを意図していることに疑いはありませんが、私はこれを原則として思い出しません。そうでない場合は、資格情報を非同期で収集されたかのように提示するという形で、プログラムによるオプションを使用できます。コンピューターに接続されているデバイスからではなく、HTTPのサイドチャネルから、誰が何を知っているかがわかります。

では、資格プロバイダーがサービスからのRPCをリッスンして、サービスがサイドチャネルを介して収集した資格情報の通知を受け取ることはできますか?または、サービスで資格情報プロバイダーからのRPCをリッスンして、まだ利用可能な資格情報を尋ねますか?たとえセキュリティのためであっても、一方の方向が閉鎖されていても驚かないかもしれませんが、どちらか一方を機能させることができると思っていました。

あなたがこれをしたいかどうかにかかわらず、私は入りたくありません。

2
Geoff Chappell

私はこれを容認するのではなく、問題の解決策をあなたに与えるだけです。また、プログラムによって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

1
MrMikeJJ

あなたの仕事は、資格情報プロバイダーのインターフェースを実装することであり、サービスが資格情報を受け取った時点で、それらは簡単にLogonUIに転送できます-これを見てください answer

目標は、これらの資格情報をパックできるデフォルトのタイルを実装することです。

私自身の資格情報プロバイダーも、一部のユースケースで自動ログオン/ロック解除動作を持っています。

0
Alexander

私が構築しているSeleniumベースのフレームワークに対して、ほぼ同じ要件がありました。要するに、私はユーザー(WinSTA0)のWindowsステーションでアプリケーションを実行する必要がありました。つまり、aユーザーは、 VM。

私はすでに資格情報マネージャーを使用してプロジェクトを作成しており、これを使用して次のワークフローを実現しました。

  • VMを起動し、Powershellでコンポーネントをコピーする
  • CredManagerをインストールし、VMを再起動します
  • Cred Managerはランダムなユーザーを作成し、データベースに保存します
  • そのユーザーでログインします
  • ユーザーはアプリケーションのレジストリで自動起動し、アプリケーションはSeleniumセッションをスピンするために接続できるWebサーバーを起動します

要件を正しく理解している場合は、サーバー(http、名前付きパイプなど)を公開して、自動ログインの資格情報と接触させる資格情報マネージャーを作成する必要があります。ここでUIに時間を費やす必要はありません。 Advice実装のITestWindowsCredentialProviderメソッドを使用してサーバーを起動し、UnAdviceを使用してサーバーを停止します。

あなたがそこに着くのを助けるために私は以下を提案します:

  • (app-insightsなどの)外部ロギングサービスを使用して、サービスのフィードバックを取得し、デバッグを容易にする
  • VMを使用してください。Winlogonで重大な障害が発生すると、コンピューターが役に立たなくなります。
  • COMコンポーネントの実装ですべてのメソッドのより高いレベルでtry catchを使用して、例外を飲み込み、winlogonのクラッシュを保存します。

また、全体像として、これらのすべてのプロセスがWindowsステーション、デスクトップへのアクセス(およびCOMコンポーネントの存続期間)が異なり、異なるユーザーとして実行されることを覚えておく必要があります。しかし、これがあなたにとってあまり関係があるとは思いません。

基本の認証情報マネージャーのコードはここにあります: https://github.com/phaetto/windows-credentials-provider

SasLibExと呼ばれる、これに対する商用ソリューションを作成しました。 SasLibExは、c/c ++とdelphiをネイティブでサポートする開発者向けのライブラリです。

SasLibExは次のことができます。

  • Ctrl Alt Del(Secure Attention Sequence)のシミュレーション
  • Ctrl Alt Delをキャンセル
  • ワークステーションをロック
  • ワークステーションのロックを解除(資格情報なし)
  • Ctrl Alt Delを無効にする
  • Ctrl Alt Delを再度有効にする
  • 保留中のUACリクエストをキャンセルする
  • デスクトップがロックされています

https://www.remkoweijnen.nl/blog/tag/saslibex/ を参照してください

0
Remko