Путь для хранения сведений о приложении «на машину» - PullRequest
1 голос
/ 04 июля 2011

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

В настоящее время я храню его в C: \ Documents and Settings \ All Users \ Данные приложения

Но проблема в том, что всякий раз, когда файл создается администратором, все остальные пользователи не имеют право записи .

Но я хочу разрешение на запись в файл для всех пользователей, чтобы все пользователи могли изменять данные в нем. Может ли кто-нибудь помочь мне в этом?

РЕДАКТИРОВАТЬ: Я хочу сохранить файл XML, который является общим для всех пользователей.

спасибо

Ответы [ 3 ]

0 голосов
/ 04 июля 2011

Я бы посоветовал вам изучить File.SetAccessControl() метод и FileSecurity класс. В частности, документация FileSecurity предоставляет полный пример изменения списка управления доступом к файлу (набор разрешений) для данного файла. Вот упрощенная версия этого примера, которая дает всем право на чтение и запись для C:\TEMP\junk.txt:

using System;
using System.IO;
using System.Security.AccessControl;
using System.Security.Principal;

class WorldWrite
{
    static void Main()
    {
        string filename = @"C:\TEMP\junk.txt";
        if (!File.Exists(filename)) {
            Console.WriteLine("No such file " + filename);
            return;
        }

        /* Get the previous ACL, add a rule to give everyone read
         * and write permission, and write back the resulting ACL. */
        FileSecurity fileACLs = File.GetAccessControl(filename);
        fileACLs.AddAccessRule(new FileSystemAccessRule(
            // For everyone 
            new SecurityIdentifier (
                WellKnownSidType.WorldSid, 
                null /* domain SID; ignored for Everyone */
            ),
            // Allow read and write (of data and metadata), 
            // but not delete or execute
            FileSystemRights.Read | FileSystemRights.Write,
            AccessControlType.Allow
        ));
        File.SetAccessControl(filename, fileACLs);
        Console.WriteLine("Success!");
    }
}

Я также обеспокоен тем, как вы указываете общий каталог данных приложения. Если вы жестко кодируете имя C:\Documents and Settings\All Users\Application Data, тогда ваш код не будет работать в неанглийских версиях Windows, Vista или Windows 7. Может быть лучше использовать SpecialFolder enum , чтобы найти правильный каталог для использования.

0 голосов
/ 08 июля 2011

Если вы используете развертывание ClickOnce, это будет трудно сделать, потому что вам нужно повысить привилегии для чтения / записи в общую папку, а приложения ClickOnce этого не сделают.

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

0 голосов
/ 04 июля 2011

реестр будет хорошим местом для вас? (зависит от того, что вы хотите хранить). Вы можете создать узел в кусте HKLM для доступа всех пользователей

...