我正在努力克服以下情况。
给定存储在NTFS卷上的目录,其中:
(或者简而言之,所有管理员都被锁定在文件夹之外)
但是!
(或者简而言之,我有权修复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中检查生成的进程并验证Administrators组是否设置为“Owner”而不是“Disabled”来验证问题不是UAC。我应该拥有执行此操作的所有必要权限(备份操作员在面对管理员时应该是无关紧要的,但我将其添加进行测试) - 但它只是继续拒绝访问权限。
相关的technet文档:http://technet.microsoft.com/en-us/library/cc783530%28WS.10%29.aspx
我在这里缺少什么?
答案 0 :(得分:7)
我遇到了同样的问题,只是在这里张贴给其他可能像我一样来这里搜索的人:
您需要在代码中明确启用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:谢谢西蒙......你的回答给了我一个开始的地方。
答案 1 :(得分:6)
在添加访问权限之前,您需要获得所有权。
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