即使以管理员身份运行,SetAccessControl也是“未经授权的操作”

时间:2013-08-02 16:05:55

标签: c# permissions

我正在尝试获取所有权并更改C#中文件的ACL,但即使是管理员,我也会获得例外:

System.UnauthorizedAccessException: Attempted to perform an unauthorized operation.

运行程序的用户可以通过Windows界面获取所有权并更改权限。

我的代码:

string fileName = @"C:\temp\mount\Windows\System32\Boot\en-US\winload.exe.mui";
FileSecurity fileSec = File.GetAccessControl(fileName);

fileSec.SetOwner(WindowsIdentity.GetCurrent().User); 
File.SetAccessControl(fileName, fileSec); //exception thrown here

我甚至添加了一项检查,以确保当前用户是管理员组的成员:

WindowsIdentity wi = WindowsIdentity.GetCurrent();
WindowsPrincipal wp = new WindowsPrincipal(wi);

bool isAdmin = wp.IsInRole(WindowsBuiltInRole.Administrator); //returns true

背景信息:我正在创建WinPE映像,需要替换winload.exe.mui文件。

此外,此文件的当前权限仅提供对“受信任的安装程序”的完全访问权限。

我在Windows 7上运行

2 个答案:

答案 0 :(得分:0)

我通过使用takeown在命令shell中运行System.Diagnostics.Process来解决此问题。然后我能够无错误地设置访问控制。

奇怪takeown有效,但等效的.NET库没有。

答案 1 :(得分:0)

您仍然可以在新方法中使用File.SetAccessControl()代替FileStream.SetAccessControl()。我也愿意打赌它也有效。 MSDN实际上推荐这种做法:

“虽然可以在现有文件上使用FileStream类和SetAccessControl,但请考虑使用File.SetAccessControl方法,因为它更容易使用。”

http://msdn.microsoft.com/en-us/library/system.io.filestream.setaccesscontrol.aspx[^]