Система.Исключение несанкционированного доступа при создании файла в папке приложения

#.net #winforms

#.net #winforms

Вопрос:

У меня есть приложение Winforms, которое должно создавать запись в определенный файл конфигурации во время использования. Как только я использую режим отладки, этот файл можно создать и записать в него, но как только я создаю проект установки и фактически устанавливаю приложение, я не могу получить доступ к следующему исключению.

Файл конфигурации находится в том же каталоге, что и program (в Program Files )

Код, который я использую для чтения / записи.

 public static string[] GetDefaultConfigFile(string path)
{
    string[] res = {};
    if (File.Exists(GetInternalFileName(path)))
    {
        using (StreamReader tr = new StreamReader(GetInternalFileName(path)))
        {
            res = tr.ReadToEnd().Split(';');
        }
    }
    return res;
}

public static void SaveDefaultConfigFile(string fileName, string path)
{
    using (var tw = new StreamWriter(GetInternalFileName(path)))
    {
        tw.Write(fileName);
        tw.Close();
    }
}

private static string GetInternalFileName(string path)
{
    return path   "\setup.config";
}
  

Ответ №1:

Возможно, учетная запись, используемая для запуска этого кода, не имеет достаточных привилегий для записи в указанную папку ( Program Files ) . Если вы работаете под управлением Windows 7 или Vista standard, пользователям не разрешено выполнять запись в эту папку. В этом случае вы можете использовать пользовательскую папку c:usersusername для хранения параметров конфигурации.

Также я бы упростил:

 public static string[] GetDefaultConfigFile(string path)
{
    return File.ReadAllText(path).Split(';');
}

public static void SaveDefaultConfigFile(string fileName, string path)
{
    File.WriteAllText(path, fileName);
}

private static string GetInternalFileName(string path)
{
    return Path.Combine(path, "setup.config");
}
  

Комментарии:

1. Спасибо, есть ли какой-нибудь способ принудительно запустить приложение с правами администратора?

2. @eugeneK, да, при запуске приложения вы щелкаете правой кнопкой мыши по исполняемому файлу и выбираете Запуск от имени администратора. Или в свойствах ярлыка, я думаю, на вкладке Совместимости есть флажок, где вы можете заставить этот ярлык всегда запускаться от имени администратора. В этом случае пользователю будет запрашиваться пароль администратора при каждом запуске ярлыка.

3. у меня нет запущенного приложения от имени администратора для этого приложения. Кроме того, внутри папки приложения есть папка, в которую NLog успешно записывает журналы.

4. @eugeneK, в этом случае вы могли бы попробовать предоставить разрешения на чтение / запись в папку, которую вы хотите записать. Я не знаю, что вы ожидаете от меня еще сказать. У программы недостаточно прав для записи в эту папку.

5. Как я могу предоставить такие разрешения? Я попытался создать app.manifest, в котором мне требовался доступ администратора, но приложение не отображает графический интерфейс, поскольку UIAccess имеет значение false, когда я устанавливаю для него значение true, я получаю сообщение об ошибке.