2009-04-07 21 views
5

通常のユーザーとして実行されているアプリケーションと、ローカルシステムとして実行されているサービスがあります。私は、サービスが他の何かをやった後、アプリケーションがアプリケーションを再び起動するようにアプリケーションに指示することができるようにしたい。 (したがって、サービスは「もの」を実行している間、アプリケーションは実行されません。)サービスが最初に起動したユーザーとしてアプリケーションを起動できるようにするには、ユーザートークンが必要です。アプリケーションはサービスを終了する前にトークンを送信しますが、トークン/ハンドルはサービスがトークンを使用しようとすると無効です。CreateProcessAsUserの有効なユーザートークンを取得するにはどうすればよいですか?

ユーザートークンは、常にOpenProcessTokenを呼び出したプロセスでのみ有効ですか?

これには他にもいくつかの方法がありますか?私はlogonuserでアプリケーションに "ログオン"する必要はありません。それはちょうど愚かであろう。私は、サービスからユーザートークンを取得するために使用できるサービスに、アプリケーションから "explorer.exe"のプロセスハンドルを渡すことができたと思いますが、これはPROCESS DUP HANDLEアクセス権が必要です。私はその解決策について興奮しているわけではありませんが、おそらくそれを行う方法ですか?

答えて

2
+0

ありがとう、私は最初の記事で、ZwCreateTokenでトークンを作成しています。メッセージに必要なものをすべて詰め込むのはちょっと面倒ですが、明らかに他の人のために働いています。 –

+0

最初の記事にはいくつかのエラーがあるようですが、2番目の記事はかなり良いです。しかし、ZwCreateToken(文書化されていない、サポートされていない、まったく安定したメソッドではない)を使用する理由がわかりません。 –

+0

申し訳ありませんが、私は2番目の意味です。最初のものを見つけることさえできませんでした。私はhttp://www.apnilife.com/E-Books_apnilife/Windows%20Programming_apnilife/Windows%20NT%20Undocumented%20APIs/1996%20Ch08_apnilife.pdfのようなことをしています。 CreateTokenを参照していますか? –

3

私はそれらを個別に対処しようとするでしょうし、私が誤解している場合、あなたが私を修正することができますので、あなたがここに複数の問題があります。

  1. サービスと特定の機能を同時に実行できないユーザーアプリケーション。これを実現するには、サービスでアプリケーションを停止し、特殊な機能を実行してからアプリケーションを再起動します。これが正しければ、私の考えでは、あなたは設計上の欠陥があります。アプリケーションを再起動するのではなく、名前付きミューテックスを使用して相互排除したり、名前付きパイプなどのIPCメソッドを使用したりして、共有リソースへのアクセスを調整する必要があります。

  2. ユーザートークンは、常にOpenProcessTokenを呼び出したプロセスでのみ有効ですか?はい、受け取ったトークンハンドルは、プロセスのハンドルテーブルへのインデックスです。直接転送することはできません。 DuplicateHandleを使用する必要がありますが、これはあなたの望むものかもしれませんが、面倒かもしれません。

  3. ユーザーのトークンを取得してアプリケーションをユーザーの(対話型の)セッションに起動させる最適な方法を探したいとします。このような場合は、ユーザーのセッショントークンを取得して使用することをお勧めします。 this articleとサンプルコードはC#でチェックできますが、選択した言語に比較的簡単に転送できるはずです。

EDIT:あなたはSYSTEMアカウントでサービスを実行しているので、(プロセスがプロセスIDを送信することができ、必要であれば)、それはプロセス自体へのハンドルを開くことができるWindows 2000を含めるように更新しました。次に、そのプロセスにアタッチされたトークンを開き、それを複製し、結果のトークンを使用してターゲットアプリケーションを起動(または再起動)することができます。

+0

1.設計上の欠陥のように思えるかもしれません。つまり、サービスはアプリケーションをアップグレードしたいことがあります。起動する必要があるアプリケーションと同じではないかもしれません。 2.合意しました。代わりに新しいトークンを作成しようとします。 3. 2000で動作しなければならないことは言及していません... –

+0

サービスはサービスに何かを送信するのではなく、OpenProcessTokenとDuplicateTokenEx自体を呼び出さないのはなぜですか? –

+0

この場合、作成されたプロセスはローカルシステムとして実行されませんか?私がそうするならば、私はCreateProcessを呼び出して、ユーザトークンをまったく気にしないかもしれません。 –

関連する問題