ClickOnce管理员启动并且支持ClickOnce更新

ClickOnce管理员启动并且支持ClickOnce更新

开发需求:WPF应用通过ClickOnce发布应用,且必须通过管理员权限启动应用,提供手动检测更新功能。

在做WPF开发的时候,我们知道使用ClickOnce打包发布应用,方便应用更新管理,ClickOnce在打包时只要设置更新策略就可以正常使用更新功能。但是加上管理员权限这样就行不通了,有什么解决方案呢?

经过多番资料查询,终于在一个帖子中找到了解决方案。

首先,我们来看看通过管理员启动的代码。在Application的OnStartup方法中调用如下代码即可管理员权限启动ClickOnce应用。

private void CheckAdministrator()
{
    var wi = WindowsIdentity.GetCurrent();
    var wp = new WindowsPrincipal(wi);
    bool runAsAdmin = wp.IsInRole(WindowsBuiltInRole.Administrator);
    if (!runAsAdmin)
    {
        var processInfo = new ProcessStartInfo(Assembly.GetExecutingAssembly().CodeBase)
        {
            UseShellExecute = true,
            Verb = "runas",
            Arguments = StartFlag
        };
        try
        {
            Process.Start(processInfo);
        }
        catch (Exception ex)
        {}
        Environment.Exit(0);
    }
}

但是为什么ClickOnce更新功能会失效呢?

看Assembly.GetExecutingAssembly().CodeBase这段代码,实际上是获取了ClickOnce应用的exe文件地址,这样直接启动exe就会导致ApplicationDeployment.IsNetworkDeployed=false,认为应用不是ClicKOnce应用,故而ClickOnce更新功能失效。

接下来,就解决更新失效的问题。根据上面的blog得知,在使用管理员权限启动应用后,再通过appref-ms启动即可兼得管理员权限和ClickOnce更新功能。

实际上App会启动三次,第一次用户点击快捷方式进入应用,此时会进行管理员权限启动应用(即第二次启动),看CheckAdministrator代码中ProcessInfo参数,其中Arguments设置了一个Flag标识,第二次启动后由于StartupEventArgs参数中Args包含了Flag标识,那么此时通过appref-ms进行第三次启动,并退出当前进程。

经过如上操作,第三次启动的应用同时兼具了管理员权限和ClickOnce的功能。

private void App_Startup(object sender, StartupEventArgs e)
{
    if (e.Args != null && e.Args.Length > 0 && (e.Args[0].Equals(StartFlag)))
    {
        var flag = e.Args[0];
        if(StartFlag.Equals(flag))
        {
            StartAppAgain();
        }
        Environment.Exit(0);
    }
    else
    {
        CheckAdministrator();
    }
}

通过appref-ms启动代码如下,重点是如何得到appref-ms的路径。

private void StartAppAgain()
{
    string publisherName = System.Windows.Forms.Application.CompanyName;
    string productName = System.Windows.Forms.Application.ProductName;
    string allProgramsPath = Environment.GetFolderPath(Environment.SpecialFolder.Programs);
    string shortcutPath = Path.Combine(allProgramsPath, publisherName);
    shortcutPath = Path.Combine(shortcutPath, productName) + ".appref-ms";
    try
    {
        Process.Start(shortcutPath);
    }
    catch (Exception ex)
    {}
}

原文地址:https://www.cnblogs.com/devin_zhou/p/9804987.html

时间: 2024-10-13 23:57:43

ClickOnce管理员启动并且支持ClickOnce更新的相关文章

C# ClickOnce deployment for Windows Services ClickOnce 部署windows service

A simple solution that I use is to merely stop the service and x-copy the files from my bin folder into the service folder. A batch file to stop the service then copy the files should be easy to throw together. Net stop myService xcopy \\myServerWith

Win7 远程桌面 错误代码:5 异常处理(您的远程桌面会话即将结束 此计算机的虚拟内存可能不足。请关闭其他程序,然后重试连接远程计算机。如果问题仍然存在,请联系网络管理员或技术支持。)

问题表现: 在用windows7 远程桌面连接其他电脑时,出现错误提示对话框—-标题为“严重错误(错误代码:5)”,内容为“您的远程桌面会话即将结束 此计算机的虚拟内存可能不足.请关闭其他程序,然后重试连接远程计算机.如果问题仍然存在,请联系网络管理员或技术支持.” 解决方案1: 1. 在客户端上,导航到下列注册表子项: HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSLicensing 2. 单击 MSLicensing.3. 在“注册表”菜单上,单击“导出注册表文件

简单实用的启动脚本文件(更新中)

原来工作遇到的脚本,记下来几个,感觉很有用: 1 # Some shotcuts of the shells 2 # .startsh 3 # 4 # User specific aliases and functions 5 # 6 alias ..='cd ..' 7 alias ...='cd ../..' 8 alias cls=clear 9 alias ll='ls -al' 10 alias grep='grep -n' 11 alias net='netstat -n|grep'

WebGL 启动加载触发更新流程分析

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. requestAnimFrame(tick); 此命令是 HTML5 中新增的用于替换定时器触发更新的命令,以实现动画更新,其后台实现有一特殊之处

win10中强制vs2015使用管理员启动

首先,和网上流传的版本一样,需要做这下面这两步: 1. 打开VS快捷方式的属性对话框. 2.勾选"用管理员身份运行" 现在,你双击VS的快捷方式,确实可以用管理员身份启动.但是,碰到这种情况,依然不能以管理员身份启动,必须先打开VS,再去打开Solution,蛋碎: 解决办法很简单: 1. 打开VS的安装目录,找到devenv.exe,右键,选择"兼容性疑难解答". 2. 选择"疑难解答程序" 3. 选择"该程序需要附加权限"

Entity Framework Extended Library (EF扩展类库,支持批量更新、删除、合并多个查询等)

今天乍一看,园子里居然没有关于这个类库的文章,实在是意外毕竟已经有很多介绍EF使用的文章了. E文好的可以直接看https://github.com/loresoft/EntityFramework.Extended 也可以在nuget上直接安装这个包,它的说明有点过时了,最新版本已经改用对IQueryable<T>的扩展,而不是DbSet<T>(已经标记为弃用),所以跟我一样有隔离癖好的就可以大胆使用了.下面介绍如何批量删除.更新.查询. 批量删除 本来我们需要这样删除 ? //

mac 下修改 jenkins 端口以及Jenkins的启动、关闭与更新

安装包安装的Jenkins修改默认端口的方法: 先关闭jenkins ; 命令行下修改端口:sudo defaults write /Library/Preferences/org.jenkins-ci httpPort 7071 启动jenkins 启动jenkins: sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist 停止jenkins:sudo launchctl unload /Library/LaunchDa

MySql启动报错,无法更新PID文件

MySql启动报错 Starting MySQL.. ERROR! The server quit without updating PID file (/var/lib/mysql..) 1,查看错误日志 2017-08-10 19:38:14 31865 [Note] InnoDB: Initializing buffer pool, size = 50.0M InnoDB: mmap(53657600 bytes) failed; errno 12 2017-08-10 19:38:14

Source Insight 3.X utf8支持插件更新

[更新内容] 修复了当UTF8文件外部改变时,SI无法检测到的bug. 实现 [下载地址] 点我 [计划] 未来(无限长)优化utf8编码检测规则,提高准确度.