3

特定の Windows サービスのログオン ユーザー アカウントを偽装する必要があります。

WMI を使用してユーザー名を取得できました (残念ながら、通常の Windows サービス関連の .NET クラスを使用しても、ログオン ユーザー ID は公開されないようです)。しかし、ユーザー名 (ローカル アカウントまたはドメイン アカウントのいずれか) のみを使用して、その Windows ID のトークンを取得するにはどうすればよいでしょうか?

トークンを提供できる LogonUser WinAPI 呼び出しは、パスワードを引数として想定していますが、これは明らかに利用できません。ユーザー入力はオプションではありません。

どんな洞察も高く評価されます。

4

2 に答える 2

3

最終的に次のことを行いました:

  1. サービスが実行されているかどうかを確認します。サービスを開始しない場合。
  2. WMI を使用してサービス名から PID を取得します。
  3. .NET Process クラスを使用して、PID からプロセス ハンドルを取得します。
  4. OpenProcessHandle を使用してプロセス トークンを取得する
  5. DuplicateToken を使用してトークンを複製し、十分な権限を確認します。
  6. 手順 4 で取得したトークンを使用して、新しい WindowsIdentity を作成します。
  7. WindowsImpersonationContext を使用して、この新しい WindowsIdentity を偽装し、偽装の下で操作を行い、偽装を元に戻します。

これが、サービスが実行されているユーザー アカウントを偽装する必要がある他の人に役立つことを願っています。

于 2013-03-25T23:16:31.267 に答える
1

Microsoft はログオン時にサービス ログオンに平文のパスワードを必要としないふりをしたいので、これは完全に文書化されていませんが、実際にはそうであり、services.exe は正しいパスワードで LogonUser を呼び出します。

パスワードはレジストリのどこかに押し込まれ、SYSTEM のみがアクセスできる場所に暗号化されて起動しますが、SYSTEM アカウントはマシン キーを取得してパスワードを復号化できます。

http://www.computersecurityarticles.info/security/decrypting-lsa-secrets/

これは文書化されていないため、使用しないでください。

于 2013-03-26T00:32:15.857 に答える