0

我正在尝试使用自动/自我更新程序构建应用程序。该文件将检查更新,然后立即下载文件并替换必要的文件。我一直在尝试将其放入安装程序包中,但遇到了应用程序文件夹只读的问题。我尝试使用多个 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 调用一个辅助 exe 并自行关闭。帮助程序 exe 更新剩余的文件(即更新程序本身)
  • 助手然后启动主应用程序。
4

2 回答 2

0

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

I ended up doing a self-elevation (restart run-as) for the updater. This will only ask for permission if there is an update available.

// 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);
}

Another solution that is working, although not entirely how I would like it, is to go through each project's properties -> Security -> Enable ClickOnce security settings and then building the installer. This is annoying because it asks for permission every time the file runs on a UAC account. However, it is working and doesn't require some looping exe launching.

于 2013-04-22T21:41:59.930 回答
0

您不是要删除只读标志,而是要提高在该文件夹中写入的权限 - 它一开始就不是只读的。

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

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

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

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

或者您可以切换到 ClickOnce,这是免费的。授予 - 使用 ClickOnce 安装程序可以执行的操作有一些小的限制。

于 2013-04-22T21:08:21.270 回答