FileIOPermissionを使用して適切なアクセス許可でファイルをコピーできません
-
03-07-2019 - |
質問
このスニペットは、ユーザーディレクトリに書き込もうとするとうまく機能しますが、Program Filesに書き込もうとするとすぐに実行され、ファイルはコピーされません(例外はありません)。 C:\またはC:\ Windowsでファイルをコピーしようとすると、UnauthorizedAccessExceptionをキャッチします。
そのディレクトリに書き込む許可を取得する、または別の方法で動作させる別の方法を知っていますか?
ご協力ありがとうございます!ありがとう
using(FileStream fs=File.Open(source, FileMode.Open)){ }
try
{
FileIOPermission fp = new FileIOPermission(FileIOPermissionAccess.Write,
AccessControlActions.Change, "C:\\Program Files\\MyPath");
fp.Demand(); //<-- no exception but file is not copied
File.Copy("C:\\Users\\teebot\\Documents\\File.xml","C:\\Program Files\\MyPath\\File.xml",true);
}
catch(SecurityExceptions)
{
throw(s);
}
catch(UnauthorizedAccessException unauthroizedException)
{
throw unauthroizedException;
}
解決
Vistaで実行している場合、システムは書き込みをプログラムファイルフォルダーにリダイレクトするだけです。これは、ユーザーが管理者(またはUACが有効)。
必要なアクセスレベルを指定するマニフェストをプログラムに追加するだけで、システムはプログラムがVista対応であると見なし、これらの互換性パッチをすべてオフにします。
私のブログでマニフェストファイルの例を見ることができます:
(投稿の焦点は、適切なバージョンの共通コントロールを取得することですが、Vistaのセキュリティ宣言もあります)
他のヒント
Program Filesフォルダーには書き込まないでください。
これは大きな問題です。Vistaでコードを実行する日や、ユーザーが管理者権限ではなく標準セキュリティのみを取得する会社のマシンで問題が発生する場合、特に問題が発生します。代わりにApplication Dataフォルダーを使用してください。
Vistaで実行していますか?その場合、ファイルシステムの仮想化を実行している可能性があります。これは、Vistaの32ビットバージョンの機能であり、通常のユーザーがファイルシステムの保護された部分に書き込むことができます。 VistaのLUA機能の痛みを軽減するために導入されたシムです。
短いバージョンは、オペレーティングシステムが特定の保護されたルート(プログラムファイルなど)の仮想ファイルシステムを作成することです。非管理者が書き込みを試みると、元のコピーではなく編集されたコピーが作成されます。ユーザーアカウントがファイルを表示しようとすると、編集が表示されます。他のユーザーアカウントには元のファイルのみが表示されます。
新しいバージョン: http:// thelazyadmin.com/blogs/thelazyadmin/archive/2007/04/26/file-system-virtualization.aspx
コードアクセスセキュリティは、コードへのアクセス許可を許可または拒否します。 現在のユーザーに許可/拒否されている許可をオーバーライドするために使用することはできません。