如果我尝试在用户目录中写入,这个代码片段效果很好但是当我尝试在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;
}
答案 0 :(得分:1)
不要写入Program Files文件夹。
这是一个很大的禁忌,当代码在Vista中运行或在用户只获得标准安全而非管理员权限的公司的计算机上运行时,尤其会导致问题。请改用Application Data文件夹。
答案 1 :(得分:1)
你在Vista上运行吗?如果是这样,那么您可能会遇到文件系统虚拟化。这是32位版本的Vista中的一项功能,允许普通用户写入文件系统的受保护部分。这是一个减少Vista的LUA功能的痛苦的垫片。
简短版本是操作系统将为某些受保护的根(例如程序文件)创建虚拟文件系统。当非管理员尝试写入时,将创建一个副本而不是原始副本。当您的用户帐户尝试查看该文件时,它将看到edit.s其他用户帐户将只能看到原始帐户。
更长版本:http://thelazyadmin.com/blogs/thelazyadmin/archive/2007/04/26/file-system-virtualization.aspx
答案 2 :(得分:1)
如果您在Vista下运行,那么系统只是将写入重定向到程序文件文件夹,这样做是因为当用户不是管理员(或UAC是)时,将其配置保留在程序目录中的旧程序将继续工作启用)。
您所要做的就是在程序中添加一个指定所需访问级别的清单,然后系统会假设您的程序支持Vista,并关闭所有这些兼容性补丁。
您可以在我的博客上看到清单文件的示例:
(帖子的重点是获取正确版本的常用控件,但Vista安全声明也在那里)
答案 3 :(得分:0)
代码访问安全性授予或拒绝对代码的权限。 它不能用于覆盖授予/拒绝当前用户的权限。