将“Everyone”权限添加到共享网络文件夹

3
注意:请勿根据标题相似而忽略此内容。
我正在尝试在Windows 7机器上共享文件夹,并希望通过C#将其授予所有人完全权限。
我已经看到了其他页面上的几篇文章,包括这里,告诉我如何做。但像其他一些人一样,它对我不起作用。下面是从SO中摘取的片段。
    DirectorySecurity sec = Directory.GetAccessControl(path);
    // Using this instead of the "Everyone" string means we work on non-English systems.
    SecurityIdentifier everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
    sec.AddAccessRule(new FileSystemAccessRule(everyone, FileSystemRights.FullControl | FileSystemRights.Synchronize, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
    Directory.SetAccessControl(path, sec);

在我调用上面的代码之前,共享文件夹已经完成。下面的图片是我得到的结果: enter image description here 目前为止,一切都很好。但是在下一个图片中,您将看到剩下的两个复选框仍然未被选中。 enter image description here 我错过了什么吗?
谢谢!
编辑:下面是用于实际共享的代码。
    private static void QshareFolder(string FolderPath, string ShareName, string Description)
    {
        try
        {
            ManagementClass managementClass = new ManagementClass("Win32_Share");
            ManagementBaseObject inParams = managementClass.GetMethodParameters("Create");
            ManagementBaseObject outParams;

            inParams["Description"] = Description;
            inParams["Name"] = ShareName;
            inParams["Path"] = FolderPath;
            inParams["MaximumAllowed"] = null;
            inParams["Password"] = null;
            inParams["Access"] = null;
            inParams["Type"] = 0x0; // Disk Drive

            // Invoke the method on the ManagementClass object
            outParams = managementClass.InvokeMethod("Create", inParams, null);

            // Check to see if the method invocation was successful
            if ((uint) (outParams.Properties["ReturnValue"].Value) != 0)
            {
                throw new Exception("Unable to share directory.");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "error!");
        }
    }
2个回答

3
分享和底层文件夹上的权限是独立的 - 您的代码设置文件/文件夹的ACL...因此,您错过了在网络共享本身上设置ACL的部分。
当通过共享最终访问文件时,权限将取决于文件和共享权限中的最小值。
我不知道如何在共享上设置ACL,但这里有一个相关的C++问题,可能是如何在共享上设置权限的好起点: How to create read-only network share programmatically?.

我已经添加了用于共享的代码。那是我需要修改的吗? - JimDel
是的。注意:您需要两个部分 - 您已经拥有的文件夹上的ACL和共享上的ACL。 - Alexei Levenkov
谢谢提供链接,但是C++的信息对我帮助不大。 - JimDel

0

其实,我遇到的问题与你相反,而你的第一段代码片段解决了我的问题。你的实现只是缺少了一个SecurityDescriptor。

 private static ManagementObject GetSecurityDescriptor()
 {
            ManagementObject Trustee = new ManagementClass(new ManagementPath("Win32_Trustee"), null);
            Trustee["SID"] = GetWellKnwonSid(WellKnownSidType.WorldSid);
            Trustee["Name"] = "Everyone";

            ManagementObject userACE = new ManagementClass(new ManagementPath("Win32_Ace"), null);
            userACE["AccessMask"] = 2032127;//Full access
            userACE["AceFlags"] = AceFlags.ObjectInherit | AceFlags.ContainerInherit;
            userACE["AceType"] = AceType.AccessAllowed;
            userACE["Trustee"] = Trustee;

            ManagementObject secDescriptor = new ManagementClass(new ManagementPath("Win32_SecurityDescriptor"), null);
            secDescriptor["ControlFlags"] = 4; //SE_DACL_PRESENT 
            secDescriptor["DACL"] = new object[] { userACE };
            secDescriptor["Group"] = Trustee;
            return secDescriptor;
  }

private static byte[] GetWellKnwonSid(WellKnownSidType SidType)
{
      SecurityIdentifier Result = new SecurityIdentifier(SidType, null);
      byte[] sidArray = new byte[Result.BinaryLength];
      Result.GetBinaryForm(sidArray, 0);

      return sidArray;
}

你需要将这个赋值给 Win32_Share 实例的 Access 属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接