如何在不提示用户的情况下安装ClickOnce应用程序?

Joe*_*Joe 6 clickonce

有没有办法在不提示用户的情况下安装ClickOnce应用程序?我说的是用户第一次运行应用程序时获得的"运行/不运行".

这里似乎有一些线索,但我相信这是关于跳过"提升"(UAC)和安全提示,而不是实际的初始"运行/不运行"屏幕.

我只能找到有关如何静默更新过去安装的应用程序的信息,但没有关于第一次静默安装应用程序的信息.

我也发现这篇文章似乎有关系,但同样,不确定我们是否在谈论相同的用户提示......

Mik*_*SFT 9

可以避免"运行"/"不运行"提示,尽管您仍然存在将文件实际复制到用户的问题,这通常需要他们通过链接启动.application.但是,您可以通过登录脚本或其他方式启动它.大概你已经以某种方式解决了这个问题,因为你的问题暗示了你的问题.你所关联的另一个问题是围绕这个徘徊,但它并没有真正让你一路走来.

我知道您可以绕过"运行"/"不运行"提示,因为我刚刚使用ClickOnce成功完成了它,我们将其部署为自助服务终端机器上的自定义shell.关键是ClickOnce必须由受信任的发布者签名.如果您在客户端计算机上配置了正确的东西,即使是自签名也没问题.

因此,让网络管理员推出一个组策略,该组策略信任用于签署应用程序的代码签名证书.有关如何在TechNet上执行此操作的信息,请访问:http://technet.microsoft.com/en-us/library/cc770315(v = WS.10).aspx,此处简要回顾:

  1. 打开组策略管理控制台.

  2. 查找现有GPO或创建新GPO以包含证书设置.确保GPO与您希望受策略影响的用户的域,站点或组织单位相关联.

  3. 右键单击GPO,然后选择"编辑".组策略管理编辑器打开,并显示策略对象的当前内容.

  4. 在导航窗格中,打开"计算机配置\ Windows设置\安全设置\公钥策略\受信任的发布者".

  5. 单击"操作"菜单,然后单击"导入".

  6. 按照证书导入向导中的说明查找并导入证书.

  7. 如果证书是自签名的,并且无法追溯到受信任的根证书颁发机构证书存储中的证书,则还必须将证书复制到该存储.在导航窗格中,单击"受信任的根证书颁发机构",然后重复步骤5和6以将证书的副本安装到该存储.


dog*_*ose 6

除了 MikeBazs 答案之外,我还想提供以下“解决方法”,使单击一次应用程序的安装“非交互式”和“几乎无声”(用户在安装过程中看到进度窗口,无需单击必需的和/或可能的)

有一些“问题”需要考虑,但如果您遵循本指南,结果应该是您需要的:

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"
}
Run Code Online (Sandbox Code Playgroud)

现在,用户可以执行该脚本,只需安装一次,无需进一步确认。但应用程序在安装后启动。

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();
        }
Run Code Online (Sandbox Code Playgroud)

现在,用户可以执行该脚本,只需安装一次,无需进一步确认,并且应用程序在安装后不会“自动启动”。

但我们也想避免“点击”:

如果我们在启动文件夹中设置 powershell 脚本 - 它会弹出,这很丑陋。如果我们将其设置为登录脚本,它不会在用户上下文中运行,而这是 Click-Once 所需的。

作为解决“此”问题的方法,您可以将其包装在vbs脚本中,调用 powershell 脚本。请注意,这是在用户上下文中执行的,因此用户需要执行 powershell 脚本的权限:

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
Run Code Online (Sandbox Code Playgroud)

最后,使用 GPO 将 vbs 脚本部署到任何用户的启动文件夹中。

用户将看到的只是“安装”进度。

简而言之:

  • 签署您的代码
  • 分发您的证书
  • 使用 powershell 脚本触发安装
  • 将 powershell 脚本包装在不可见的 vbs 脚本中
  • 将 vbs 脚本部署到每个用户的启动文件夹。


Rob*_*Net 1

无法在不提示用户的情况下安装 ClickOnce 应用程序。如果您希望用户能够双击它,并且它只是安装而不与用户验证,请不要使用 ClickOnce。坦率地说,根据我的经验,只有在企业环境中通过短信推送的恶意软件和软件包才会安装,而不会向用户发出任何提示。

  • 我的猜测是因为它不准确并且被接受的答案:-P (5认同)
  • 这是静默安装的一个很好的理由:[Chocolatey](https://chocolatey.org/)。ClickOnce 是一个巨大的痛点。 (4认同)