1

私は、さまざまな Windows サービスがプライベート ネットワーク内のさまざまなコンピューターで実行されるシステムに取り組んでいます。ネットワーク内のどのコンピューターでも、これらのサービスとリモートで対話するクライアント アプリケーションを実行できます。パッケージの一部として、ユーザーがネットワーク内のサービスに問題が発生しているかどうかを確認し、ダウンしているサービスを再起動できる機能があります。

これを機能させるために、ユーザーの偽装Service Controller クラスを使用しました。ダウンしたサービスをホストしているコンピューターの管理者アカウントのユーザー名とパスワードをユーザーに提供し、その管理者になりすまして、ServiceController でサービスを再起動するようユーザーに求めます。これはほとんどの状況で機能しますが、一部のサーバーでは管理者になりすますことができません。私の理解では、ユーザーの偽装が機能するには、偽装されるアカウントがローカル マシンまたは Active Directory グループの一部にある必要がありますが、問題のサーバーにはローカルのアカウントしかありません。

LogonUser偽装を開始するメソッドには多くのパラメーターがあることに気付き、それらのパラメーターのいずれかが私の問題を解決するかどうかを確認するためにそれらを試し始めました。LogonType の値を "New Credentials" (9) に設定しようとしたところ、奇妙な (しかし役立つ可能性がある) 動作が見られました。

  • 以前は使用できなかったサーバーでサービスを再起動できます
  • ダウンしたサービスを再起動しようとして間違ったパスワードを入力しても、サービスは再起動されます。

この動作が見られるのはなぜですか? この理由が正しければ、この設定を使用して、ユーザーにログインを求めることを完全になくすことができます。

4

1 に答える 1

1

私は何が起こっているのかを理解しました:

偽装時に現在のユーザー名を取得する によると、新しい資格情報のログオン タイプで偽装を使用する場合、偽装されたスレッドは、ローカル コンピューターに送信されるすべてのコマンドに対して引き続き元のユーザーとして機能します。他のコンピュータにコマンドを送信する場合にのみ、偽装されたユーザーとして機能します。

これが、正しいパスワードを提供する必要がないことに気付いた理由です。サーバーにダウンしたユーザーがいて、そのサーバーで管理者としてクライアント アプリを実行して再起動しようとすると、再起動しません。私がどんな認証情報を提供するかは問題ではありません。サービスの再起動にはローカル コンピューターとの対話のみが含まれるため、偽装されたスレッドは引き続き管理者アカウントを使用します。入力した新しい資格情報は事実上無視されます。

ちなみに、これは、ローカル コンピューターでサービスを再起動しようとするときにのみ、間違ったユーザー名とパスワードを入力できるようにする必要があることを意味します。これをもう少しテストしたところ、それが私が観察したことです。

そのため、入力したパスワードを気にする必要はないように見えました。Active Directory グループにアカウントを持たないコンピューターにアクセスするにはどうすればよいでしょうか。この記事によると、「NewCredentials LogonType [...] はクロス ドメインを認証します。」何が起こるか正確にはわかりませんが、新しい資格情報は Active Directory に対してまったく認証を試みていないようです。私の推測では、偽装された資格情報がアクセスされているコンピューターに直接送信され、ローカル アカウントの偽装が可能になっていると思われます。

私が取り組んでいたプロジェクトでは、これは、ユーザーがサービスを再起動しようとするときに資格情報を要求する必要があることを意味しますが、Active Directory アカウントを持つように構成されていない場合でも、任意のサーバーでサービスを再起動できるようになりました。

于 2012-07-31T16:14:51.820 に答える