【问题标题】:How can I remove ACL from folder that owned by non-existing user如何从不存在的用户拥有的文件夹中删除 ACL
【发布时间】:2012-07-15 10:46:44
【问题描述】:

我正在开发一个 C# 应用程序。

我需要更改文件夹上的 ACL,为此我以提升的管理员身份运行我的程序,一切正常。

问题是,如果拥有该文件夹的用户从系统中删除,那么当我尝试获取该文件夹的所有权时,我会遇到未经授权的异常。

这是失败的代码:

 using (new PrivilegeEnabler(Process.GetCurrentProcess(), Privilege.TakeOwnership))
            {
                var directorySecurity = directoryInfo.GetAccessControl();
                directorySecurity.SetOwner(WindowsIdentity.GetCurrent().User);
                Directory.SetAccessControl(directoryInfo.FullName, directorySecurity);
            }

异常发生在一行:directoryInfo.GetAccessControl();

PrivilegeEnabler 是在Process Privileges 中定义的一个类,用于获取文件的所有权。

【问题讨论】:

  • 能否请您发布堆栈跟踪和完整的异常消息?
  • An explanation。简而言之,如果您没有读取权限的权限,那么您唯一能做的就是取得所有权。因此,您需要取得所有权,然后读取并更新 ACL。我不知道你是否可以在 C# 中方便地做到这一点。
  • this question 的答案解释了如何做到这一点。
  • @arx - 这正是我所做的,但它失败了......显然你可以设置所有权但你不能获得访问控制。我觉得这很奇怪......
  • 这是设计使然。如果您没有读取 ACL 的权限,则无法读取,但为了让管理员重新获得控制权,他们可以取得所有权。

标签: c# .net windows acl


【解决方案1】:

我找到了解决办法。

您需要通过创建新的访问控制(无需调用 GetAccessControl)并将所有者设置为当前进程来设置所有者。 然后你可以对文件做任何你想做的事情。

using (new PrivilegeEnabler(Process.GetCurrentProcess(), Privilege.TakeOwnership))
            {
                //create empty directory security
                var directorySecurity = new DirectorySecurity();
                //set the directory owner to current user
                directorySecurity.SetOwner(WindowsIdentity.GetCurrent().User);
                //set the access control
                Directory.SetAccessControl(directoryInfo.FullName, directorySecurity);
            }

【讨论】:

    猜你喜欢
    • 2015-12-05
    • 2017-01-25
    • 2018-08-12
    • 2019-05-10
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多