Создание XML-файла с доступом на запись для всех пользователей учетной записи Windows - PullRequest
1 голос
/ 30 июня 2011

Я создаю файл XML в общей папке приложения, используя C #:

%ALLUSERSPROFILE%\Application Data\

Файл будет создан при установке приложения. Этот файл является общим для всех пользователей локальной машины (т.е. он содержит некоторую информацию о настройках)

Но моя проблема в том, что когда файл создается пользователем с правами администратора (т.е. приложение устанавливается пользователем с правами администратора), другие пользователи не имеют доступа к записи в файл. Когда я проверил атрибуты файла, он дал только «Чтение и выполнение», а другим пользователям.

Я использую приведенный ниже код для сохранения файла

XDocument.Save(filePath);

Можно ли создать файл с правами записи, предоставленными всем пользователям? Любая помощь высоко ценится!

Ответы [ 3 ]

4 голосов
/ 30 июня 2011

Вы не можете передать информацию о 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);
    }
}
2 голосов
/ 30 июня 2011

Не думаю, что вы можете передать параметр в XDocument.Save для управления разрешениями, но вы сможете установить их после сохранения.Что-то вроде следующего должно сделать:

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);
0 голосов
/ 30 июня 2011

У меня была похожая проблема с установкой службы. Вы можете использовать следующий код, чтобы дать папке другие права доступа.

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());
        }
    }
...