无法使用FileIOPermission复制具有适当权限的文件
如果我尝试在用户目录中编写该代码段,则效果很好,但是当我尝试在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; }
解决方案
不要写在Program Files文件夹中。
这是一个很大的禁忌,尤其是当代码在Vista中运行或者在公司的计算机上运行的那一天尤其会引起问题,而用户只能获得标准的安全性而不是管理员权限。请改用"应用程序数据"文件夹。
代码访问安全性授予或者拒绝代码的权限。
它不能用于覆盖授予/拒绝给当前用户的权限。
我们在Vista上运行吗?如果是这样,那么我们可能正在运行文件系统虚拟化。这是Vista的32位版本中的一项功能,该功能允许普通用户写入文件系统的受保护部分。引入此垫片是为了减轻Vista的LUA功能带来的痛苦。
简短的版本是操作系统将为某些受保护的根目录(例如程序文件)创建虚拟文件系统。当非管理员尝试写入时,将创建一个副本而不是原始副本。当用户帐户尝试查看文件时,它将看到编辑内容。其他用户帐户将仅看到原始文件。
较长版本:http://thelazyadmin.com/blogs/thelazyadmin/archive/2007/04/26/file-system-virtualization.aspx
如果我们在Vista上运行,则系统仅将写入重定向到程序文件文件夹,这样做是为了在用户不是管理员(或者启用UAC)时将其配置保留在程序目录中的旧程序继续运行。
我们所要做的就是在程序中添加一个清单,该清单指定所需的访问级别,然后系统假定程序支持Vista,并关闭所有这些兼容性修补程序。
我们可以在我的博客上查看清单文件的示例:
http://www.nbdtech.com/blog/archive/2008/06/16/The-Application-Manifest-Needed-for-XP-and-Vista-Style-File.aspx
(这篇文章的重点是获取正确版本的通用控件,但是Vista安全声明也在那里)