猿问
下载APP

如何找到已安装的MSI安装程序的产品GUID?

我要找到产品GUID为了已安装的MSI文件为了执行诸如修补、卸载等维护,也是为了审核目的。


如何找到已安装的MSI安装程序的产品GUID?

侃侃无极
浏览 151回答 3
3回答

慕函数4003404

短版下面的信息随着时间的推移有了很大的增长,可能变得有点过于复杂了。如何快速获取产品代码?(四种办法):1. Use the Powershell "one-liner"向下滚动屏幕截图,并一步地滚动。..免责声明也低于-轻微或中度风险取决于你问谁。对我来说没问题。任何自修复由此选项触发通常应该可以取消。这个包完整性检查虽然触发确实添加了一些事件日志“噪音”。注! IdentifyingNumber 是这个ProductCode(WMI特性)。get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSizePowershell的快速启动*等待Windows键踢踏舞R,键入“powershell”并按进入2. Use VBScript下文“替代工具“(第3节)..这个选项可能是更安全基于下面详细解释的原因。从本质上讲,这是(很多)。更快并且不能够触发msi自修复,因为它不通过wmi(它访问MSI COM API直接-以起泡的速度)。然而,它比powershell选项更复杂。(几行代码)。3. Registry Lookup有些人通过在登记处查东西发誓。不是我推荐的方法-我喜欢通过正确的API(或者换句话说:OS函数调用)。只有API-实现的内部元素才会出现奇怪的异常:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\UninstallHKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\UninstallHKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall4. Original MSI File / WiX Source你可以找到Product Code在Property table任何MSI文件(以及任何其他属性)。但是,在安装时应用的转换可以(很少)覆盖GUID,因此不匹配在该产品下注册的GUID(上面的方法1和2将报告在如此罕见的情况下在Windows中注册的实际产品代码)。您需要一个工具来查看msi文件。..可以下载的免费工具列表(或见下面的快速选项),请参见以下答案的底部:如何比较两个(或更多)MSI文件的内容?更新*为了方便和需要速度-)下载超Orca毫不迟延,毫不大惊小怪地从这个直接下载的热链接-该工具足够好完成工作-安装,打开MSI,然后直接进入属性表找到ProductCode行(请始终检查病毒的直接下载热链接-显然-你可以用Virustotal.com为此,在线扫描使用数十个反病毒和恶意软件套件来扫描您上传的内容)。虎鲸是微软自己的工具,它安装在VisualStudio而WindowsSDK..试着寻找Orca-x86_en-us.msi-低于Program Files (x86)如果找到,安装MSI。下面你会找到原来的答案,它“有机地增长”成了很多细节。也许看到“卸载MSI软件包“如果这是您需要执行的任务,请参见下面的部分。检索产品代码更新*如果您还需要升级代码,检查这个答案:如何找到已安装的MSI文件的升级代码?(检索表输出中的相关产品代码、升级代码和产品名称-类似于下面的输出)。不能用PowerShell吗?见下文“替代工具”一节。想卸载吗?请参阅下面的“卸载MSI软件包”一节。燃起Powershell (按住Windows键,点击R,释放Windows键,输入“Powershell”并按OK)并运行下面的命令获取已安装的MSI包的列表产品代码连同本地缓存包路径而产品名称(最大化PowerShell窗口以避免截断名称)。在运行此命令行之前,请阅读下面的免责声明(没有任何危险,只是一些潜在的麻烦)。第3节在“替代工具”下展示了使用VBScript获取相同信息的另一种非WMI方式。如果您试图卸载一个包,下面有一个小节,其中包含一些示例msiexec.exe命令行:get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize这个输出量应与此类似:注意!因为一些奇怪的原因“产品代码”被称为“识别号码”在WMI中..换句话说,在上面的图片中,识别码编号是产品代码。如果你需要在许多远程计算机上远程运行此查询。,见“从远程计算机检索产品代码“下面一节。免责声明(重要的是,在运行命令之前请阅读!):由于Microsoft的奇怪设计,任何WMI调用Win32_Product(如下面的PowerShell命令)将触发包装产业的验证..除了相当慢,这在极少数情况下会触发MSI自我修复。这可以是一个小包,也可以是类似VisualStudio之类的大型程序包。在大多数情况下,这种情况不会发生-但也存在风险。不要在重要的会议之前运行这个命令-它从来不危险(它是只读的),但在非常罕见的情况下,它可能会导致长时间的修复。(我认为您也可以取消自修复-除非该包积极阻止,但如果您再次调用Win 32_Product,它将重新启动,并且这将持续到您让自修复完成-有时它可能会继续,即使您让它完成:如何确定导致Windows安装程序重复自我修复的原因?).为了记录在案:一些人报告他们的事件日志填充了MsiInstaller事件ID 1035条目(参见代码负责人的回答)-显然是WMI对Win 32_Product类的查询造成的(我个人从未见过这种情况)。这是不它与上面建议的Powershell命令直接相关,它是WIM类Win 32_Product的一般使用上下文。您还可以获得列表形式的输出(而不是表):get-wmiobject -class Win32_Product在这种情况下,输出与此类似:从远程计算机检索产品代码理论上,您应该能够指定远程计算机名称作为命令本身的一部分。下面的命令与上面设置的在机器“RemoteMachine”上运行的命令相同(-ComputerName RemoteMachine增加一节):get-wmiobject Win32_Product -ComputerName RemoteMachine | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize如果您在适当的域上使用域管理权限运行,这可能会奏效。在工作组环境(小型Office/home网络)中,您可能必须直接将用户凭据添加到WMI调用中,才能使其工作。此外,WMI中的远程连接受到(至少)Windows防火墙, DCOM设置,和用户帐户控制(UAC)(加上任何额外的非microsoft因素,例如真实防火墙, 第三方软件防火墙, 各种安全软件等等)它是否工作取决于您的确切设置。设置远程WMI连接用PowerShell远程连接WMI更新*关于远程WMI运行的广泛部分可以在这个答案中找到:如何找到已安装的MSI文件的升级代码?..它显示防火墙规则和通过注册表调整抑制UAC提示符可以使事情在工作组网络环境中工作。不推荐安全上的改变,但对我有效。替代工具Powershell要求.NET框架要安装(目前在3.5.1版中似乎是吗?)(2017年10月)。实际的PowerShell应用程序本身也可能失踪即使安装了.NET,也可以从计算机中删除。最后,我相信PowerShell可以禁用或锁定通过各种系统策略和特权。如果是这样的话,您可以尝试其他一些方法来检索产品代码。我更喜欢的选择是VBScript-它速度快、灵活(但也可以锁在某些机器上,而且脚本编写总是比使用工具更复杂)。让我们从内置Windows WMI工具: wbemtest.exe.发射wbemtest.exe (按住Windows键,点击R,释放Windows键,输入“wbemtest.exe”并按OK).点击连接然后好的(名称空间默认为root\cimv 2),然后单击“连接“又来了。点击“查询“并键入以下内容WQL命令(SQL风味):SELECT IdentifyingNumber,Name,Version FROM Win32_Product然后单击“Use”(或等效-该工具将被本地化)。示例输出截图(截断)。不是最好的格式,但您可以获得所需的数据。识别码是MSI产品代码:接下来,您可以尝试一个自定义的、功能更完整的WMI工具,例如WMIExplorer.exe这不包括在Windows中。然而,这是一个非常好的工具。建议。在以下地点查看:https:/github.com/vinaypannani/wmie 2/Releases启动工具,单击Connect,双击root\CIMV 2从“查询选项卡“,键入以下查询SELECT IdentifyingNumber,Name,Version FROM Win32_Product然后按执行键。屏幕截图跳过,应用程序需要太多的屏幕房地产。最后,您可以尝试VBScript若要访问信息,请通过MSI自动化接口(Windows的核心特性是与WMI无关).复制下面的脚本并粘贴到桌面上的*.vbs文件中,并尝试通过双击运行它。您的桌面必须是可写的,否则您可以使用任何其他可写位置。这不是一个伟大的VBScript。简练过了错误处理和完整性,但是它应该以最小的复杂度完成这项工作。输出文件是在运行脚本的文件夹中创建的(文件夹必须是可写的)。输出文件被调用msiinfo.csv.双击电子表格应用程序中要打开的文件,在导入时选择逗号作为分隔符-或-只需在记事本或任何文本查看器中打开该文件。在电子表格中打开将允许高级排序功能。这个脚本可以很容易地修改成显示。有关msi安装的大量详细信息..在这里可以找到这方面的演示:如何找出安装了哪些产品?较新的产品已经安装了msi窗口。.' Retrieve all ProductCodes (with ProductName and ProductVersion)Set fso = CreateObject("Scripting.FileSystemObject")Set output = fso. CreateTextFile("msiinfo.csv", True, True)Set installer = CreateObject("WindowsInstaller.Installer")On Error Resume Next '  we ignore all errorsFor Each product In installer.ProductsEx("", "", 7)    productcode = product.ProductCode    name = product.InstallProperty("ProductName")    version=product.InstallProperty("VersionString")    output.writeline (productcode & ", " & name & ", " & version)Nextoutput.Close我想不出任何进一步的通用选择,以检索产品代码,请补充,如果你知道任何。只是编辑内联请不要添加太多的评论。您当然可以通过调用MSI自动化接口(基于COM)或C+MSI安装程序函数(Win 32 API)甚至在应用程序中使用WMI查询,就像您在上面的示例中所做的那样PowerShell, wbemtest.exe或WMIExplorer.exe.卸载MSI软件包如果你想做的是卸载MSI包您找到了产品代码,您可以使用提升命令提示符(搜寻)cmd.exe,右击和以管理员身份运行):备选案文1: 基本的,交互式卸载,不进行日志记录(快速和容易):msiexec.exe /x {00000000-0000-0000-0000-00000000000C}快速参数解释:/X = run uninstall sequence{00000000-0000-0000-0000-00000000000C} = product code for product to uninstall如果愿意,还可以启用(详细)日志记录,并以静默模式运行,从而引导我们进入选项2:备选案文2: 使用详细日志记录无声卸载(更适合批处理文件):msiexec.exe /x {00000000-0000-0000-0000-00000000000C} /QN /L*V "C:\My.log" REBOOT=ReallySuppress快速参数解释:/X = run uninstall sequence{00000000-0000-0000-0000-00000000000C} = product code for product to uninstall/QN = run completely silently/L*V " C:\My.log"= verbose logging at specified path REBOOT=ReallySuppress = avoid unexpected, sudden reboot有一个MSI卸载综合参考这里(卸载MSI软件包的各种不同方法):不使用msiexec从命令行卸载msi文件..卸载有很多不同的方法。如果您正在编写批处理文件,请查看上面的第3节,链接的答案是一些常见的和标准的卸载命令行变体。和快速链接到msiexec.exe(命令行选项)(概述MSDN中msiexec.exe的命令行)。和TechNet版本也是。检索其他MSI属性/信息(f.ex升级代码)更新*请查找关于如何查找已安装软件包的升级代码的新答案而不是手动查找MSI文件中的代码。对于已安装的软件包,这要可靠得多。如果没有安装包,则仍然需要查看MSI文件(或编译MSI的源文件)才能找到升级代码。离开旧的部分如下:如果你想要上一级码或其他MSI属性,您可以从“指定的位置”打开产品的缓存安装msi。LocalPackage“在上面的图像显示中(类似于:C:\WINDOWS\Installer\50c080ae.msi-这是一个十六进制文件名,在每个系统中都是唯一的)。然后你看看“属性表“对于UpgradeCode(可以在转换中重新定义UpgradeCode-确保您获得了从系统中以编程方式检索代码所需的正确值-我将在短期内为此提供一个脚本。在缓存的MSI中找到的高级代码通常是正确的。).若要打开缓存的msi文件,请使用虎鲸或者另一个包装工具。下面讨论不同的工具(其中任何一个都可以):使用什么安装产品?InstallShield,Wix,Wise,AdvancedInstaller等..如果您没有安装这样的工具,您最快的赌注可能是尝试。超级Orca(使用起来很简单,但没有经过我的广泛测试)。更新这里有一个关于各种免费产品的新答案,您可以使用这些信息查看MSI文件:如何比较两个(或更多)MSI文件的内容?如果安装了VisualStudio,尝试寻找Orca-x86_en-us.msi-低于Program Files (x86)-并安装它(这是微软自己的官方MSI查看器和编辑器)。然后在“开始”菜单中找到Orca。抓紧时间:-)从技术上讲,Orca是作为WindowsSDK(不是VisualStudio)的一部分安装的,但是Windows SDK与VisualStudio安装捆绑在一起。如果没有安装VisualStudio也许你认识一个认识的人?只要让他们搜索这个MSI,并发送给你(这是一个很小的半毫巴文件)-应该花他们几秒钟。更新:您需要多个CAB文件以及MSI-这些文件都是在找到MSI的同一个文件夹中找到的。如果没有,您可以随时下载WindowsSDK(它是免费的,但它很大-你安装的所有东西都会减慢你的电脑速度)。我不确定SDK的哪一部分安装了OrcaMSI。如果需要,请在这里编辑并添加详细信息。这里有一篇关于MSI卸载问题的更全面的文章:不使用msiexec从命令行卸载msi文件这里有一篇类似的文章还有几个选择使用注册表或缓存的MSI检索MSI信息:从MSI文件中查找GUID?类似的主题(供参考和方便访问-我应该清理这个列表):如何在Windows 7中找到已安装应用程序的UpgradeCode和ProductCode如何在C#中找到已安装应用程序的升级代码?Wix:如何卸载使用不同安装程序安装的先前安装的应用程序Wix-在多实例安装上进行重大升级如何找出安装了哪些产品?较新的产品已经安装了msi窗口。(使用VBScript)如何在没有.msi文件的情况下使用产品id guid卸载msiexec找到MSI包的GUID

一只甜甜圈

我有一个更高级的VBScript将输出格式化为可排序的、可过滤的/可搜索的HTML格式,但是我还没有完成它的QA,它也主要供我自己使用和测试。它还显示了升级代码和相关产品代码(共享相同的升级代码)。我建议您在电子表格应用程序(如Microsoft Excel)中打开导出的文本文件,并将其作为分隔列表导入,以逗号作为分隔符-然后您可以任意使用它进行格式化。只需将输出文件重命名为msiinfo.csv并双击它,然后将逗号设置为分隔符

若吾皇

您可以通过MSIAPI轻松获得ProductCode,我为此提供了一个VBScript(“替代工具”中的第3节)。也许可以创建一个PowerShell cmdlet来完成这项工作。也许等我有时间再看一看。它可以通过MSIAPI直接通过引擎盖下
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答