debug - 安装.msi时,为所有用户安装程序

文章目录

    • debug - 安装.msi时,为所有用户安装程序
    • 概述
    • 笔记
      • 试试在目标.msi后面直接加参数的测试
    • 备注
    • 备注
    • END

debug - 安装.msi时,为所有用户安装程序

概述

为了测试,装了一个test.msi.
安装时,只有安装路径的选择,没有是否为所有用户安装的选项。
本地有2个用户,一个是正式的win10微软账号usr_a,一个是本地开发账号usr_b。
usr_a的权限最高,是本机的第一个管理员账号。usr_b的权限稍微低一些,也是管理员。

如果直接安装test.msi, usr_a可以正常用安装好的test程序。
但是切到usr_b后,无法使用usr_a安装好的test程序。

尝试查看test.msi的命令行帮助,看到有选项可以为所有用户安装。
不过必须在cmd下安装(或者写在.bat中),才能输入命令行参数。

安装.msi时,加了"为所有用户"安装的选项。安装完成后,切到usr_b, 确实可以用test程序了。

笔记

go1.24.1.windows-amd64.msi --help

在这里插入图片描述

Windows ® Installer. V 5.0.19041.4651msiexec /Option <Required Parameter> [Optional Parameter]安装选项</package | /i> <Product.msi>安装或配置产品/a <Product.msi>管理安装 - 在网络上安装产品/j<u|m> <Product.msi> [/t <Transform List>] [/g <Language ID>]公布产品 - m 公布到所有用户,u 公布到当前用户</uninstall | /x> <Product.msi | ProductCode>卸载产品
显示选项/quiet安静模式,无用户交互/passive无人参与模式 - 只显示进度栏/q[n|b|r|f]设置用户界面级别n - 无用户界面b - 基本界面r - 精简界面f - 完整界面(默认值)/help帮助信息
重新启动选项/norestart安装完成后不重新启动/promptrestart必要时提示用户重新启动/forcerestart安装后始终重新启动计算机
日志选项/l[i|w|e|a|r|u|c|m|o|p|v|x|+|!|*] <LogFile>i - 状态消息w - 非致命警告e - 所有错误消息a - 操作的启动r - 操作特定记录u - 用户请求c - 初始用户界面参数m - 内存不足或致命退出信息o - 磁盘空间不足消息p - 终端属性v - 详细输出x - 额外调试信息+ - 扩展到现有日志文件! - 每一行刷新到日志* - 记录所有信息,除了 v 和 x 选项/log <LogFile>与 /l* <LogFile> 相同
更新选项/update <Update1.msp>[;Update2.msp]应用更新/uninstall <PatchCodeGuid>[;Update2.msp] /package <Product.msi | ProductCode>删除产品的更新
修复选项/f[p|e|c|m|s|o|d|a|u|v] <Product.msi | ProductCode>修复产品p - 仅当文件丢失时o - 如果文件丢失或安装了更旧的版本(默认值)e - 如果文件丢失或安装了相同或更旧的版本d - 如果文件丢失或安装了不同版本c - 如果文件丢失或较验和与计算的值不匹配a - 强制重新安装所有文件u - 所有必要的用户特定注册表项(默认值)m - 所有必要的计算机特定注册表项(默认值)s - 所有现有的快捷键方式(默认值)v - 从源运行并重新缓存本地安装包
设置公共属性[PROPERTY=PropertyValue]请查阅 Windows (R) Installer SDK 获得有关
命令行语法的其他文档。版权所有 (C) Microsoft Corporation. 保留所有权利。
此软件的部分内容系基于 Independent JPEG Group 的工作。

看不大清楚,好像是msiexec + /jm参数为为所有用户安装。
不过我开始理解错了,没有用msiexec带命令行安装go1.24.1.windows-amd64.msi ,输入成了go1.24.1.windows-amd64.msi /m
不过安装完,所有用户中都可以正常使用安装完的go命令行。

因为我用的/m参数并不是msiexec的标准参数,但是又有效果,我就想看一下,给msiexec加/m参数会咋样?

msiexec /i "go1.24.1.windows-amd64.msi"  /m /log "my_log_2025_0321_1650.txt"

不报错。不知道msiexec是否将/m参数丢弃了。
看日志

Property(S): dirD847BCAADF455EBFA9F73B7D803AC0EF = C:\Program Files\Go\test\wasmmemsize.dir\
Property(S): WixUIRMOption = UseRM
Property(S): WIXUI_INSTALLDIR = INSTALLDIR
Property(S): ALLUSERS = 1 // !!!
Property(S): ARPNOMODIFY = 1
Property(S): ARPINSTALLLOCATION = C:\Program Files\Go\
Property(S): ProgramFiles64Folder = C:\Program Files\
Property(S): TARGETDIR = E:\
Property(S): ProgramMenuFolder = C:\ProgramData\Microsoft\Windows\Start Menu\Programs\
Property(S): EnvironmentEntries = E:\
Property(S): SourceDir = D:\tools\go\

可以看到 ALLUSERS 的值为1,说明 /m可能是将ALLUSERS置为1了。

查看msiexec用的是哪一个?

D:\tools\go>where msiexec
C:\Windows\System32\msiexec.exe

我现在用的是第2个用户(me),用IDA64看一下, 是否msiexec.exe真有/m参数。
在这里插入图片描述
在这里插入图片描述
看到处理 /m 这个参数了,并没有报错,还是继续处理后面的参数。
初步看起来,确实处理这个参数了。
不过汇编看起来不好看啊。

要不用反证法,给一个不存在的参数,看是否报错就行了。
如果能实验出能报错的无效参数,那么就可以反证 /m参数是有效的。

在这里插入图片描述
/m改为/d, 这是一个不在命令行参数说明中的参数,此时,会弹出msiexec的参数说明界面。这说明/d参数是无效的。
程序处理参数的方式一般是一致的,既然/m从单步调试看,是被正常处理的;且不会弹出帮助界面。那么说明/m是有效的参数。

试试在目标.msi后面直接加参数的测试

go1.24.1.windows-amd64.msi /d

在这里插入图片描述
这说明直接在目标msi后面加上参数的效果和在 msiexec后面加的参数是一致的,也说明 /d这种无效参数,是会弹出msi帮助界面的。
看看目标msi加上/m参数的效果。
在这里插入图片描述
目标msi加/m参数,是可以正常运行msi的。
这说明,/m参数虽然没有在msi的标准命令行参数说明中,但是也是一个隐藏正常可用的参数。且根据前面实验的结果(日志中 Property(S): ALLUSERS = 1 // !!!),/m参数的作用,就是为所有用户安装程序。

备注

误打误撞实验出来的参数 /m可以为所有用户安装msi程序。

如果要按照msiexec的标准参数来为所有用户安装,请使用标准的参数
但是我用 /jm参数会弹出帮助界面啊,并不会安装。
莫非我看错了?
在这里插入图片描述

是不是msiexec的命令行参数写错了?
那么用 -m参数试试,带上日志,看看是否为所有用户安装

go1.24.1.windows-amd64.msi -m /log my_log_go1.24.1.windows-amd64.txt

正常安装完。
在这里插入图片描述
查看my_log_go1.24.1.windows-amd64.txt,看看是否有为所有用户安装的选项。

// 写了3个环境变量
WriteEnvironmentStrings: Name: PATH, Value: C:\Program Files\Go\bin, Action 1610612737
WriteEnvironmentStrings: Name: GOPATH, Value: %USERPROFILE%\go, Action 2
WriteEnvironmentStrings: Name: PATH, Value: %USERPROFILE%\go\bin, Action 1073741825
// ...
Property(S): WixUIRMOption = UseRM
Property(S): WIXUI_INSTALLDIR = INSTALLDIR
Property(S): ALLUSERS = 1 // !!! 确实是为所有用户安装了程序
Property(S): ARPNOMODIFY = 1
Property(S): ARPINSTALLLOCATION = C:\Program Files\Go\
Property(S): ProgramFiles64Folder = C:\Program Files\
Property(S): TARGETDIR = E:\
Property(S): ProgramMenuFolder = C:\ProgramData\Microsoft\Windows\Start Menu\Programs\
Property(S): EnvironmentEntries = E:\
Property(S): SourceDir = D:\tools\go\
// ...
Property(S): LogonUser = me // !!! 我是在第2个用户上装的msi
// ...
Property(S): AdminUser = 1 // !!! 第2个用户也是管理员身份

备注

可能是msiexec的命令行帮助写错了。
也有可能是我理解错了。
反正要安装a.msi, 只要加上参数/m或者-m 就可以为所有用户安装a.msi程序。

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/39675.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Skyeye 云智能制造办公系统 VUE 版本 v3.15.14 发布

Skyeye 云智能制造&#xff0c;采用 Springboot winUI 的低代码平台、移动端采用 UNI-APP。包含 30 多个应用模块、50 多种电子流程&#xff0c;CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公告、问卷、报表…

深度学习PyTorch之动态计算图可视化 - 使用 torchviz 生成计算图

序号系列文章1深度学习训练中GPU内存管理2深度学习PyTorch之数据加载DataLoader3深度学习 PyTorch 中 18 种数据增强策略与实现4深度学习pytorch之简单方法自定义9类卷积即插即用5深度学习PyTorch之13种模型精度评估公式及调用方法6深度学习pytorch之4种归一化方法&#xff08;…

ZW3D二次开发_非模板表单_输入框类控件_逐字符回调

ZW3D的非模板表单的控件中有一些输入框类的控件&#xff0c;比如“ZsCc::LineEditBtn”,"ZsCc::LineEditEx"等&#xff0c;按照“ZW3D二次开发_非模板表单_控件_添加回调-CSDN博客”介绍的方法添加函数命令时&#xff0c;发现输入框在用户输入字符时不能动态地触发回…

Mysql--日志(错误日志、二进制日志、查询日志、慢查询日志)

四种日志对比总结 日志类型作用记录内容特点常见用途错误日志记录 MySQL 运行过程中的错误、警告及启动、关闭信息MySQL 系统错误、故障信息、警告等较少占用磁盘空间故障排查、系统监控二进制日志记录所有更改数据库数据的操作及事务执行情况DML、DDL 操作&#xff0c;不记录…

AI对软件工程(software engineering)的影响在哪些方面?

AI对软件工程&#xff08;software engineering&#xff09;的影响是全方位且深远的&#xff0c;它不仅改变了传统开发流程&#xff0c;还重新定义了工程师的角色和软件系统的构建方式。以下是AI影响软件工程的核心维度&#xff1a; 一、开发流程的智能化重构 需求工程革命 • …

ElementPlus 快速入门

目录 前言 为什么要学习 ElementPlus&#xff1f; 正文 步骤 1 创建 一个工程化的vue 项目 ​2 安装 element-Plus :Form 表单 | Element Plus 1 点击 当前界面的指南 2 点击左边菜单栏上的安装&#xff0c;选择包管理器 3 运行该命令 demo(案例1 &#xff09; 步骤 …

stable diffusion本地安装

1. 基本环境准备 安装conda 环境 pytorch基础学习-CSDN博客 创建虚拟环境&#xff1a; conda create -n sd python3.10 一定要指定用3.10&#xff0c;过高的版本会提示错误&#xff1a; 激活启用环境&#xff1a; conda activate sd 设置pip国内镜像源&#xff1a; pip conf…

使用 Go 构建 MCP Server

一个互联网技术玩家&#xff0c;一个爱聊技术的家伙。在工作和学习中不断思考&#xff0c;把这些思考总结出来&#xff0c;并分享&#xff0c;和大家一起交流进步。 一、MCP 介绍 1. 基本介绍 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;是…

Python----计算机视觉处理(Opencv:模板匹配)

一、 概念 模板匹配就是用模板图&#xff08;通常是一个小图&#xff09;在目标图像&#xff08;通常是一个比模板图大的图片&#xff09;中不断的滑动 比较&#xff0c;通过某种比较方法来判断是否匹配成功。 二、应用场景 1. 目标检测与识别&#xff1a;在计算机视觉领域&am…

【stm32】用从模式控制器 完成PWM的测量

&#x1f31e;学习视频还是来自于 铁头山羊 &#x1f33f;主要是回顾一下他讲的这一章的定时器的部分&#xff0c;具体的话 还是看一下具体铁头山羊的视频&#xff0c;讲的很清楚~~ 整体流程是这样的&#xff0c;首先通过定时器的输出比较功能&#xff0c;配置好PA6产生一个特定…

【C#】CS学习之Modbus通讯

摘要 本文详细描述了如何在在C#的Winform应用程序中使用NModbus库实现Modbus通讯&#xff0c;包括读取保持寄存器、以及相应的UI界面设计和事件处理。 前言 ​应用场景 Modbus 从站广泛应用于工业自动化领域&#xff1a; 1、传感器数据采集&#xff08;如温度、压力等&#xf…

Pycharm社区版创建Flask项目详解

一、创建工程项目 二、配置工程目录 新建的空项目下创建目录。 1、新建app.py文件 2、app.py代码如下&#xff1a; from flask import Flask, render_templateapp Flask(__name__)app.route("/") def root():"""主页:return: Index.html"&qu…

Linux 基础入门操作 第十二章 TINY Web 服务器

1 服务器基础架构 1.1 背景知识 Web 服务器使用 HTTP 协议与客户端&#xff08;即浏览器&#xff09;通信&#xff0c;而 HTTP 协议又基于 TCP/IP 协议。因此我们要做的工作就是利用 Linux 系统提供的 TCP 通信接口来实现 HTTP 协议。 而 Linux 为我们提供了哪些网络编程接口…

RAG优化:python从零实现[吃一堑长一智]循环反馈Feedback

本文将介绍一种有反馈循环机制的RAG系统,让当AI学会"吃一堑长一智",给传统RAG装了个"后悔"系统,让AI能记住哪些回答被用户点赞/拍砖,从此告别金鱼记忆: 每次回答都像在玩roguelike:失败结局会强化下次冒险悄悄把优质问答变成新知识卡牌,实现"以…

基于SpringBoot的名著阅读网站

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

[AI建模] 使用Pinokio本地化部署混元2D到3D AI建模服务

近年来,AI驱动的2D转3D建模技术发展迅猛,而Pinokio作为一个强大的AI模型管理与部署平台,使得在本地部署这些复杂的AI模型变得更加简单高效。本文将介绍如何使用Pinokio在本地部署混元2D到3D AI建模服务,并快速生成带或不带Texture的3D模型。 1. 在Pinokio Discover页面找到…

Qt 导入TagLib库

文章目录 0. 前言和环境介绍1. 下载TagLib2. 下载zlib3. 修改.pro文件4. 测试代码 0. 前言和环境介绍 最近在使用Qt写一个播放器&#xff0c;需要解析mp3文件&#xff0c;于是研究了一下如何导入TagLib库 Qt构建套件:Desktop Qt6.8.2 MinGW64-bit Qt Creator安装目录: D:\bit…

【前端面试题】计算机网络相关

总结面试前端过程可能会问到的计算机网络相关知识点 1.HTTP和HTTPS的区别 &#xff08;1&#xff09;HTTPS HTTP 安全加密 HTTPS 是 HTTP 的 加密版&#xff0c;通过 SSL/TLS 保障数据安全&#xff0c;防止窃听和篡改。 &#xff08;2&#xff09;HTTPS 如何保护数据&…

【RabbitMQ高级特性】消息确认机制、持久化、发送方确认、TTL和死信队列

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【中间件】企业级中间件剖析 一、消息确认机制 消费者确认机制确保消息被正确处理后才从队列中删除。如果消费者处理失败&#xff08;如业务异常或宕机&#xff09;&#xff0c;Broker 会重新投递消息…

调用百度api实现语音识别(python)

该代码实现了一个企业级的语音识别解决方案,通过调用百度语音识别API,实现实时录音识别和对已有音频语音识别功能。 百度智能云:请自行访问百度智能云,开通免费的语音识别功能,获取API_KEY和SECRET_KEY。操作按照百度流程即可,可免费申请。 首先,配置下百度API和描述下错…