2

アプリケーションがネットワーク上のフォルダーに書き込めるように、WPF アプリケーションでドメイン ユーザー アカウントを偽装しようとしています。ドメイン ユーザーには、この場所に書き込むための十分な権限があります。なりすましを実行するために、ネット上で見つかったコードを使用しています。

基本的には、セキュリティ トークンを返すネイティブの LogonUser メソッドを呼び出し、トークンを渡して新しい WindowsIdentity を作成し、最後に windowsIdentity.Impersonate() メソッドを呼び出します。上記のロジックを実行しても例外は発生しません。

WindowsIdentity.GetCurrent() -> を呼び出すと、偽装された ID が返されます。

UNC パスへの書き込み -> UnauthorizedAccess 例外。

そのため、ファイルを書き込もうとする前に Thread.CurrentPrincipal オブジェクトを調べます。これには GenericPrincipal があり、偽装された WindowsIdentity を持つ WindowsPrincipal はありません。

そのため、アプリケーションの起動時に、AppDomain.CurrentAppDomain.SetPrincipalPolicy を PrincipalPolicy.Impersonate に設定しました。

アプリケーションを再起動します...

なりすましを呼び出す前に、開発マシンへのログオンに使用し、WPF プログラムを実行している Thread.CurrentPrincipal で自分の資格情報を確認できます。

再度偽装ロジックを実行しようとすると、WindowsIdentity.GetCurrent に偽装された ID が表示されます。すべて問題なく、例外はありません。

ただし、Thread.GetCurrentPrincipal では自分の資格情報がまだ表示されます。AuthenticationType プロパティを見ると、UnauthorizedException があります (これはデバッガーでのみ表示され、アプリケーションではスローされません!!)。コードを実行させました。

ここでも、UNC の場所にファイルを書き込もうとすると UnauthorizedAccess が発生します。

最後に試したのは、WindowsIdentity.GetCurrent() を使用して新しい WindowsPrincipal を作成し、それを Thread.Current に明示的に設定することですが、結果は同じです。

UNC ロケーションへの書き込み時の UnauthorizedAccess。

私はアイデアがありません:)

4

1 に答える 1

0

ネットワーク共有を持つマシンはドメインに属していますか? そのドメイン アカウントを使用してネットワーク共有にアクセスしようとしましたか? たとえば、「Run As...」を使用します。

LogonUser 関数では、ログオン時に LOGON32_LOGON_NETWORK フラグを使用してみてください。また、偽装が実際に行われたかどうかを確認するには、セキュリティ ポリシーからログオン/ログオフ イベントの監査を有効にしてみてください (情報リンク) 。

于 2009-05-12T07:24:12.503 に答える