文件或文件夹的所有权转移

9
在我把剩下的头发都拔光之前,我想听听您的意见。
我正在尝试拥有一个文件夹的所有权。当然,我以管理员身份运行程序,并且我有权利拥有所有权,因为我可以在资源管理器中更改所有者。
但是,如果管理员或我的账户拥有它,则我可以更改所有者,如果我已经拥有所有权,则可以更改权限。
如果我尝试拥有一个由SYSTEM拥有的文件,那么我就会收到未经授权的异常。
我尝试过一些不同的访问控制方法,但没有什么作用,我认为这个最新的方法是直接按照书本上的方法来的。
        private static void makePerm(string file, NTAccount account)
    {
        FileInfo finfo = new FileInfo(file);
        FileSecurity fsecurity = finfo.GetAccessControl();
        //also tried it like this //fsecurity.ResetAccessRule(new FileSystemAccessRule(string.Format(@"{0}\{1}", Environment.UserDomainName.ToString(), Environment.UserDomainName.ToString()), FileSystemRights.FullControl, AccessControlType.Allow));
        fsecurity.SetOwner(account);
        finfo.SetAccessControl(fsecurity);
    }

我正在尝试在Windows 7上进行此操作。
我错过了什么吗?

你似乎忽略了一个事实,那就是系统的权限高于你和管理员。 - H H
你确定你可以在资源管理器中接管一个系统文件的所有权吗?你似乎这么说,但表述过于明确了。 - H H
是的,我知道,但为什么我可以在资源管理器中将所有者从系统更改为管理员,但不能通过代码实现呢?据我所知,管理员始终可以拥有任何东西的所有权。 - Steinthor.palsson
你用Explorer在同一个文件上进行测试吗? - H H
1
好的,那么这个问题加一分,但我没有更好的答案。 - H H
显示剩余2条评论
2个回答

13

我遇到了同样的问题,这里给其他人提供一下解决方案:

像Luke以上提到的那样,在代码中需要明确启用SeTakeOwnershipPrivilege。我发现Process Privileges在处理此类问题时非常有帮助。

以下是它如何修复我的代码:

using System;
using System.Diagnostics;

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

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

1
我知道这有点老,但我也遇到了同样的问题。感谢分享解决方案,它对我非常有效,只需要稍作调整即可。如果有人想将文件所有权转移给其他人:您还需要特权Privilege.Restore,然后才能更改所有者。如果您想获得所有权,您可能需要先创建一个新的FileSecurity对象,接管所有权,然后继续进行:var fileSecurity = new FileSecurity(); fileSecurity.SetOwner(_owner); File.SetAccessControl(file, fileSecurity); - philip

1

你是否先通过UAC提升了进程权限?在Windows 7上,如果没有进行UAC提升,你的进程将以较低特权令牌运行。


是的。我正在以提升的权限运行Visual Studio,并尝试手动以管理员身份运行exe文件。 - Steinthor.palsson
1
您可能还需要显式启用SeTakeOwnershipPrivilege。 - Luke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接