有没有办法在不提示用户的情况下安装 ClickOnce 应用程序?我说的是用户第一次运行应用程序时得到的“运行/不运行”。
这里似乎有一些线索,但我相信这是关于跳过“海拔”(UAC)和安全提示,而不是实际的初始“运行/不运行”屏幕。
我只能找到有关如何静默更新过去安装的应用程序的信息,但没有找到有关第一次静默安装应用程序的信息。
我还发现这篇文章似乎是相关的,但同样,不确定我们是否在谈论相同的用户提示......
可以避免“运行”/“不运行”提示,尽管您仍然存在实际将文件复制给用户的问题,这通常需要他们通过链接启动 .application。但是,您可以通过登录脚本或类似的方式启动它。大概您已经以某种方式解决了该问题,因为它暗示了您的问题。您链接到的另一个问题围绕着这个问题徘徊,但它并没有真正让您一路走好。
我知道您可以绕过“运行”/“不运行”提示,因为我刚刚使用 ClickOnce 成功完成了它,我们将其部署为自助服务终端机器上的自定义 shell。关键是 ClickOnce 必须由受信任的发布者签名。如果您在客户端机器上配置了正确的东西,即使是自签名也是可以的。
因此,让网络管理员推出一个信任用于签署您的应用程序的代码签名证书的组策略。这里有关于如何在 TechNet 上执行此操作的信息:http ://technet.microsoft.com/en-us/library/cc770315(v=WS.10).aspx ,在此简要转载:
打开组策略管理控制台。
查找现有 GPO 或创建新 GPO 以包含证书设置。确保 GPO 与您希望其用户受策略影响的域、站点或组织单位相关联。
右键单击 GPO,然后选择编辑。组策略管理编辑器打开,并显示策略对象的当前内容。
在导航窗格中,打开计算机配置\Windows 设置\安全设置\公钥策略\受信任的发布者。
单击操作菜单,然后单击导入。
按照证书导入向导中的说明查找并导入证书。
如果证书是自签名的,并且无法追溯到受信任的根证书颁发机构证书存储中的证书,那么您还必须将证书复制到该存储。在导航窗格中,单击受信任的根证书颁发机构,然后重复步骤 5 和 6 以将证书副本安装到该存储。
如何创建自定义 ClickOnce 安装程序?http://msdn.microsoft.com/en-us/library/dd997001.aspx
更新链接(2016 年 10 月 6 日)
除了 MikeBazs Answer,我想提供以下“解决方法”,它使 Click-Once-Application 的安装“非交互式”和“几乎无声”(用户在安装过程中看到进度窗口,没有点击需要和/或可能)
有一些“问题”需要考虑,但如果您遵循本指南,结果应该是您所需要的:
1.)签署您的应用程序:在 Visual Studio 中,您可以使用自己的证书轻松签署您的应用程序,这没什么大不了的。
2.)分发证书:为了避免对话框,如果应该安装应用程序,您需要将您的证书分发到任何机器上的以下商店(为此使用 GPO):Trusted Publishers
和Trusted Root Certification Authorities
现在,用户只需单击即可安装应用程序 - 没有安全问题。但我们想要零点击:
3.) 创建一个位于服务器上的 powershell 脚本,该脚本调用应用程序的 setup.exe(如果尚未安装):
$appInfo = Get-ChildItem HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall | foreach-object {Get-ItemProperty $_.PsPath}
$displayName = $appInfo | ? { $_.displayname -eq "MyApplicationName" } | select displayName
if ($displayName -eq $null){
# MyApplicationName not installed, install!
Start-Process "\\server\share\MyApplication\Application\setup.exe"
}
现在,用户可以执行该脚本,只需安装一次,无需进一步确认。但应用程序在安装后启动。
4.)修改应用程序的源代码:我使用了一个虚拟文件来检测应用程序的首次运行。如果它是第一次运行,(即安装后)我只是再次关闭它:
private void Form1_Load(object sender, EventArgs e)
{
//first run? That's a initial deployment, close application.
if (!File.Exists("C:\\some\\static\\path\\notfirstrun.dat"))
{
File.WriteAllText("C:\\some\\static\\path\\notfirstrun.dat", "1");
Application.Exit();
}
现在,用户可以执行该脚本,只需安装一次,无需进一步确认,并且应用程序在安装后不会“自动启动”。
但我们也想避免“点击”:
如果我们在 Startup-Folder 中设置 powershell 脚本 - 它会弹出,这很难看。如果我们将其设置为 Login-Script,它不会在用户上下文中运行,而这是 Click-Once 所必需的。
作为“这个”问题的解决方法,您可以将其包装在vbs
脚本中,调用 powershell 脚本。请注意,这是在用户上下文中执行的,因此用户需要权限才能执行 powershell-scripts:
Dim objShell
Set objShell=CreateObject("WScript.Shell")
strCMD="powershell.exe -sta -noProfile -NonInteractive -nologo -ExecutionPolicy Bypass -f \\server\share\scripts\install_App.ps1"
objShell.Run strCMD,0,True
最后,使用 GPO 将您的 vbs 脚本部署到任何用户的启动文件夹中。
用户将看到的只是“安装”进度。
简而言之:
如果不提示用户,就无法安装 ClickOnce 应用程序。如果您希望用户能够双击它,并且它只是安装而无需与用户进行验证,请不要使用 ClickOnce。坦率地说,根据我的经验,只有在企业环境中使用 SMS 推送的恶意软件和程序包才会安装,而不会向用户发出任何提示。