2

このスニペットは、ユーザー ディレクトリに書き込もうとするとうまく機能しますが、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;
}
4

4 に答える 4

1

Program Files フォルダには書き込まないでください。

これは大したことではありません。ユーザーが管理者権限ではなく標準のセキュリティのみを取得する会社のマシンや、Vista でコードを実行する日が来ると、特に問題が発生します。代わりに Application Data フォルダを使用してください。

于 2008-10-01T20:43:27.017 に答える
1

Vista で実行していますか? その場合は、ファイル システムの仮想化を実行している可能性があります。これは、Vista の 32 ビット バージョンの機能で、通常のユーザーがファイル システムの保護された部分に書き込むことができます。これは、Vista の LUA 機能の痛みを軽減するために導入された shim です。

短いバージョンでは、オペレーティング システムが特定の保護されたルート (プログラム ファイルなど) に対して仮想ファイル システムを作成します。管理者以外が書き込みを試みると、オリジナルの代わりにコピーが作成され、編集されます。あなたのユーザー アカウントがファイルを見ようとすると、編集内容が表示されます。他のユーザー アカウントにはオリジナルのみが表示されます。

より長いバージョン: http://thelazyadmin.com/blogs/thelazyadmin/archive/2007/04/26/file-system-virtualization.aspx

于 2008-10-01T20:49:16.237 に答える
1

Vista で実行している場合、システムは書き込みをプログラム ファイル フォルダーにリダイレクトするだけです。これは、ユーザーが管理者でない場合 (または UAC が有効になっている場合) に、構成をプログラム ディレクトリに保持する古いプログラムが引き続き動作するようにするためです。

必要なアクセス レベルを指定するマニフェストをプログラムに追加するだけで、システムはプログラムが Vista 対応であると見なし、それらの互換性パッチをすべてオフにします。

マニフェスト ファイルの例は、次のブログでご覧いただけます。

http://www.nbdtech.com/blog/archive/2008/06/16/The-Application-Manifest-Needed-for-XP-and-Vista-Style-File.aspx

(投稿の焦点は、共通コントロールの適切なバージョンを取得することですが、Vista のセキュリティ宣言もそこにあります)

于 2008-10-01T20:53:23.873 に答える
0

コード アクセス セキュリティは、コードへのアクセス許可を付与または拒否します。現在のユーザーに付与/拒否されているアクセス許可をオーバーライドするために使用することはできません。

于 2008-10-01T20:46:43.390 に答える