アプリケーションがネットワーク上のフォルダーに書き込めるように、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。
私はアイデアがありません:)