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 上运行吗?如果是这样,那么您可能会遇到文件系统虚拟化。这是 32 位版本的 Vista 中的一项功能,它允许普通用户写入文件系统的受保护部分。这是为了减轻 Vista 的 LUA 功能带来的痛苦而引入的 shim。

简短的版本是操作系统将为某些受保护的根(例如程序文件)创建一个虚拟文件系统。当非管理员尝试对其进行写入时,将创建一个经过编辑的副本而不是原始副本。当您的用户帐户尝试查看文件时,它会看到 edit.s 其他用户帐户只会看到原始文件。

更长的版本: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 回答