我正在尝试使用自动/自更新程序构建应用程序。该文件将检查更新,然后立即下载文件并替换必要的文件。我一直在尝试将其放入安装程序包中,但遇到了只读取应用程序文件夹的问题。我尝试使用多个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显示正确的路径)。
我是否需要做一些不同的事情才能更改应用程序的主文件夹?
我不明白为什么更新程序过程在这个问题的上下文中很重要,但这是它的工作原理:
答案 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启动。