C#控制台应用程序 - 修改权限

时间:2018-06-14 03:43:13

标签: c# .net file-permissions auto-update

我有一个Windows服务,它会检查更新的Web API,当它找到它们时会下载它们,将它们解压缩到临时目录,然后启动一个单独的控制台应用程序来停止Windows服务并复制所有文件覆盖旧的。

问题是更新程序没有权限覆盖该目录中的文件c:\Program Files (x86)\myApp,除非它以管理员身份运行。我尝试将.manifest requestedExecutionLevel文件与requireAdministrator asInvoker一起添加到更新脚本中,但这并没有做任何事情。启动它的服务作为LocalSystem运行,所以我尝试// 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 } } ,但这也没有。

有趣的是,脚本的一部分有一个StreamWriter来记录事件。我可以在目录中创建一个文件,但是没有权限编辑该文件。

我最初从应用程序的WPF部分而不是Windows服务启动了更新程序,但后来意识到如果没有用户登录,那么它就不会更新。有没有解决的办法?以下是我正在使用的相关代码段:

Console.WriteLine()

用于写入文件的TitleID (VARCHAR),Version (BIGINT), CreatedAt (DATETIME),但它也在那里打破了,所以我改变了它。

1 个答案:

答案 0 :(得分: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; 
}