C#从主应用程序文件夹中删除只读

时间:2013-04-22 21:04:16

标签: c# visual-studio-2010 windows-installer

我正在尝试使用自动/自更新程序构建应用程序。该文件将检查更新,然后立即下载文件并替换必要的文件。我一直在尝试将其放入安装程序包中,但遇到了只读取应用程序文件夹的问题。我尝试使用多个SO this one中的代码删除readonly参数,但是在安装程序后,该文件夹仍然是只读的。

[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
public override void Install(IDictionary stateSaver)
{
    base.Install(stateSaver);
    try
    {
        string path = this.Context.Parameters["targetdir"];
        path = path.Substring(0, path.Length - 1);

        DirectoryInfo di = new DirectoryInfo(path);
        di.Attributes &= ~FileAttributes.ReadOnly;
        di.Refresh();
    }
    catch (Exception e)
    {
    }
}

我也试过将它放在Commit方法中。路径肯定被拉(MessageBox.Show显示正确的路径)。

我是否需要做一些不同的事情才能更改应用程序的主文件夹?


我不明白为什么更新程序过程在这个问题的上下文中很重要,但这是它的工作原理:

  • 用户将更新程序应用程序作为主应用程序的“门户”启动。
  • 更新程序检查服务器以查找特定于该设备的更新。
  • 下载新文件并替换当前未锁定的所有文件。
  • 然后exe调用一个helper exe并自行关闭。帮助程序exe更新剩余的文件(IE更新程序本身)
  • 帮助程序然后启动主应用程序。

2 个答案:

答案 0 :(得分:0)

你不是要删除只读标志,你正在寻找提升的权限来写入该文件夹 - 它不是只读的开头。

为此,您可以使用“RunAs”运行安装程序应用程序:

// launcher code
  if (CheckIfUpdateAvailable()){
    ProcessStartInfo startInfo = new ProcessStartInfo ("MyUpdater.exe");  
    startInfo.Verb = "runas";
    System.Diagnostics.Process.Start (startInfo); 
    Application.Quit();
  }

启动器生成的进程将有权在您的应用文件夹中写入

并且您的更新程序必须是您与应用程序一起部署的可执行文件 - 您会发现很难覆盖正在运行的可执行文件

或者您可以切换到ClickOnce,这是免费的。当然 - 使用ClickOnce安装程序可以做些什么有一些小的限制。

答案 1 :(得分:0)

http://support.microsoft.com/kb/981778

我最终为更新程序进行了自我提升(restart run-as)。如果有可用的更新,这只会请求许可。

// During update process:
if (!IsAdministrator()) 
{
    // Launch itself as administrator
    ProcessStartInfo proc = new ProcessStartInfo();
    proc.UseShellExecute = true;
    proc.WorkingDirectory = Environment.CurrentDirectory;
    proc.FileName = Application.ExecutablePath;
    proc.Verb = "runas";

    try
    {
        Process.Start(proc);
    }
    catch
    {
        // The user refused to allow privileges elevation.
        // Do nothing and return directly ...
        return false;
    }
    Application.Exit();
}



public static bool IsAdministrator()
{
    var identity = WindowsIdentity.GetCurrent();
    var principal = new WindowsPrincipal(identity);
    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}

另一个正在运行的解决方案,虽然不完全是我想要的,但是要浏览每个项目的属性 - >安全 - >启用ClickOnce安全设置,然后构建安装程序。这很烦人,因为每次文件在UAC帐户上运行时都会要求权限。但是,它正在工作,并且不需要一些循环exe启动。