C# - 在 Windows 7 中为所有用户设置目录权限

Posted

技术标签:

【中文标题】C# - 在 Windows 7 中为所有用户设置目录权限【英文标题】:C# - Set Directory Permissions for All Users in Windows 7 【发布时间】:2012-02-15 05:11:49 【问题描述】:

这应该是一个相当简单的问题,但由于某种原因,我似乎无法让它工作。我想做的就是在给定目录上设置权限,以允许所有用户完全访问。这是我到目前为止的代码:

System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(destinationDirectory);
FileSystemAccessRule fsar = new FileSystemAccessRule("Users", FileSystemRights.FullControl, AccessControlType.Allow);
DirectorySecurity ds = null;

    if (!di.Exists)
    
       System.IO.Directory.CreateDirectory(destinationDirectory);
    

ds = di.GetAccessControl();
ds.AddAccessRule(fsar);

不会抛出异常,但也不会发生任何事情。当我在代码运行后检查目录权限时,我没有看到任何变化。

有什么想法吗?

【问题讨论】:

您是否尝试在禁用 UAC 的情况下运行上述代码? @David - 我曾尝试以管理员身份运行编译后的 exe,但对结果没有影响。 @rkosegi - 我该怎么做?它是 Visual Studio 中的设置吗? @SonnyBoy 不,这是系统范围的设置,您不应禁用它。如果您禁用它,那么当您的用户运行您的代码并发现它由于缺乏权限而失败时,您会大吃一惊。最好不要有这样的惊喜。 【参考方案1】:

David Heffernan 的答案在非英语机器上不起作用,尝试在“用户”上设置权限失败并出现 IdentityNotMapped 异常。通过使用 WellKnownSidType.BuiltinUsersSid 代替,以下代码将在任何地方工作:

static void SetFullControlPermissionsToEveryone(string path)

    const FileSystemRights rights = FileSystemRights.FullControl;

    var allUsers = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null);

    // Add Access Rule to the actual directory itself
    var accessRule = new FileSystemAccessRule(
        allUsers,
        rights,
        InheritanceFlags.None,
        PropagationFlags.NoPropagateInherit,
        AccessControlType.Allow);

    var info = new DirectoryInfo(path);
    var security = info.GetAccessControl(AccessControlSections.Access);

    bool result;
    security.ModifyAccessRule(AccessControlModification.Set, accessRule, out result);

    if (!result)
    
        throw new InvalidOperationException("Failed to give full-control permission to all users for path " + path);
    

    // add inheritance
    var inheritedAccessRule = new FileSystemAccessRule(
        allUsers,
        rights,
        InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
        PropagationFlags.InheritOnly,
        AccessControlType.Allow);

    bool inheritedResult;
    security.ModifyAccessRule(AccessControlModification.Add, inheritedAccessRule, out inheritedResult);

    if (!inheritedResult)
    
        throw new InvalidOperationException("Failed to give full-control permission inheritance to all users for " + path);
    

    info.SetAccessControl(security);

【讨论】:

我可以像 \\server\folder1\subfolder1\subfolder2 一样更改 网络文件夹 吗?【参考方案2】:

您还需要致电SetAccessControl 以应用更改。

ds = di.GetAccessControl();
ds.AddAccessRule(fsar);
di.SetAccessControl(ds); // nothing happens until you do this

似乎 MSDN 上的示例非常缺乏细节,正如 here 所讨论的那样。我破解了这篇文章中的代码以获得以下表现良好的代码:

static bool SetAcl()

    FileSystemRights Rights = (FileSystemRights)0;
    Rights = FileSystemRights.FullControl;

    // *** Add Access Rule to the actual directory itself
    FileSystemAccessRule AccessRule = new FileSystemAccessRule("Users", Rights,
                                InheritanceFlags.None,
                                PropagationFlags.NoPropagateInherit,
                                AccessControlType.Allow);

    DirectoryInfo Info = new DirectoryInfo(destinationDirectory);
    DirectorySecurity Security = Info.GetAccessControl(AccessControlSections.Access);

    bool Result = false;
    Security.ModifyAccessRule(AccessControlModification.Set, AccessRule, out Result);

    if (!Result)
        return false;

    // *** Always allow objects to inherit on a directory
    InheritanceFlags iFlags = InheritanceFlags.ObjectInherit;
    iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;

    // *** Add Access rule for the inheritance
    AccessRule = new FileSystemAccessRule("Users", Rights,
                                iFlags,
                                PropagationFlags.InheritOnly,
                                AccessControlType.Allow);
    Result = false;
    Security.ModifyAccessRule(AccessControlModification.Add, AccessRule, out Result);

    if (!Result)
        return false;

    Info.SetAccessControl(Security);

    return true;

【讨论】:

谢谢,大卫。不过,仍然没有运气。为此目的,我对“用户”组的使用是否正确?我尝试以管理员身份运行 exe,但当我通过 Windows 并检查文件夹的权限时,似乎仍然没有发生任何事情。 越来越近了。将“用户”更改为“所有人”现在将“所有人”组添加到文件夹中,但权限显示为空白;没有任何批准。 即使使用"Users",代码对我来说也能正常工作。也就是说,我认为全名是@"BUILTIN\Users",但无论哪种方式都可以。 这是一个非常尴尬的代码。这个简单多了:***.com/questions/9108399/… @Elmue 该解决方案对我不起作用-“所有用户”无法完全控制。但是,这个答案和 Timothée Lecomte 的答案确实有效(显然是由于设置了 2 阶段权限)

以上是关于C# - 在 Windows 7 中为所有用户设置目录权限的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中为 Windows 7 和 Xp Sp3 控制 Windows 防火墙

有关如何在 c# 中为 Windows 7 任务栏编码所需的信息

如何在 Win 7 中为 C 中的 Windows 服务检索系统代理设置

在 C# 中为 Windows 窗体创建向导

在 C# 中为本地记分板保存数组

如何使用c#在winforms中为每个用户授予权限