3

小さなサービス (プレーンな Win32) を作成しましたが、複数のユーザーがログオンしているときにそのサービスの複数のインスタンスを実行できるかどうかを知りたいです。

基本的に、UserA には UserA と UserB があり、サービスは "domain\UserA" としてログオンし、UserB ではサービスは "domain\UserB" としてログオンするとします。これはもちろん同じ実行可能ファイルからのものです。ChangeServiceConfig() 関数を使用してログオンを動的に変更できますが、システム全体で変更されているように見えますが、各ユーザーに自分専用のサービスのコピーを実行させたいと考えています。

ご指摘ありがとうございます。

4

11 に答える 11

2

Win32 サービスは、システム全体で動作するように設計されており、ユーザーがログインする前に実行を開始します。ユーザーごとに何かを実行したい場合は、通常のアプリケーションとして設計し、ユーザーのスタートアップから実行することをお勧めします。グループ。

于 2008-09-22T05:22:06.880 に答える
0

別のアカウントで実行することが可能です。実際、これは一般的です。一連のOSサービスを実装するsvchost.exeを参照してください。

どのアカウントを決定するのかわかりません。大企業では、10万人以上の従業員全員が使用できるように多くのPCが設置されています。ログインしたユーザーとしてサービスを実行したり、100.000人のユーザー全員に対してサービスを実行したりすることはできません。では、どのアカウントについて、私は尋ねなければなりませんか?

于 2008-09-22T15:07:57.173 に答える
0

タイミングとアイデンティティに関して、実際には2つの異なる矛盾する要件があるように聞こえます。

  1. ログインした各ユーザーとして実行
  2. ログインしているユーザーがいない場合でも、自動的に実行されます。

これを簡単に行う方法はありません。代わりに、プログラムをサービスでラップすることを検討してください。プログラムは、各ユーザーの起動時に(起動フォルダーまたはタスクスケジューラを介して)正常に実行され、さらに、アプリをシステムユーザー(または定義した他のユーザー)として実行するサービスを作成します。
エンドユーザーがログアウトした後もアプリを実行し続ける必要があるため(コメントでこれについて言及します)、サービスにこのプロセスを管理させることができます。

ただし、ユーザーはまだ効果的にログインしているため、これは最善のアイデアではない可能性があります。これには、セキュリティ、パフォーマンス(一度にログインするユーザーが多すぎる...)など、さまざまな副作用が発生する可能性があります。

于 2008-09-22T06:05:16.277 に答える
0

Windows プロセスは、一度に 1 人のユーザーの権限でのみ実行できます。これは、サービスおよびその他のプロセスに適用されます。十分な権限があれば、偽装を使用して異なるユーザーを「切り替える」ことができます。あなたがやろうとしていることの最も一般的なパターンは、ログイン/ログアウトイベントに登録し、それに応じて子プロセスを作成する特権サービスのインスタンスを1つ持つことです。それぞれがログインしたユーザーになりすます. このパターンは、各プロセスが各ユーザーのデスクトップで実行されるため、通常のアプリケーションのように UI も簡素化します。

特権サービスのコードをできるだけ単純に保つと、このパターンには、コードの攻撃面を最小限に抑えるという追加の利点があります。ユーザーがサービスの「ユーザーとして実行」側でセキュリティの問題を見つけた場合、それは問題ではありませんが、特権サービスでのセキュリティの問題は特権昇格につながる可能性があります。実際、Windows メッセージ処理ループを実装する Vista 以前の特権サービスは、Shatter 攻撃と呼ばれるタイプの攻撃に対して脆弱であり、実行しようとしていることに注意する必要があります。

于 2008-09-22T15:20:21.467 に答える
0

はい、それは近いですね (Greg からのコメントに回答していますが、コメントが短すぎて回答に収まりません)。

ユーザーのリストは事前にわかりませんが、各ユーザーのユーザー名とパスワードのペアを入力するために使用される GUI コントロール アプリケーションがあります。したがって、userA はログオンし、アプリケーションを実行し、資格情報を入力すると、サービスはそれを使用します。同時に (userA がログオフした後でも、サービスはまだ userA の資格情報で実行されています)、userB がログオンしてアプリを使用し、ログオンした userB としてサービスの別のコピーが実行を開始します。したがって、同時に userA サービスと userB サービスが実行されます。

それは可能ですか?

于 2008-09-22T05:29:25.770 に答える
0

おそらく、ユーザーの偽装を検討しているでしょう。ここで簡単なGoogle検索で見つけたいくつかの参考文献をチェックしてください:

于 2008-09-22T05:41:05.257 に答える
0

サービス アプリケーションと非サービス (通常の) アプリケーションを作成し、それらを IPC (Mapped File、Pipes、MailSolts ... 名前を付ける) を介して通信させることができます。

このようにして、すべての問題を解決します。

注: 同じアプリケーションでも、プロセスとして開始した場合とユーザーが開始した場合では動作が異なる場合がありますが、最終的には同じであり、2 つのアプリケーションが存在することになります (実行可能ファイルが 1 つしかない場合でも)。

于 2008-09-22T06:19:08.147 に答える
0

サービスの全体的な概念は、ユーザーがログオンする前にサービスが開始されるということです。したがって、たとえこれが可能であったとしても、まだログオンしていないため、サービスの開始時に userA と userB のどちらかを選択することはできません。


考えられる方向は、サービスをSYSTEMとして実行することです。数分ごとに、ログインしているユーザーがいるかどうかを確認し、そのユーザーになりすましてこのようなことを行います。

于 2008-09-22T05:23:19.403 に答える
0

おそらく、サービスに子プロセスを作成させて、ユーザーの資格情報を採用させる (またはそれらで開始する) ことは可能ですか? この方法では、サービスの単一インスタンスに限定されますが、ユーザーごとのジョブはまったく同じように実行できます。IIRC の Windows タスク スケジューラ サービスがこれを行います。

于 2008-09-22T05:28:30.420 に答える
0

サービスの複数のインスタンスは必要ありません。問題の説明から、必要なのは、ユーザーになりすましてジョブを実行できる 1 つのサービスのようです。

これを行うには、サービスでホストされる COM オブジェクトを実装します。クライアント アプリケーション (エンド ユーザーが実行する) は、CLSID で CoCreateInstanceEx を呼び出します。これにより、COM オブジェクトの新しいインスタンスがサービス内に作成されます。次に、アプリケーションはインターフェイスの 1 つでメソッドを使用して、収集したユーザー資格情報を COM オブジェクトに渡すことができます (ただし、資格情報の収集には慎重になり、代わりにユーザー トークンを渡すことができるかどうかを確認します)。サービスのコンテキストで実行されている COM オブジェクトは、LogonUser() を呼び出してユーザーにログオンし、偽装することができるため、ユーザーに代わって何でも実行できます (ユーザーのローカル appdata フォルダーの検索など:-))。他の回答には、資格情報またはトークンを使用してユーザーを偽装するための適切なリンクがあります。

COM に慣れている場合は、オブジェクトの実行が COM によってシリアル化されないように、オブジェクトをマルチスレッド (MTA 内にある) として作成することをお勧めします。そうでない場合は、デフォルトのシングル スレッド モデルで十分です。

Visual Studio ATL ウィザードは、サービス内に存在する COM オブジェクトのスケルトンを生成できます。ATL を使用した Windows サービスの実装については、http: //msdn.microsoft.com/en-us/library/74y2334x (VS.80).aspx を参照してください。

COM をまったく知らない場合は、他の通信チャネルを使用して資格情報をサービスに渡すことができます。

いずれにせよ、サービスが資格情報を取得したら、ユーザーとして実行されているアプリケーションをブロックしないように、ユーザーに代わってすべての作業をバックグラウンド スレッドで実行する必要があります。

于 2008-09-26T05:29:08.357 に答える
0

これを常に実行したいので、サービスが必要です。

各ユーザーを追跡する何かが必要なため、ユーザー セッションで実行され、サービスと通信するアプリケーションが必要です (名前付きパイプや DCOM など、要件に合ったものを使用します)。

于 2008-11-07T17:59:55.410 に答える