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

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

В настоящее время я сохранил его в C:\Documents and Settings\All Users\Application Data.

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

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

EDIT: я хочу хранить xml-файл, общий для всех пользователей.

Благодарность


person Lamps    schedule 04.07.2011    source источник


Ответы (3)


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

person NirMH    schedule 04.07.2011
comment
Нет, этого не будет, я хочу сохранить файл xml. - person Lamps; 04.07.2011

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

person Michael Ratanapintha    schedule 04.07.2011
comment
Я уже пробовал это, но проблема в том, что только владелец файла сможет изменить доступ к файлу. Поэтому я планирую изменить доступ на запись для группы пользователей «Все», как только она будет создана в первый раз. В любом случае спасибо за ваш ответ! - person Lamps; 04.07.2011
comment
Подождите, значит, вам понадобился кто-то, кроме, чем владелец файла, чтобы изменить его разрешения?! Надеюсь, вы понимаете, почему только доверенные пользователи (например, администраторы!) обычно имеют это право... - person Michael Ratanapintha; 04.07.2011

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

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

person RobinDotNet    schedule 07.07.2011
comment
Я исправил это, предоставив всем разрешение на запись при первом создании файла. Теперь другие пользователи могут изменять файл :) - person Lamps; 08.07.2011
comment
Так вы вручную создаете файл? Или вы делаете это из приложения ClickOnce, и если да, то как? - person RobinDotNet; 08.07.2011
comment
Но как вы предоставили разрешение на запись всем? Вы делали это программно или вручную? - person RobinDotNet; 11.07.2011
comment
В приложении ClickOnce? Это позволяет вам создать папку и дать разрешение на запись всем, когда вы ее создали? Я часто получаю этот вопрос, так что это здорово, если вы заставили его работать именно так, и я могу порекомендовать такое же решение другим. - person RobinDotNet; 13.07.2011
comment
Это поможет вам, я думаю, заголовок stackoverflow.com/questions/6533433/ - person Lamps; 14.07.2011