33

LocalSystem として実行されている C# プログラムは、一時的に別のユーザーのログイン ID になりすますことができますか? 大まかに言えば、LocalSystem として実行したい Windows サービスがありますが、ユーザー XYZ になりすますことがあります (Windows 統合セキュリティを使用してデータベースに接続する場合)。

最も重要なこと: 他のユーザーのパスワードを知らずにこれを行う方法はありますか?

注: パスワードが必須の場合、パスワードを安全に保存するための推奨される戦略はありますか (c# および/または vbscript)。

4

3 に答える 3

19

可能ですが、多くのコードを実行する必要があります。NtCreateTokenおよびCreateTokenを参照してください。NT AUTHORITY\SYSTEM で実行しているので問題にはなりませんが、SeCreateTokenPrivilege が必要です。その後、作成されたトークンを使用して、スレッド内で偽装できます。

于 2009-02-22T09:36:20.403 に答える
13

簡単な答え: ユーザーのパスワードまたはユーザーが COM を介してサービスを呼び出していないとできません。

プロセスで別のユーザーになりすますには、 を呼び出す必要がありますImpersonateLoggedOnUserImpersonateLoggedOnUserトークン ハンドルが必要です。トークン ハンドルを取得するには、いくつかの方法があります。

  • を使用してユーザーとしてログオンしますLogonUser。ただし、これにはユーザーのパスワードを知っている必要があります。
  • CreateRestrictedTokenDuplicateToken、またはで既存のトークンを複製しますDuplicateTokenEx
  • または、ユーザーとしてすでにログオンしている別のプロセスまたはスレッドからトークンを開くことによってOpenProcessTokenOpenThreadToken
于 2009-02-18T03:38:57.860 に答える
5

パスワードの保存部分については、最近尋ねられたこの質問をご覧になることをお勧めします。

これが私の答えでした:

ストレージ暗号化を提供するデータ保護 APIであるDPAPIを使用できます/使用する必要があります。 このタイプの問題のためだけにあります。

ストレージの暗号化は、次のいずれかに基づいています。

  • ログインしたユーザーのみがデータにアクセスできるようにします。これにより、まったく同じユーザー資格情報を持つ別の PC にデータを転送できるようになります。
  • これにより、データはその特定のマシン設定でのみアクセス可能になり、別の PC には転送できなくなります。

Karl FranklinのdnrTV ショーで、これを実装するために何が必要か、およびその他の暗号化機能が正確に示されています。
ショーのソース コードもこのページで入手できます。

もちろん、このテーマに関する記事は他にもたくさんあります。

于 2009-02-18T03:33:02.790 に答える