SetAccessControl”;未经授权的操作”;即使以管理员身份运行

本文关键字:管理员 运行 身份 授权 SetAccessControl 操作 | 更新日期: 2023-09-27 18:26:09

我试图获得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.ui文件。

此外,此文件的当前权限仅授予对"受信任的安装程序"的完全访问权限。

我在Windows 7 上运行

SetAccessControl”;未经授权的操作”;即使以管理员身份运行

我通过在命令shell中使用System.Diagnostics.Process运行takeown解决了这个问题。然后我就可以毫无错误地设置访问控制了。

奇怪的是,takeown可以工作,但等效的.NET库却不能。

您仍然可以在新方法中使用File.SetAccessControl()来代替FileStream.SetAccessControl()。我敢打赌它也行得通。MSDN实际上推荐了这种做法:

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

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