如何使用脚本下载 Chrome 个独立的可执行文件而不损坏文件?
How to download Chrome standalone executables using a script without getting broken files?
几周前,我使用 curl 创建了一个批处理脚本,用于下载我能找到的所有 Chrome 可执行文件,以防万一 Chrome 被更新搞砸了。
在 运行 脚本之后,我没有检查可执行文件是否 运行 正常,因为我假设它们不会有问题。因此,在让脚本堆积 Chrome 版本之后,就在几天前,当我尝试安装旧版本的 Chrome 时,我大吃一惊。 None 脚本下载的文件有效。每次我尝试 运行 它们时,我都会收到“未知安装程序错误”。
这是脚本:
@echo off
set date_and_time=#1_%date:~-10,2%-%date:~3,2%-%date:~-4,4%_%time:~0,2%.%time:~3,2%.%time:~6,2%.#2
md "%USERPROFILE%\Chrome_old_versions\"
set dirct="%USERPROFILE%\Chrome_old_versions\Chrome_%date:~-10,2%-%date:~3,2%-%date:~-4,4%_%time:~0,2%.%time:~3,2%.%time:~6,2%"
md "%dirct%"
cd "%dirct%"
curl --output-dir %dirct% https://dl.google.com/chrome/install/{ChromeStandaloneSetup64}.{exe} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/install/beta/{ChromeBetaStandaloneSetup64}.{exe} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/install/dev/{ChromeDevStandaloneSetup64}.{exe} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/install/{ChromeStandaloneSetup}.{exe} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/install/beta/{ChromeBetaStandaloneSetup}.{exe} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/install/dev/{ChromeDevStandaloneSetup}.{exe} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/mac/beta/{googlechromebeta}.{dmg} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/release2/q/canary/{googlechrome}.{dmg} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/mac/dev/{googlechromedev}.{dmg} -o %date_and_time%
这让我很好奇为什么它不起作用,所以我在 Chrome 中访问了 https://dl.google.com/chrome/install/ChromeStandaloneSetup64.exe,这让我得到了一个完美运行的 exe。奇怪的是,通过 Chrome 下载的两个 exe 和 curl 都具有相同的 sha 512 哈希值。
当我感到困惑时,我尝试了 wget 和 powershell 脚本。
对于wget,我试过:
wget https://dl.google.com/chrome/install/ChromeStandaloneSetup64.exe --no-check-certificate
,这让我再次遇到“未知安装程序错误”。
感谢@John Seerden,然后我使用了他的 powershell script,它下载了一个 googlechromestandaloneenterprise64.msi 可运行的可执行文件。
看到这里,我将他脚本中的googlechromestandaloneenterprise64.msi URL换成https://dl.google.com/chrome/install/ChromeStandaloneSetup64.exe,还是报错
$uri = "https://dl.google.com/chrome/install/googlechromestandaloneenterprise64.msi"
if (-not $PSScriptRoot) {
$PSScriptRoot = Split-Path -Parent -Path $script:MyInvocation.MyCommand.Definition
}
$outFile = "$PSScriptRoot\googlechromestandaloneenterprise64.msi"
Start-BitsTransfer -Source $uri -Destination $outFile
Start-Process -FilePath $outFile -Args "/qn" -Wait
我什至尝试使用 wget 和 curl 下载 https://dl.google.com/chrome/install/googlechromestandaloneenterprise64.msi,但仍然出现错误。
谷歌搜索后,我找到了 this post,它说明了有关获取未标记安装程序的内容,我认为它是通过 curl 或 wget 等第 3 方程序下载的,结束了在提示“未知安装程序错误”时。
经过更多谷歌搜索后,我找到了 post,但我没有使用 Charles,而是使用 Chrome Dev Tools 从“网络”选项卡获取 curl 请求。这也不起作用,同样的错误。
有没有什么方法可以通过脚本下载完全正常的 运行 Chrome 可执行文件,或者有什么方法可以修复损坏的可执行文件?
我宁愿不求助于无头的东西 Chrome.
我使用 WinMerge 比较了这两个独立的 Chrome exe,版本分别为 86.0.4240.111 - 64 位和 87.0.4280.66 - 64 位 ChromeStandaloneSetup64_28-10-2020_14.24.03_valid_Copy_old_version.exe (从 https://dl.google.com/chrome/install/ChromeStandaloneSetup64.exe - broken exe aka missing the download URL tags within the exe) and ChromeStandaloneSetup64_valid_Copy_latest_version.exe (downloaded from https://www.google.com/chrome/?standalone=1&platform=win64 下载 - 有效的 exe aka exe,其中包含下载 URL 标签。
作为比较,这里有一个带标签的下载 URL:
这是一个未标记的下载 URL:
https://dl.google.com/chrome/install/ChromeStandaloneSetup64.exe
在 WinMerge 中,我在 ChromeStandaloneSetup64_valid_Copy_latest_version.exe(右侧的文件)中搜索“&lang=ro&browser”,然后我转到编辑 > Select 线差 (F4),然后合并 > 复制到左侧。接下来,我转到文件 > 另存为 > 将左侧另存为...
然后我在新的 Windows 7 虚拟机 (VM) 中 运行 生成的 exe(已修补的 exe,版本为 86.0.4240.111 64 位),这次它安装正确。出于测试目的,我关闭了网络,当转到 Chrome > 帮助 > 关于 Chrome 中的 3 点菜单时,确实,Chrome 是旧版本。之后,我打开网络,它一直更新到最新版本,87.0.4280.66 64位,运行没问题。
尽管 ChromeStandaloneSetup64_valid_Copy_latest_version.exe(有效的 exe)带有区域标识符备用数据流(ADS),但与损坏的 exe 不同,生成的 exe 是损坏的 exe,缺少 ADS,运行 在虚拟机中完全没问题。关于 ADS,我下载了相同的有效 Chrome exe 两次(87.0.4280.66 64 位),我注意到 ADS 具有相同的确切值。
我还做了额外的测试,我注意到如果生成的 exe 缺少 appguid 和 iid 字段,它将无法安装。
我做的另一件事是弄乱各个字段中的值,所以我将 appguid 和 iid 字段设置为如下所示:
appguid={00000000-0000-0000-0000-000000000000}&iid={00000000-0000-0000-0000-000000000000}
,导致可执行文件无法安装,得到错误代码:0x80070057。
当我处理完 exe 编辑后,我开始处理 URL。
至于这个给定的URL,来自https://www.google.com/chrome/?standalone=1&platform=win64
(有效的 exe):
我精简了 appguid 和 iid,得到:
,导致exe文件损坏,得到与上述相同的错误代码,错误代码:0x80070057。
接下来我要做的是 https://codebeautify.org/generate-random-data-from-regexp 并使用此模式生成 运行dom appguid 和 iid(使用十六进制值,因为我注意到它在那些字段中被使用) :
[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[ 0-9A-F]{12}
,然后使用两个不同的数字:
038C42B4-AF87-AD38-990A-4384A7E29E04 - 对于 appguid
EC7C4A9D-76CB-FBA7-D1C2-70EB689DA8F4 - 对于 iid
,我得到了这个 link:
,在安装过程中出现“无法连接到 Internet。如果您使用防火墙,请将 GoogleUpdate.exe 列入白名单”的错误。
所以,由于 appguid 和 iid 来自 Chrome 的更高版本(appguid 和 iid 从 87.0.4280.66 中获取并插入到 86.0.4240.111),我假设,只有在以下情况下安装才会成功完成包含在 exe 本身中的 appguid 和 iid,通过安装期间的计算,将产生与存储在 exe 中某处的值相匹配的结果,或者在安装期间也得到计算的值。我之所以这样说,是因为当我安装来自损坏的 exe 的生成的有效独立 Chrome exe 时,网络已关闭,并且该系统上没有预先安装 Chrome。或者这两个值可能以某种方式与操作系统相关联。
我的结论是,我想我最终会用那些 appguid 和 iid 修改批处理文件中的 URLs,除非我决定仔细查看 URLs Chrome 即将发布的版本,以便更好地了解所有这些是如何工作的。
这些:
8A69D345-D564-463C-AFF1-A69D9E530F96 - 适用于 appguid
04A7785F-B8A2-B4AA-7A45-17861EB0DE70 - 用于 iid
$Path = $env:TEMP; $Installer = "chrome_installer.exe"; Invoke-WebRequest "http://dl.google.com/chrome/install/375.126/chrome_installer.exe" -OutFile $Path$Installer; Start-Process -FilePath $Path$Installer -Args "/silent /install" -Verb RunAs -Wait; Remove-Item $Path$Installer
该过程完成后,您将在桌面上看到“Google Chrome”图标。单击并 运行 它
几周前,我使用 curl 创建了一个批处理脚本,用于下载我能找到的所有 Chrome 可执行文件,以防万一 Chrome 被更新搞砸了。
在 运行 脚本之后,我没有检查可执行文件是否 运行 正常,因为我假设它们不会有问题。因此,在让脚本堆积 Chrome 版本之后,就在几天前,当我尝试安装旧版本的 Chrome 时,我大吃一惊。 None 脚本下载的文件有效。每次我尝试 运行 它们时,我都会收到“未知安装程序错误”。
这是脚本:
@echo off
set date_and_time=#1_%date:~-10,2%-%date:~3,2%-%date:~-4,4%_%time:~0,2%.%time:~3,2%.%time:~6,2%.#2
md "%USERPROFILE%\Chrome_old_versions\"
set dirct="%USERPROFILE%\Chrome_old_versions\Chrome_%date:~-10,2%-%date:~3,2%-%date:~-4,4%_%time:~0,2%.%time:~3,2%.%time:~6,2%"
md "%dirct%"
cd "%dirct%"
curl --output-dir %dirct% https://dl.google.com/chrome/install/{ChromeStandaloneSetup64}.{exe} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/install/beta/{ChromeBetaStandaloneSetup64}.{exe} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/install/dev/{ChromeDevStandaloneSetup64}.{exe} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/install/{ChromeStandaloneSetup}.{exe} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/install/beta/{ChromeBetaStandaloneSetup}.{exe} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/install/dev/{ChromeDevStandaloneSetup}.{exe} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/mac/beta/{googlechromebeta}.{dmg} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/release2/q/canary/{googlechrome}.{dmg} -o %date_and_time%
curl --output-dir %dirct% https://dl.google.com/chrome/mac/dev/{googlechromedev}.{dmg} -o %date_and_time%
这让我很好奇为什么它不起作用,所以我在 Chrome 中访问了 https://dl.google.com/chrome/install/ChromeStandaloneSetup64.exe,这让我得到了一个完美运行的 exe。奇怪的是,通过 Chrome 下载的两个 exe 和 curl 都具有相同的 sha 512 哈希值。 当我感到困惑时,我尝试了 wget 和 powershell 脚本。
对于wget,我试过:
wget https://dl.google.com/chrome/install/ChromeStandaloneSetup64.exe --no-check-certificate
,这让我再次遇到“未知安装程序错误”。
感谢@John Seerden,然后我使用了他的 powershell script,它下载了一个 googlechromestandaloneenterprise64.msi 可运行的可执行文件。 看到这里,我将他脚本中的googlechromestandaloneenterprise64.msi URL换成https://dl.google.com/chrome/install/ChromeStandaloneSetup64.exe,还是报错
$uri = "https://dl.google.com/chrome/install/googlechromestandaloneenterprise64.msi"
if (-not $PSScriptRoot) {
$PSScriptRoot = Split-Path -Parent -Path $script:MyInvocation.MyCommand.Definition
}
$outFile = "$PSScriptRoot\googlechromestandaloneenterprise64.msi"
Start-BitsTransfer -Source $uri -Destination $outFile
Start-Process -FilePath $outFile -Args "/qn" -Wait
我什至尝试使用 wget 和 curl 下载 https://dl.google.com/chrome/install/googlechromestandaloneenterprise64.msi,但仍然出现错误。
谷歌搜索后,我找到了 this post,它说明了有关获取未标记安装程序的内容,我认为它是通过 curl 或 wget 等第 3 方程序下载的,结束了在提示“未知安装程序错误”时。
经过更多谷歌搜索后,我找到了
有没有什么方法可以通过脚本下载完全正常的 运行 Chrome 可执行文件,或者有什么方法可以修复损坏的可执行文件? 我宁愿不求助于无头的东西 Chrome.
我使用 WinMerge 比较了这两个独立的 Chrome exe,版本分别为 86.0.4240.111 - 64 位和 87.0.4280.66 - 64 位 ChromeStandaloneSetup64_28-10-2020_14.24.03_valid_Copy_old_version.exe (从 https://dl.google.com/chrome/install/ChromeStandaloneSetup64.exe - broken exe aka missing the download URL tags within the exe) and ChromeStandaloneSetup64_valid_Copy_latest_version.exe (downloaded from https://www.google.com/chrome/?standalone=1&platform=win64 下载 - 有效的 exe aka exe,其中包含下载 URL 标签。
作为比较,这里有一个带标签的下载 URL:
这是一个未标记的下载 URL:
https://dl.google.com/chrome/install/ChromeStandaloneSetup64.exe
在 WinMerge 中,我在 ChromeStandaloneSetup64_valid_Copy_latest_version.exe(右侧的文件)中搜索“&lang=ro&browser”,然后我转到编辑 > Select 线差 (F4),然后合并 > 复制到左侧。接下来,我转到文件 > 另存为 > 将左侧另存为...
然后我在新的 Windows 7 虚拟机 (VM) 中 运行 生成的 exe(已修补的 exe,版本为 86.0.4240.111 64 位),这次它安装正确。出于测试目的,我关闭了网络,当转到 Chrome > 帮助 > 关于 Chrome 中的 3 点菜单时,确实,Chrome 是旧版本。之后,我打开网络,它一直更新到最新版本,87.0.4280.66 64位,运行没问题。
尽管 ChromeStandaloneSetup64_valid_Copy_latest_version.exe(有效的 exe)带有区域标识符备用数据流(ADS),但与损坏的 exe 不同,生成的 exe 是损坏的 exe,缺少 ADS,运行 在虚拟机中完全没问题。关于 ADS,我下载了相同的有效 Chrome exe 两次(87.0.4280.66 64 位),我注意到 ADS 具有相同的确切值。
我还做了额外的测试,我注意到如果生成的 exe 缺少 appguid 和 iid 字段,它将无法安装。
我做的另一件事是弄乱各个字段中的值,所以我将 appguid 和 iid 字段设置为如下所示:
appguid={00000000-0000-0000-0000-000000000000}&iid={00000000-0000-0000-0000-000000000000}
,导致可执行文件无法安装,得到错误代码:0x80070057。
当我处理完 exe 编辑后,我开始处理 URL。
至于这个给定的URL,来自https://www.google.com/chrome/?standalone=1&platform=win64 (有效的 exe):
我精简了 appguid 和 iid,得到:
,导致exe文件损坏,得到与上述相同的错误代码,错误代码:0x80070057。
接下来我要做的是 https://codebeautify.org/generate-random-data-from-regexp 并使用此模式生成 运行dom appguid 和 iid(使用十六进制值,因为我注意到它在那些字段中被使用) :
[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[ 0-9A-F]{12}
,然后使用两个不同的数字:
038C42B4-AF87-AD38-990A-4384A7E29E04 - 对于 appguid
EC7C4A9D-76CB-FBA7-D1C2-70EB689DA8F4 - 对于 iid
,我得到了这个 link:
,在安装过程中出现“无法连接到 Internet。如果您使用防火墙,请将 GoogleUpdate.exe 列入白名单”的错误。
所以,由于 appguid 和 iid 来自 Chrome 的更高版本(appguid 和 iid 从 87.0.4280.66 中获取并插入到 86.0.4240.111),我假设,只有在以下情况下安装才会成功完成包含在 exe 本身中的 appguid 和 iid,通过安装期间的计算,将产生与存储在 exe 中某处的值相匹配的结果,或者在安装期间也得到计算的值。我之所以这样说,是因为当我安装来自损坏的 exe 的生成的有效独立 Chrome exe 时,网络已关闭,并且该系统上没有预先安装 Chrome。或者这两个值可能以某种方式与操作系统相关联。
我的结论是,我想我最终会用那些 appguid 和 iid 修改批处理文件中的 URLs,除非我决定仔细查看 URLs Chrome 即将发布的版本,以便更好地了解所有这些是如何工作的。
这些:
8A69D345-D564-463C-AFF1-A69D9E530F96 - 适用于 appguid
04A7785F-B8A2-B4AA-7A45-17861EB0DE70 - 用于 iid
$Path = $env:TEMP; $Installer = "chrome_installer.exe"; Invoke-WebRequest "http://dl.google.com/chrome/install/375.126/chrome_installer.exe" -OutFile $Path$Installer; Start-Process -FilePath $Path$Installer -Args "/silent /install" -Verb RunAs -Wait; Remove-Item $Path$Installer
该过程完成后,您将在桌面上看到“Google Chrome”图标。单击并 运行 它