Путь для хранения сведений о приложении "на машину"

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

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

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

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

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

Спасибо

3 ответа

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

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

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

Я бы предложил вам изучить 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, чтобы найти правильный каталог для использования.

Другие вопросы по тегам