gpt4 book ai didi

c# - 获取具有 'broken' 权限的文件的所有权

转载 作者:太空狗 更新时间:2023-10-29 17:43:52 27 4
gpt4 key购买 nike

我正在努力克服以下情况。

给定一个存储在 NTFS 卷上的目录,其中:

  1. 目录所有者设置为其他人(例如非特权用户)
  2. 目录 DACL 配置为允许访问不包括系统或管理员的特定人群
  3. 目录上的 DACL 实际上不授予任何人获取所有权或更改 DACL 的权限

(或者简而言之,所有管理员都被锁定在文件夹之外)

但是!

  1. 我正在运行的帐户具有管理权限(SeBackupPrivilege、SeSecurityPrivilege)
  2. 可以忽略现有的 DACL,因为我正在编写一个新的
  3. 使用其他工具 (takeown.exe),我可以访问相关目录。

(或者简而言之,我有权修复 DACL/所有者)

下面的代码我应该没有问题:

WindowsIdentity privilegedUser = System.Security.Principal.WindowsIdentity.GetCurrent();

// I cannot use File.GetAccessControl() as I get access denied
// (working as intended! I have no access to read the ACL!)
// so I have to write a new ACL:
FileSecurity acl = new FileSecurity();
acl.SetOwner(admin.User);
acl.AddAccessRule(new FileSystemAccessRule(privilegedUser.User, FileSystemRights.FullControl, AccessControlType.Allow));

File.SetAccessControl("c:\\path\\to\\broken", acl);

但是,SetAccessControl 调用会抛出 UnauthorizedAccessException。当我将其更改为仅调整所有者时,会发生同样的事情。当我只尝试调整 DACL 时,同样的事情。

我已通过在 Process Explorer 中检查生成的进程来验证问题不是 UAC,并验证 Administrators 组设置为“Owner”而不是“Disabled”。我应该拥有执行此操作的所有必要权限(备份运算符(operator)在管理员面前应该是无关紧要的,但我添加它是为了测试)——但它只是不断抛出访问被拒绝。

相关技术网文档:http://technet.microsoft.com/en-us/library/cc783530%28WS.10%29.aspx

  • “如果您拥有一个对象,您可以授予任何用户或安全组对该对象的任何权限,包括取得所有权的权限。”
  • 所有权可以通过以下方式转让:
    • 当前所有者可以将“取得所有权”权限授予其他用户,从而允许该用户随时取得所有权。用户必须实际取得所有权才能完成转让。 (不幸的是,所有者不能在这种情况下重新分配所有权。)
    • 管理员可以取得所有权。
    • 拥有恢复文件和目录用户权限的用户可以将所有权分配给任何用户或组。
  • 取得文件和其他对象的所有权的能力是管理员维护系统的需要优先于所有者控制访问权限的另一种情况。通常,只有当对象的当前所有者允许您这样做时,您才能取得该对象的所有权。 NTFS 对象的所有者可以通过授予其他用户取得所有权权限来允许其他用户取得所有权; Active Directory 对象的所有者可以授予另一个用户修改所有者权限。拥有此权限的用户可以在没有当前所有者许可的情况下取得对象的所有权。默认情况下,该权限仅分配给内置管理员组。当资源的当前所有者不再可用时,管理员通常使用它来获取和重新分配资源的所有权。

我在这里错过了什么?

最佳答案

我遇到了同样的问题,只是在这里发布给可能像我一样来这里搜索的其他人:

您需要在代码中显式启用 SeTakeOwnershipPrivilege。我找到了 Process Privileges对处理这类事情很有帮助。

这是它修复我的代码的方法(似乎出于某种原因,即使我有特权,但除非我明确启用它,否则该过程不会):

using (new ProcessPrivileges.PrivilegeEnabler(Process.GetCurrentProcess(), Privilege.TakeOwnership))
{
directoryInfo = new DirectoryInfo(path);
directorySecurity = directoryInfo.GetAccessControl();

directorySecurity.SetOwner(WindowsIdentity.GetCurrent().User);
Directory.SetAccessControl(path, directorySecurity);
}

PS:谢谢 Simon.. 你的回答给了我一个起点。

关于c# - 获取具有 'broken' 权限的文件的所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5241718/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com