【问题标题】:Taking ownership of a file or folder取得文件或文件夹的所有权
【发布时间】:2011-07-19 03:16:55
【问题描述】:

在我拔掉我剩下的头发之前,我想对此有所了解。
我正在尝试获取文件夹的所有权。当然,我以管理员身份运行该程序,并且我确实有权获得所有权,因为我可以在资源管理器中更改所有者。

但是,如果管理员或我的帐户拥有它,我可以更改所有者,如果我已经拥有所有权,我可以更改权限。
如果我试图给自己一个文件的所有权,比如说由 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 上尝试这个。
我在这里错过了什么?

【问题讨论】:

  • 您似乎缺少的是 SYSTEM 的排名高于您和管理员。
  • 您确定可以在资源管理器中获得系统拥有文件的所有权吗?你好像这么说,但太直白了。
  • 是的,我知道,但是为什么我可以在资源管理器中将所有者从系统更改为管理员,但不能使用代码? AFAIK 管理员始终可以拥有任何东西。
  • 您是否使用 Explorer 对 同一文件 进行测试?
  • 好的,那么这个问题+1,但我没有更好的答案。

标签: c# windows permissions


【解决方案1】:

我有同样的问题,只是在这里发帖给其他可能像我一样来这里搜索的人:

您需要在代码中显式启用 SeTakeOwnershipPrivilege,就像 Luke 上面提到的那样。我发现 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);    
}

【讨论】:

  • 我知道它有点老了,但我遇到了同样的问题。感谢您分享解决方案,它对我来说非常适合我的改编。如果有人想让其他人成为所有者:那么您还需要特权 Privilege.Restore。在您更改所有者之前。如果你想取得所有权,你可能首先需要创建一个新的 FileSecurity 对象,取得所有权,然后从那里继续:var fileSecurity = new FileSecurity();fileSecurity.SetOwner(_owner);File.SetAccessControl(file, fileSecurity);
【解决方案2】:

您是否首先通过 UAC 提升您的流程?在 Windows 7 上,如果没有 UAC 升级,您的进程将使用较低特权的令牌运行。

【讨论】:

  • 是的。我都在运行具有提升权限的 Visual Studio,并且我尝试以管理员身份手动运行 exe。
  • 您可能还需要明确启用 SeTakeOwnershipPrivilege。
猜你喜欢
  • 2012-10-11
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
相关资源
最近更新 更多