Kyl*_*ley 9 c# file-permissions ntfs ownership
我正在努力克服以下情况.
给定存储在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);
Run Code Online (Sandbox Code Playgroud)
但是,SetAccessControl调用会抛出UnauthorizedAccessException.当我改变它只调整所有者时,同样的事情发生.当我只尝试调整DACL时,同样的事情.
我通过在Process Explorer中检查生成的进程并验证Administrators组是否设置为"Owner"而不是"Disabled"来验证问题不是UAC.我应该拥有执行此操作所需的所有权限(备份操作员在面对管理员时应该是无关紧要的,但我将其添加进行测试) - 但它只是继续拒绝访问权限.
相关的technet文档:http://technet.microsoft.com/en-us/library/cc783530%28WS.10%29.aspx
我在这里错过了什么?
我有同样的问题,只是在这里张贴给任何可能像我一样来这里搜索的人:
您需要在代码中显式启用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);
}
Run Code Online (Sandbox Code Playgroud)
PS:谢谢西蒙......你的回答给了我一个开始的地方.
在添加访问权限之前,您需要获得所有权.
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);
}
Run Code Online (Sandbox Code Playgroud)
此外,如果您正在设置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);
}
Run Code Online (Sandbox Code Playgroud)
如果这不起作用试试这个
http://blog.mikeobrien.net/2009/11/taking-ownership-and-setting-admin.html