2011-11-29 6 views
6

ローカルシステムまたはローカルサービスとして実行されているC#Windowsサービスが、そのユーザーのパスワードを必要とせずに別のユーザーに偽装することは可能ですかWindowsサービスがパスワードなしでユーザーを偽装することは可能ですか?

これはどのように行われますか?

注:私の動機は、サービスでユーザー固有のWMIクエリを実行できるようにすることです。私が(OfflineFiles WMI APIに対して)作成しているWMI呼び出しは、ユーザーに敏感であり、データを照会したいユーザーとしてサービスを実行する場合にのみ機能します。私は、サービスをインストールする際にユーザが自分のユーザ名とパスワードを入力しなくてもいいようにしたいので、ローカルシステムなどでサービスを実行したいと思っています。

+0

サービスがユーザーに偽装された後に、サービスが何をしたいのかを説明すると、運がよかったと思う。 AFAIK、あなたが要求していることは信任状を入れないとできません(ユーザーがある時点でパスワードを入力したことを意味します) –

+0

@ChrisShain、あなたが提案したように質問を更新しました。 – Eric

+0

この質問に対する回答を確認してください:http://stackoverflow.com/questions/559719/windows-impersonation-from-c-sharp –

答えて

7

あなたは、該当するユーザーがログオンしている間、あなただけの偽装を開始する必要がしたと仮定すると:

  1. はEnumProcessesを使用して、関連するユーザーセッションを見つけます(例えばhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms682623(v=vs.85).aspx)[WINAPI]の関連するユーザプロセスに
  2. OpenProcessToken() 【WINAPI]
  3. DuplicateToken()偽装権限を持つ[WINAPI]
  4. DuplicateToken
  5. 校正の結果を使用して)(新しいWindowsIdentityを作成l。ステップ4の新しい身元を尋ねる

トークンが複製されると、ユーザーのログには関係なく、サービスの偽装が残ります。

明らかに、文書化されていないZwCreateToken winapi関数でもこれを達成することができますが、これを使用したことはなく、いつでも中断する可能性があります。

+0

for#1、またProcess.GetProcesses()を使用することもできます –

+0

確かにS4U(ユーザー向けサービス)を使用する技術があります。 https://blogs.msdn.microsoft.com/winsdk/2015/08/28 /パスワードなしユーザーとしてのログオン/ https://msdn.microsoft.com/en-us/library/windows/desktop/aa378128(v=vs.85).aspx –

-1

TopshelfウィンドウサービスAPI /ツールはそれをサポートしています。オープンソースです。 [更新]私は一度の設定で少なくともパスワードが必要であることを忘れていました。

+0

これは、パスワードなしでユーザーを偽装する可能性がある場所はどこですか? – BlackICE

+0

TSドキュメンテーションのどこでこの機能について話していますか?私はその実装を見ることに非常に興味があります。 –

+0

@David、もちろんあなたはパスワードが必要です。 – kenny

0

私の知る限り、明らかなセキュリティ上の理由から、これを行うことはできません。 LogonUser、WindowsIdentity.Impersonateを呼び出すには、パスワードを取得する必要があります。

ただし、リモート呼び出しでサービスに渡された既存のWindowsIdentityがある場合は、そのWindowsIdentityをサービスで偽装することはできますが、あまりにも多くのアプリケーションはこのように動作しません。

+1

セキュリティ上の理由は明らかではありません。ローカルシステムアカウントで実行されているサービスの場合、実行できないことはまったくありません。 – EFraim

関連する問題