获取具有“损坏”权限的文件的所有权
Posted
技术标签:
【中文标题】获取具有“损坏”权限的文件的所有权【英文标题】:Taking ownership of files with 'broken' permissions 【发布时间】:2011-07-11 15:12:50 【问题描述】:我正在努力克服以下情况。
给定一个存储在 NTFS 卷上的目录,其中:
-
目录所有者设置为其他人(例如非特权用户)
目录 DACL 配置为允许访问不包括系统或管理员的特定人群
目录上的 DACL 实际上不授予任何人获取所有权或更改 DACL 的访问权限
(或者简而言之,所有管理员都被锁定在文件夹之外)
但是!
-
我运行的帐户具有管理权限(SeBackupPrivilege、SeSecurityPrivilege)
可以忽略现有的 DACL,因为我正在编写新的 DACL
使用其他工具 (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,并验证管理员组设置为“所有者”而不是“禁用”。我应该拥有执行此操作的所有必要权限(备份操作员在管理员面前应该是无关紧要的,但我添加它是为了测试)——但它只是不断抛出访问被拒绝。
相关技术网文档:http://technet.microsoft.com/en-us/library/cc783530%28WS.10%29.aspx
“如果您拥有一个对象,您可以授予任何用户或安全组对该对象的任何权限,包括取得所有权的权限。” 可以通过以下方式转让所有权: 当前所有者可以将“取得所有权”权限授予其他用户,允许该用户随时取得所有权。用户必须实际取得所有权才能完成转移。 (很遗憾,在这种情况下,所有者无法重新分配所有权。) 管理员可以取得所有权。 拥有“还原文件和目录”用户权限的用户可以将所有权分配给任何用户或组。 获得文件和其他对象所有权的能力是管理员维护系统的需要优先于所有者控制访问权限的另一种情况。通常,只有当对象的当前所有者允许您这样做时,您才能获得对象的所有权。 NTFS 对象的所有者可以通过授予另一个用户 Take Ownership 权限来允许另一个用户取得所有权; Active Directory 对象的所有者可以授予另一个用户修改所有者权限。拥有此权限的用户可以在没有当前所有者许可的情况下取得对象的所有权。默认情况下,该权限仅分配给内置管理员组。当当前所有者不再可用时,管理员通常使用它来获取和重新分配资源的所有权。我在这里错过了什么?
【问题讨论】:
遇到完全相同的问题。你有没有设法找到解决这个问题的方法? 另见***.com/questions/5368825/…和***.com/questions/153087/… 【参考方案1】:我遇到了同样的问题,只是在这里发帖给其他可能像我一样来这里搜索的人:
您需要在代码中显式启用 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:谢谢西蒙..你的回答给了我一个起点。
【讨论】:
这确实是我的问题!不错的 UAC。是的,如果没有别的,感谢 Simon 的首发。 我遇到了这个问题,我什至没有启用 UAC...但这有效! 跟UAC没关系。早在引入 UAC 之前,特权就一直以这种方式工作。如果你想使用它们,你必须先启用它们。 (大概是为了让程序员不会误用权限。) 如果我运行此代码并测试 Privilege.TakeOwnership,它会显示为已删除。我似乎找不到任何关于如何“添加”它的文档 @JStellato 您是否以管理员身份运行该程序? (右键run as admin
东西)。只要run as
用户有权访问权限,在管理员模式下运行应该将该权限转移给进程【参考方案2】:
您需要先获得所有权,然后才能添加访问权限。
using (var user = WindowsIdentity.GetCurrent())
var ownerSecurity = new FileSecurity();
ownerSecurity.SetOwner(user.User);
File.SetAccessControl("c:\\path\\to\\broken", ownerSecurity);
var accessSecurity = new FileSecurity();
accessSecurity.AddAccessRule(new FileSystemAccessRule(user.User, FileSystemRights.FullControl, AccessControlType.Allow));
File.SetAccessControl("c:\\path\\to\\broken", accessSecurity);
另外,如果您要设置 DirectorySecurity,您将需要这个
using (var user = WindowsIdentity.GetCurrent())
var ownerSecurity = new DirectorySecurity();
ownerSecurity.SetOwner(user.User);
Directory.SetAccessControl("c:\\path\\to\\broken", ownerSecurity);
var accessSecurity = new DirectorySecurity();
accessSecurity.AddAccessRule(new FileSystemAccessRule(user.User, FileSystemRights.FullControl, AccessControlType.Allow));
Directory.SetAccessControl("c:\\path\\to\\broken", accessSecurity);
如果这不起作用,试试这个
http://blog.mikeobrien.net/2009/11/taking-ownership-and-setting-admin.html
【讨论】:
谢谢,西蒙。我为此苦苦挣扎了一段时间。我读了 Mark 的 MSDN 文章,我很高兴我读了,但正是你的帖子拯救了这一天。 Mike O'Briens 博客中的代码非常适合我。以上是关于获取具有“损坏”权限的文件的所有权的主要内容,如果未能解决你的问题,请参考以下文章
该虚拟机似乎正在使用中。 如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权。否则,请按“取消(C)”按钮以防损坏。 配置文件: ***.vmx。
在用VMware虚拟机的时候,有时会发现打开虚拟机时提示“该虚拟机似乎正在使用中。如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权。否则,请按“取消(C)”按钮以防损坏。配置文件: D
centos--该虚拟机似乎正在使用中。 如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权。否则,请按“取消(C)”按钮以防损坏。