【发布时间】: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 的权限,则无法读取,但为了让管理员重新获得控制权,他们可以取得所有权。