У меня есть служба Windows, которая проверяет наличие обновлений через веб-API, и когда она их находит, загружает их, распаковывает во временный каталог, а затем запускает отдельное консольное приложение, которое останавливает службу Windows и копирует все файлы, перезаписывая старые.

Проблема в том, что программа обновления не имеет разрешения на перезапись файлов в этом каталоге, c:\Program Files (x86)\myApp, если она не работает от имени администратора. Я попытался добавить файл .manifest с requestedExecutionLevel requireAdministrator в скрипт обновления, но это ничего не дало. Служба, которая ее запускает, работает как LocalSystem, поэтому я попробовал asInvoker, но это тоже не сработало.

Интересно то, что часть скрипта имеет StreamWriter для регистрации событий. Я могу создать файл в каталоге, но у меня нет прав на его редактирование.

Первоначально у меня было средство обновления, запускаемое из раздела WPF приложения, а не из службы Windows, но затем я понял, что если ни один пользователь не вошел в систему, он не будет обновляться. Это можно обойти? Вот соответствующий фрагмент, с которым я работаю:

// Load the update path
Console.WriteLine("Loading update path from UpdatePath.txt"); 
string[] zipDir = File.ReadAllLines("UpdatePath.txt");
Console.WriteLine("Loading update from: " + zipDir);

// Copy all the updated files to the current directory (this will include the renamed service.exe)
Console.WriteLine("Copying zip contents to current directory ( " + Directory.GetCurrentDirectory() + " )");
string[] files = Directory.GetFiles(zipDir[0], "*.*", SearchOption.TopDirectoryOnly);
foreach (string f in files)
{
    string fileName = Path.GetFileName(f);
    if(fileName != "Configuration.ini") {
        Console.WriteLine("Copying " + f + " =>" + Directory.GetCurrentDirectory() +"//" + fileName);
        File.Copy(f, fileName, true);  //Breaks right here
    }
}

Console.WriteLine() использовался для записи в файл, но он тоже сломался, поэтому я изменил его.

0
Alan 14 Июн 2018 в 06:43

1 ответ

Лучший ответ

У меня есть следующий код для предоставления доступа к созданной мной папке.

Необходимо использовать пространство имен « using System.Security.AccessControl; »

 private static void CreateSomeFolder()
 {
        try
        {
            //Create some folder and grant full permissions
            var someFolder = "SomeDataFolderPath";
            if (Directory.Exists(someFolder)) return;
            Directory.CreateDirectory(someFolder);
            GrantAccess(someFolder);
        }
        catch (Exception ex)
        {
            log.Error("Folder Creation Error - ", ex);
        }
 }

private static bool GrantAccess(string fullPath)
{
   var dInfo = new DirectoryInfo(fullPath);
   var dSecurity = dInfo.GetAccessControl();
   dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
   dInfo.SetAccessControl(dSecurity);
   return true; 
}
1
Kishore 14 Июн 2018 в 14:16