C# 取得文件或文件夹的所有权

C# 取得文件或文件夹的所有权,c#,windows,permissions,C#,Windows,Permissions,在我拔出剩下的头发之前,我想了解一下这方面的信息。 我正试图取得一个文件夹的所有权。当然,我是以管理员的身份运行这个程序的,我有权获得所有权,因为我可以在explorer中更改所有者 但是,如果管理员或我的帐户拥有所有者,我可以更改所有者;如果我已经拥有所有者,我可以更改权限。 若我试图给自己一个文件的所有权,比如说由系统拥有,那个么我会得到一个未经授权的异常 我尝试了一些不同的访问控制方法,但没有任何效果,我认为这是本书直接介绍的最新方法 private static void

在我拔出剩下的头发之前,我想了解一下这方面的信息。
我正试图取得一个文件夹的所有权。当然,我是以管理员的身份运行这个程序的,我有权获得所有权,因为我可以在explorer中更改所有者

但是,如果管理员或我的帐户拥有所有者,我可以更改所有者;如果我已经拥有所有者,我可以更改权限。
若我试图给自己一个文件的所有权,比如说由系统拥有,那个么我会得到一个未经授权的异常

我尝试了一些不同的访问控制方法,但没有任何效果,我认为这是本书直接介绍的最新方法

        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上尝试此功能。

我在这里遗漏了什么?

您是否首先通过UAC提升了流程?在Windows 7上,在没有UAC升级的情况下,您的进程正在使用较低权限令牌运行。

我也遇到了同样的问题,我只是在这里为可能来这里搜索我的其他人发布了帖子:

您需要在代码中显式地启用SeTakeOwnershipPrivilege,正如上面Luke提到的。我发现这对处理这类事情很有帮助

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

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);    
}

您似乎缺少的是系统的级别超过了您和管理员。您确定可以在Explorer中对系统拥有的文件拥有所有权吗?你似乎这么说,但太明确了。是的,我知道,但为什么我可以在资源管理器中将所有者从系统更改为管理员,但不能使用代码?AFAIK管理员总是可以拥有任何东西。您是否使用Explorer在同一个文件上进行测试?好的,那么这个问题的答案是+1,但我没有更好的答案。是的。我正在以提升的权限运行visual studio,并尝试以administrator的身份手动运行exe。您可能还需要显式启用SeTakeOwnershipPrivilege。我知道它有点旧,但我遇到了相同的问题。感谢您分享解决方案,它对我来说非常适合。如果有人想让其他人成为所有者:那么您还需要privilege.Restore。在您能够更改所有者之前。如果您想获得所有权,可能首先需要创建一个新的FileSecurity对象,获得所有权,然后从那里开始:
var FileSecurity=newfilesecurity()
fileSecurity.SetOwner(\u owner)
File.SetAccessControl(文件,文件安全性)