正在创建XML文件,该文件的写访问权限授予所有windows帐户用户
本文关键字:文件 windows 用户 写访问 XML 创建 权限 | 更新日期: 2023-09-27 18:00:50
我正在使用C#在公共应用程序文件夹中创建一个XML文件:
%ALLUSERSPROFILE%'Application Data'
安装应用程序时将创建文件。这个文件对于本地机器的所有用户来说都是通用的。(即包含一些设置信息(
但我的问题是,当文件由管理员用户创建(即应用程序由管理员用户安装(时,其他用户没有对该文件的写访问权限。当我检查文件的属性时,它只给了其他用户"读取并执行"。
我正在使用以下代码来保存文件
XDocument.Save(filePath);
是否可以为所有用户创建具有写访问权限的文件?非常感谢您的帮助!
您不能将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());
}
}