Невозможно записать в Program Files даже с помощью requireAdministratorC#

Место общения программистов C#
Ответить
Anonymous
 Невозможно записать в Program Files даже с помощью requireAdministrator

Сообщение Anonymous »

Я создаю собственный установщик WPF .NET 8 для развертываемого приложения. Для запуска самого приложения не потребуются права администратора, но установщику необходимо разрешение на запись в Program Files.
Согласно множеству сообщений, которые я нашел в SO, а также CodeProject, я должен иметь возможность получить доступ к защищенной папке, установив в файле app.manifest моего проекта.Я так и сделал, но при попытке создать там файлы получаю ошибку «Доступ запрещен». Для справки, это код, который я запускаю:

Код: Выделить всё

var embeddedFiles = Assembly.GetExecutingAssembly().GetManifestResourceNames();
foreach (string embeddedFile in embeddedFiles)
{
using var fileStream = new FileStream(
Path.Combine(InstallationDirectory,
embeddedFile.Split($"{projectName}.InstallFiles.")[0]), FileMode.Create,
FileAccess.Write);
using var file = Assembly.GetExecutingAssembly()
.GetManifestResourceStream(embeddedFile);
await file.CopyToAsync(fileStream);
}
Я заметил разницу в том, что во всех примерах и статьях, которые я нашел, целью было скопировать существующий файл из другого места в Program Files, пока я использование FileStream для копирования файла из встроенного ресурса в защищенную папку. Не знаю, имеет ли это какое-то значение, но это стоит отметить.
Я также нашел кое-что интересное. Я создал простое консольное приложение, которое обращается к файлу из папки внутри ProgramFiles и копирует его в ту же папку с другим именем:

Код: Выделить всё

Console.WriteLine("I'll try to duplicate a file now...");
try
{
var embeddedFiles = Assembly.GetExecutingAssembly().GetManifestResourceNames();
using var fileStream = new FileStream(@"C:\Program Files\OpenMPT\License.txt", FileMode.Create,
FileAccess.Write);
using var file = Assembly.GetExecutingAssembly().GetManifestResourceStream(embeddedFiles[0]);
await file.CopyToAsync(fileStream);
}
catch (Exception e)
{
Console.WriteLine(e);
Console.WriteLine("Alas, I couldn't do it...");
return;
}
Console.WriteLine("Egad! I did it!");
Все работало безупречно.

¹ На данный момент я нашел следующее:
  • C# не может получить доступ к системным файлам даже с правами администратора
  • https://www.codeproject.com/Questions/798662/How -can-I-write-to-program-files-x-folder
  • Необходим доступ к папке «Program Files»
  • Доступ к папке Program Files из группы пользователей с использованием кода .NET


Подробнее здесь: https://stackoverflow.com/questions/784 ... inistrator
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»