Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从非现有用户拥有的文件夹中删除ACL_C#_.net_Windows_Acl - Fatal编程技术网

C# 如何从非现有用户拥有的文件夹中删除ACL

C# 如何从非现有用户拥有的文件夹中删除ACL,c#,.net,windows,acl,C#,.net,Windows,Acl,我正在开发一个C#应用程序 我需要更改文件夹上的ACL,为此,我以提升管理员的身份运行我的程序,并且一切正常 问题是,如果拥有该文件夹的用户从系统中被删除,那么当我试图获得该文件夹的所有权时,会出现未经授权的异常 这是失败的代码: using (new PrivilegeEnabler(Process.GetCurrentProcess(), Privilege.TakeOwnership)) { var directorySecurit

我正在开发一个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是中定义的一个类,用于获取文件的所有权。

我找到了一个解决方案

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);
            }
您需要通过创建新的访问控制(不调用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);
            }

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