正在创建XML文件,该文件的写访问权限授予所有windows帐户用户

本文关键字:文件 windows 用户 写访问 XML 创建 权限 | 更新日期: 2023-09-27 18:00:50

我正在使用C#在公共应用程序文件夹中创建一个XML文件:

%ALLUSERSPROFILE%'Application Data'

安装应用程序时将创建文件。这个文件对于本地机器的所有用户来说都是通用的。(即包含一些设置信息(

但我的问题是,当文件由管理员用户创建(即应用程序由管理员用户安装(时,其他用户没有对该文件的写访问权限。当我检查文件的属性时,它只给了其他用户"读取并执行"。

我正在使用以下代码来保存文件

XDocument.Save(filePath);

是否可以为所有用户创建具有写访问权限的文件?非常感谢您的帮助!

正在创建XML文件,该文件的写访问权限授予所有windows帐户用户

您不能将ACL的信息传递到XDocument.Save方法中,但您可以在保存xml文档后修改文件的权限。您可以使用以下代码来执行它(不要忘记添加对System.Security.dll的引用(:

using System.Security.AccessControl;
using System.Security.Principal;
using System.IO;
public class FileAccessRulesHelper
{
    public void AddWriteRightsToEveryone(string filename)
    {
        // get sid of everyone group
        SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
        // create rule
        FileSystemAccessRule rule = new FileSystemAccessRule(sid, FileSystemRights.Write, AccessControlType.Allow);
        // get ACL of file
        FileSecurity fsecurity = File.GetAccessControl(filename);
        // modify ACL of file
        fsecurity.AddAccessRule(rule);
        // apply modified ACL to file
        File.SetAccessControl(filename, fsecurity);
    }
}

我认为你不能将参数传递给XDocument。保存可以控制权限,但你应该可以在保存后设置权限。应该做以下事情:

System.Security.AccessControl.FileSecurity fsec = System.IO.File.GetAccessControl(fileName);
fsec.AddAccessRule( new System.Security.AccessControl.FileSystemAccessRule("Everyone", System.Security.AccessControl.FileSystemRights.Modify, System.Security.AccessControl.AccessControlType.Allow));
System.IO.File.SetAccessControl(fileName, fsec);

我在安装服务时遇到了类似的问题。您可以使用以下代码为文件夹授予不同的权限。

public static void CreateWithFullAccess(string targetDirectory)
    {
        try
        {
            if (!Directory.Exists(targetDirectory))
            {
                Directory.CreateDirectory(targetDirectory);
            }
            DirectoryInfo info = new DirectoryInfo(targetDirectory);
            SecurityIdentifier allUsersSid =
            new SecurityIdentifier(WellKnownSidType.LocalServiceSid,
            null);
            DirectorySecurity security = info.GetAccessControl();
            security.AddAccessRule(
            new FileSystemAccessRule(allUsersSid,
            FileSystemRights.FullControl,
            AccessControlType.Allow));
            info.SetAccessControl(security);
        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.ToString());
        }
    }