用于软件清单的 PowerShell

2023-12-13

我想知道如何获得包含已安装软件和电脑名称的两列:

$Path = "C:\Gabriel"
$LogPath = "C:\Gabriel"
Select Name,Directory,@{Name="Outlook";Expression={(Get-WmiObject -Class Win32_Product | where vendor -eq Outlook)}},
                      @{Name='Desktop';Expression={(Get-wmiobject win32_computersystem)}} | Export-Csv C:\Gabriel\Outlook.csv -NoTypeInformation

First, Win32_产品是癌症。尽管名称暗示它是只读操作它将针对任何未通过完整性检查的软件默默地执行修复安装。避免使用它,因为:

  1. 这可能会在受控环境中引入意外和计划外的变化;and

  2. 只读操作导致状态改变是不可接受的;and

  3. 即使不会因重新安装而导致中断,完整性检查也可能会占用 CPU 和磁盘资源,重新安装软件也会占用大量资源,从而导致与系统上运行的其他应用程序发生资源争用。

微软此前曾表示这是一个“无法解决”的问题。由于这就是该类长期以来的行为方式,“修复”它可能会破坏今天依赖错误行为的人们。


通过重新利用上面链接答案中的一些代码,我们可以检查注册表中的软件清单,获取当前计算机名称,并返回[hashtable]以计算机名称作为键,其值是系统上已安装软件的数组:

# We need to check for both 64-bit and 32-bit software
$regPaths = "HKLM:\SOFTWARE\Wow6432node\Microsoft\Windows\CurrentVersion\Uninstall",
  "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"

# Get the name of all installed software registered in the registry
$softwareInventory = @{
 $env:ComputerName = $regPaths | Foreach-Object {
    ( Get-ItemProperty "${_}\*" DisplayName -EA SilentlyContinue ).DisplayName
  }
}

Note:这不会捕获未使用 Microsoft Installer 安装的软件,但大多数软件是通过 MSI 安装的(通常.exe安装人员只需环绕即可.msi安装人员)。

$softwareInventory现在是一个以计算机名称作为键的哈希表。因此,一旦从服务器/计算机收集到此信息,您就可以引用名为的计算机的软件清单PlanetExpressServer01像这样:

$softwareInventory['PlanetExpressServer01']

# OR (must still wrap property name in quotes for specially parsed characters
# such as the hyphen (-)

$softwareInventory.PlanetExpressServer01
$softwareInventory.'PlanetExpressServer-02'

如果您希望计算机名称成为其自己的属性,而不是计算机的密钥hashtable,我们可以在创建时再进行一次调整$softwareInventory:

$softwareInventory = [PSCustomObject]@{
  ComputerName = $env:ComputerName
  Software = $regPaths | Foreach-Object {
    ( Get-ItemProperty "${_}\*" DisplayName -EA SilentlyContinue ).DisplayName
  }
}

只需创建一个新的hashtable称为键ComputerName,分配$env:ComputerName对此,将软件清单放在一个名为的新密钥下Software,并将哈希表转换为PSCustomObject所以它的操作更像是一个传统的对象而不是一个数组。现在每个“行”都会有一个ComputerName“列”和Software“柱子”。


附加信息

有关原因的更多信息 *Win32_产品不好,下面的文章值得一读,并提供了其他技术来避免使用它:

请停止使用 Win32_Product 查找已安装的软件

感谢@FoxDeploy 提供了现已删除的问题的链接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于软件清单的 PowerShell 的相关文章

随机推荐

  • 无法使用 :“Bean 无法解析为类型”

    我只是在玩JSP 我只是想测试一些
  • 命名空间“PartyInvites”中不存在类型或命名空间名称“Models”

    使用VS2013 Pro TFS 2013 Express 我目前正在制作 asp net mvc 5 一书中的教程 一切都很好 昨天 我将 TFS 2013 Express 安装到本地计算机上 将项目复制到 TFS 文件夹并将项目添加到源
  • css content 属性在设置为“”时强制清除?

    这是一个奇怪的 CSS 问题 我希望有人能解释一下 我正在使用 Twitter Bootstrap 并且看到一些非常奇怪的浮动 清除行为 我在主要内容中有一个右浮动 div 和一个水平表单 第二个表单字段似乎无缘无故地在浮动 div 下方清
  • 递归安全设置

    我想将文件夹的安全设置应用于 C 中的所有后代 本质上 我想做与 文件夹 的高级安全设置 中的 用此对象的可继承权限替换所有后代的所有现有可继承权限 相同的操作 有什么优雅的方法来解决这个问题吗 在与 google 和 MSDN 进行了一些
  • 更改路线时 AngularJS 页面会重新加载

    我有一些像这样的html 我什至懒得发布JS 因为它太复杂了 div class container h3 class text center Administration h3 div div class form inline text
  • 如何使用蒙版为圆形图像添加边框

    这是我的尝试 func round let width bounds width lt bounds height bounds width bounds height let mask CAShapeLayer mask path UIB
  • 将现有的 Android 应用程序映射密钥转移到另一个开发者帐户?

    我正在为我的公司开发一个 Android 应用程序 在此应用程序中 地图键 GCM 和 GOOGLE 是在我自己的开发者控制台帐户下创建的 现在该应用程序已在商店中发布 现在他们想将应用程序转移到公司自己的开发者控制台帐户 用户是否仍会像以
  • ImageMagick 未被授权将 PDF 转换为图像

    我有一个程序 需要使用 Image Magick 将 PDF 转换为图像 我这样做是使用subprocess包裹 cmd magick convert density 300 pdfFile str rangeTuple 0 str ran
  • Scrapy - 蜘蛛抓取重复的网址

    我正在抓取搜索结果页面并从同一页面抓取标题和链接信息 作为一个搜索页面 我也有到下一页的链接 我已在 SgmlLinkExtractor 中指定允许这些链接 问题的描述是 在第1页中 我找到了Page2和Page3的链接进行爬行 并且效果很
  • Parsley 远程和附加参数

    我正在尝试将远程验证器与欧芹一起使用 但我似乎无法通过请求发送附加数据 有问题的字段是电子邮件字段 我想将其发送到服务器以查看电子邮件地址是否 可用 另外 我需要发送服务器所需的 id 参数 id 参数嵌入在我的表单中的 主机 字段中 因此
  • Mongoose 调试写入 STDERR?

    有谁知道 有关于为什么 mongoose 将其调试日志写入 stderr 的信息 无论如何可以将其写入标准输出吗 调试选项接受函数而不是布尔值 mongoose set debug function collection method pa
  • 使用 AVX2 指令选择性地异或列表的元素

    我想用 AVX2 指令加速以下操作 但我找不到方法 我得到了一个大数组uint64 t data 100000 uint64 t 和一个数组unsigned char indices 100000 字节数 我想输出一个数组uint64 t
  • grep 使用具有多种模式的字符向量

    我正在尝试使用grep测试字符串向量是否存在于另一个向量中 并输出存在的值 匹配模式 我有一个像这样的数据框 FirstName Letter Alex A1 Alex A6 Alex A7 Bob A1 Chris A9 Chris A6
  • ClassLoaders.callStaticFunction Java Eclipse 的 InvokingTargetException

    我创建了一个使用 ReverseXSL API 将文本转换为 xml 的程序 该程序将由应用程序通过调用静态方法 静态 int 变换XSL 我能够通过从 Eclipse 运行来执行并生成输出 但是 当我使用应用程序运行程序 jar 时 它卡
  • 当parentID和childID在同一个表上时如何删除级联?

    我有一个名为members的mysql表 它基本上有两列 parentID and childID 这样我就可以根据这两列创建一个层次树 例如 parentID ChildID 1 2 2 3 3 4 将在我的应用程序中生成一棵树paren
  • 无法使用 NdefFormatable 格式化 NFC 卡

    我正在使用 NdefFormatable 类来格式化我的 NFC 卡 代码如下 NdefFormatable formatable NdefFormatable get tag 但我得到的可格式化引用为空 我检查了 get tag 方法内运
  • 图像未加载到画布上

    我的问题是 我在将本地托管的图像加载到画布上时遇到问题 我尝试过使用 XAMPP 在本地将代码托管在 Web 服务器上 但 LightBlue jpg 图像似乎永远无法加载 但是 当我使用网站上的外部图像时 代码可以完美运行 我在下面提供了
  • 将 Android 屏幕方向锁定为横向

    我正在开发一个 Android 应用程序 其一个功能是将屏幕方向锁定为横向 我想将此方向更改应用于手机中的所有 Android 应用程序 我正在使用这个代码 private void lockScreenOrientation if mSc
  • 在 Inno Setup 中创建使用命令行参数执行程序的快捷方式

    我有一个问题 我正在为一个程序做一个自定义安装程序 原始安装程序在桌面上创建一个快捷方式 快捷方式的目标如下 C Program Files Soft name soft exe soft run 在 Inno Setup 脚本中我使用以下
  • 用于软件清单的 PowerShell

    我想知道如何获得包含已安装软件和电脑名称的两列 Path C Gabriel LogPath C Gabriel Select Name Directory Name Outlook Expression Get WmiObject Cla