2008-10-01 78 views
2

如果我尝试在用户目录中编写代码,但一旦我尝试在Program Files中编写代码,它只是静默执行并且文件未被复制(没有例外)。如果我尝试复制C:\或C:\ Windows中的文件,则会捕获UnauthorizedAccessException。无法使用FileIOPermission复制具有适当权限的文件

你是否知道另一种获得在该目录中写入权限或使其以另一种方式工作的方式?

任何帮助非常感谢!谢谢

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

当重新抛出异常时,只需使用throw; - 扔s;将会消除堆栈跟踪。 – 2008-10-01 21:45:13

回答

1

如果您在Vista下运行,那么系统只是重定向写入到Program Files文件夹,这样做是很老的程序,保存在程序目录中的配置将继续工作时,用户不是管理员(或UAC已启用)。

您只需在程序中添加一个指定所需访问级别的清单,然后系统会假定您的程序支持Vista,并关闭所有这些兼容性修补程序。

你可以看到我的博客上的清单文件的例子:

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

(帖子的重点是做好公共控件的正确版本,但Vista的安全性声明是也有)

1

不要写在Program Files文件夹中。

这是一个很大的禁忌,当您的代码运行在Vista中或用户只能获得标准安全性而不是管理员权限的公司的计算机上时,尤其会导致问题。改用Application Data文件夹。

0

代码访问安全授予或拒绝您的代码的权限。 它不能用于覆盖授予/拒绝给当前用户的权限。

1

你在Vista上运行吗?如果是这样,那么你可能会遇到文件系统虚拟化。这是32位版本的Vista中的一项功能,它允许普通用户写入文件系统的受保护部分。这是一个垫片,旨在减少Vista的LUA功能带来的痛苦。

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

加长版:http://thelazyadmin.com/blogs/thelazyadmin/archive/2007/04/26/file-system-virtualization.aspx