【问题标题】:How to grant ownership of Files and Folders in Windows如何在 Windows 中授予文件和文件夹的所有权
【发布时间】:2019-04-09 12:16:00
【问题描述】:

我遇到了一个非常烦人的问题,我花了一段时间才解决它。由于 99% 的互联网都告诉我这是不可能的,而且我在 stackoverflow 上找不到答案,所以我决定在这里发布。

我试图在我的 Windows 机器中更改文件夹/文件的所有权。这不是什么大问题,因为 DirectorySecurtiy 有一个很好的函数:“SetOwner()”。我让它为我的当前帐户工作,但我无法让它为其他人工作。每次我尝试授予其他人所有权时,我都会收到此错误:“安全标识符不允许成为此对象的所有者”。

// Get folder or creates if not exists
DirectoryInfo dInfo = Directory.CreateDirectory(folderPath);

// Get user
IdentityReference user = new NTAccount(username);

// Set owner
DirectorySecurity dSecurity = dInfo.GetAccessControl();
dSecurity.SetOwner(user);
dInfo.SetAccessControl(dSecurity);

因此,如果我想授予自己所有权,但如果我想授予他人所有权,则此代码确实有效。怎么办?

【问题讨论】:

  • 您的程序需要在具有足够权限的帐户下运行才能授予所有权。
  • 确实如此,它以管理员身份运行
  • 如果不显式启用 SeRestorePrivilege,我们只能将所有权分配给当前用户或用户为其所有者的任何用户组(即标记为 SE_GROUP_OWNER)。仅在用户令牌中包含 SeRestorePrivilege 是不够的。这不是系统自动为我们启用的权限之一。
  • 这是不真实的,检查答案并使用 uncpath

标签: c# windows permissions


【解决方案1】:

进一步搜索互联网后,我在此博客中找到了解决方案:https://fixingitpro.com/2011/07/08/set-owner-with-powershell-%E2%80%9Cthe-security-identifier-is-not-allowed-to-be-the-owner-of-this-object%E2%80%9D/

这很奇怪,我不知道为什么,但如果你使用 unc 路径,它会起作用。

UNC 名称使用特定符号标识网络资源。这些名称由三部分组成:主机设备名称、共享名称和可选文件路径。 这三个元素使用反斜杠组合:\host-name\share-name\file_path

所以以前只对我自己有用的东西:D:\{folderName} 必须是:\\{IP or servername}\d$\{foldername}。如果您仅测试完全相同的代码而不是使用不同的路径,它将起作用。如果有人能解释一下为什么路由回您自己的计算机确实不能通过正常路径工作,那就太好了。

别忘了以管理员身份运行您的应用程序

【讨论】:

  • 我无法复制该博主的帖子显示的内容,因为我使用这些 cmdlet 大量更改了 ACL。
  • 只需使用我的原始代码,您就可以更改所有权。它与访问控制列表无关。此外,博主正在谈论 powershell,但对于 c# 来说也是如此
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-18
  • 1970-01-01
  • 2011-08-31
  • 2018-02-08
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
相关资源
最近更新 更多