Powershell企业应用 - 第05章 编写Powershell日志系统

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Powershell企业应用 - 第05章 编写Powershell日志系统相关的知识,希望对你有一定的参考价值。

参考技术A

我们在进行企业脚本执行的过程中,对于执行的输出,往往需要将其记录下来用作参考或者留存记录作为合规的凭据。

文本日志文件,CSV文件以及Windows日志是我们可以用来留存记录的数据源。

文本日志文件一般是.txt 或者 .log 扩展名的文本文件,我们让脚本在执行的过程中向里写入输出信息。

通过以下命令创建文本日志文件

使用Powershell写入信息到文本日志文件
在脚本中,我们可以使用Add-Content命令向日志文件中输出脚本执行的信息。

CSV日志文件本质也是文本文件,但可以在Excel中打开,更加方便进行筛选和排序。

通过以下命令创建CSV日志文件

向CSV日志文件写入信息

对于CSV文件,我们需要先写入文件每列的表头信息,用逗号进行分隔。
表头信息范例: username, time, action
这样我们就定义了CSV文件的三个表头。
然后写入的日志信息应与表头相对应,也用逗号进行分割。
日志信息范例: Leo Zhang, 20211116 12:00:00 , Reboot Computer
CSV文件可以使用Microsoft Excel打开,对其中的数据可以像操作xls文件一样,进行排序和筛选等操作。

在脚本中,我们仍然使用Add-Content命令向CSV日志文件中输出脚本执行的信息。

使用Powershell写入信息到文本日志文件

我们可以在脚本中,将日志输出写入到Windows日志中,通过Windows事件管理器进行查看,可以进行更加细致颗粒度的查找和过滤。如果结合ManageEngine的EventsLog Analyzer这样的工具,可以收集所有服务器的日志进行统一管理和归档,帮助我们更好的管理日志以及满足合规性的要求。

创建Windows日志
我们可以使用New-Eventlog来创建Windows日志的日志本,专门用来存储来自我们脚本的日志信息。

New-Eventlog命令的参数:
-Logname: Windows日志的名称。
-Source: 日志的来源

Powershell:通过 UpgradeCode 卸载应用程序

【中文标题】Powershell:通过 UpgradeCode 卸载应用程序【英文标题】:Powershell: Uninstall application by UpgradeCode 【发布时间】:2018-08-11 00:07:00 【问题描述】:

当我通过 Powershell 脚本升级/降级我的应用程序时,我想先强制卸载当前安装的版本,然后再运行新的安装程序。

如何通过 Powershell 使用应用程序的 UpgradeCode 来做到这一点?

通过应用程序名称来做会不太健壮。

【问题讨论】:

你能提供你已经尝试过的吗? 您是否有机会(或将会)通过 SCCM 执行此操作? 我认为正确设计的 MSI 包会自动执行此操作。 你很可爱.... 只需调用 msiexec.exe /x UPGRADECODE 【参考方案1】:

既然你提到了升级代码,那一定意味着你在谈论一个 MSI 文件 (Windows Installer)。正如其他人所说,这种卸载通常由正确编写的 MSI 包自动执行 - 它被称为 major upgrade - 这本质上是卸载现有版本的产品,然后安装最新版本.

正在安装的 MSI 的 Upgrade Table 将指定在安装新版本之前将卸载盒子上的现有软件包。理论上,您可以卸载任意数量的现有安装。如果你疯了,你甚至可以卸载竞争产品。坦率地说,令人惊讶的是,我从未尝试在一次重大升级期间卸载多个产品——很少需要这样做。在大多数情况下,您卸载单个现有产品,然后安装最新版本。

    您可以使用 transform 修改升级表以更改主要升级的行为方式 - 换句话说,使其开始或停止卸载特定的预先存在的安装。

    您还可以通过调用此 MSI API 函数(COM - VBScript 用作示例)枚举所有共享相同升级代码的相关产品:

Set installer = CreateObject("WindowsInstaller.Installer")

' Enumerate all products related to "Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.4148"

' AA783A14-A7A3-3D33-95F0-9A351D530011 is the upgrade code
Set upgrades = installer.RelatedProducts("AA783A14-A7A3-3D33-95F0-9A351D530011")

For Each u In upgrades
   MsgBox u, vbOKOnly, "Product Code: "
Next

然后,您可以通过将产品代码传递给 msiexec.exe 命令行来卸载产品(请参阅下文,了解如何通过 MSI API COM 自动化执行此操作):

msiexec.exe /x 11111111-1111-1111-1111-11111111111X /L*V "C:\msilog.log" REBOOT=ReallySuppress

快速参数解释(因为我推荐这个选项):

 /X = run uninstall sequence
 /QN = run completely silently
 /L*V "C:\msilog.log"= verbose logging at path specified
 11111111-1111-1111-1111-11111111111X = product guid of app to uninstall
 REBOOT=ReallySuppress = prevent reboot without warning (badly authored MSI packages)

如果您不想通过msiexec.exe 卸载,那么您可以在此处找到多种调用 MSI 卸载的方法: Uninstalling an MSI file from the command line without using msiexec

您可以通过几种不同的方式找到已安装 MSI 的产品代码:How can I find the product GUID of an installed MSI setup?


更新:我想我忘了很明显,您可以通过 MSI API 自动化直接卸载。在下面的脚本中,我们让所有产品共享相同的升级代码,然后依次卸载它们。

请注意,当静默运行时,您应该使用管理员权限运行,因为 UAC 可能会被禁止,然后卸载通常会失败(权限被拒绝)。因此,以下脚本以交互方式运行卸载 - 允许 UAC 提示和提升。

如果不是很明显:运行此脚本将卸载 Orca! 我使用此产品作为示例,因为它可以快速再次安装(hints on finding the installer quick if you need to towards bottom here - 搜索“orca”) :

重大免责声明

COM 方法installer.ConfigureProduct 不接受任何允许我们传入REBOOT=ReallySuppress 的参数。这意味着一个(非常)编写不当的程序包会触发 ScheduleReboot 操作(或使用一些更晦涩的魔法来导致重新启动) - 如果您以管理员权限和静默模式运行以下脚本,则可能会在没有警告的情况下重新启动系统

有一个较新的调用ConfigureProductEx 可用作 Win32 函数,但它通过 COM 自动化接口公开。如果您 platform invoke 可以使用该调用 - 第 14 节中有一个 C++ 示例:Uninstalling an MSI file from the command line without using msiexec。或者,您可以使用 WiX 工具包中的 DTF 功能(请参阅与 C++ 示例相同的链接中的第 6 节)。


2018 年 7 月更新

Set installer = CreateObject("WindowsInstaller.Installer")
installer.InstallProduct "product.msi", "REMOVE=ALL REBOOT=ReallySuppress"
Set installer = Nothing

也许上面的 sn -p 是最好的卸载方法?这应该抑制任何重新启动。我现在没有时间或设置来测试它(在 Linux 机器上),但我想在忘记之前添加它。


原始卸载脚本

Const msiUILevelNone = 2
Const msiInstallStateAbsent = 2

Set installer = CreateObject("WindowsInstaller.Installer")
'installer.UILevel = msiUILevelNone ' Disabled to prevent silent uninstall. Now the UAC prompt will show

' Uninstall Orca, replace upgrade code with yours
Set products = installer.RelatedProducts("CFF4D510-79B2-1CCD-0061-5741A0565A76")

For Each product In products
   ' MsgBox "Product Code: " & product ' Show the product code found, if you want

   ' The following call when run silently with admin rights may reboot the system without warning!
   ' This is due to badly authored MSI packages - most packages will not trigger this problem.
   installer.ConfigureProduct product, 0,  msiInstallStateAbsent ' Uninstall product

   ' See text above for info on the newer ConfigureProductEx method.
Next

Set installer = Nothing

MsgBox "Finished" ' Just so we know the script ran if nothing found to uninstall

一些链接:

Is there an alternative to GUID when using msiexec to uninstall an application?(按产品名称卸载) How can I uninstall an application using PowerShell? How can I use powershell to run through an installer? WIX (remove all previous versions) Wix upgrade goes into maintenance mode and never does upgrade(各种卸载方式,按产品代码、按升级代码等...)

【讨论】:

以上是关于Powershell企业应用 - 第05章 编写Powershell日志系统的主要内容,如果未能解决你的问题,请参考以下文章

PowerShell 运维菜鸟系列-04-批量-启用用户-启用企业语音-设置分机号(项目中)

使用PowerShell收集多台服务器的性能计数器

Powershell简介

PowerShell小技巧:通过Powershell 发送消息给企业微信机器人

powershell 适用于标准版和企业版的SharePoint PowerShell许可证映射

Lync PowerShell:为用户启用企业语音