当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 使用 PowerShell 读取和创建 SCCM 客户端日志

作者:精品下载站 日期:2024-12-14 12:41:38 浏览:14 分类:玩电脑

使用 PowerShell 读取和创建 SCCM 客户端日志


如果您是 SCCM 管理员,您可能熟悉 CMtrace 日志读取工具。 CMTrace 知道 SCCM 客户端日志的特定架构,但您知道可以像 CMTrace 一样使用 PowerShell 吗?

使用 PowerShell,您可以阅读:

  • SCCM 客户端软件安装日志
  • SCCM客户端软件更新日志
  • SCCM 客户端硬件清单日志

..以及几乎所有其他人!

SCCM 客户端日志遵循一定的模式。要从它们中获得某种标准化输出,您必须了解该模式。幸运的是,对你来说,这已经完成了。

使用 PowrShell 读取 SCCM 客户端日志

查看下面查询 SCCM 客户端日志的 PowerShell 代码。

Get-SCCMClientLog PowerShell 函数有两个参数; ComputerNameLogName 允许您查询远程计算机并指定您要查看的日志名称。

相关:PowerShell功能介绍

一旦您在 PowerShell 控制台中启用此函数,您就可以像下面一样运行它。下面的示例将查询名为 PC 的远程计算机并检索 execmgr 日志文件。

Get-SccmClientLog -ComputerName PC -LogName execmgr

所有繁重的工作都已在该函数中为您完成。

创建您自己的 SCCM 客户端日志

如果您想使用 Get-SCCMClientLog 函数但用于其他目的,该怎么办?您也可以创建自己的类似 SCCM 客户端的日志文件!

[玩转系统] 使用 PowerShell 读取和创建 SCCM 客户端日志

只要看看可排序的列和红色突出显示的美丽!起初,您可能认为您可以在 CMTrace 中查看任何类型的文本日志,您是对的。不过,让我们看一下 CMTrace 中的 WindowsUpdate.log 文件。

[玩转系统] 使用 PowerShell 读取和创建 SCCM 客户端日志

注意到所有的列都消失了吗? CMTrace 仍会查看常规日志文件,但您将无法获得 CMTrace 的一些出色功能。您很快就会发现文本文件必须正确格式化才能显示所有有用的列并正确定义哪些行应该突出显示为黄色和红色。 vs. 什么都没有。

我想向您展示几个名为 Write-LogStart-Log 的 PowerShell 函数。这些函数专门用于将脚本的活动记录到日志文件中,然后可以在 CMTrace 中读取该日志文件。

在本文结束时,您将拥有一个可以在脚本中调用的函数来构建日志文件,以便 CMTrace 能够正确读取它们。

启动日志

为了避免必须一遍又一遍地指定相同的 SCCM 客户端日志文件路径,我选择创建一个名为 Start-Log 的函数。该函数旨在在脚本的顶部调用。该函数只是创建一个文本文件并(重要部分)设置一个名为 ScriptLogFilePath 的全局变量。

[CmdletBinding()]
param (
    [ValidateScript({ Split-Path $_ -Parent | Test-Path })]
    [string]$FilePath
)
try {
    if (!(Test-Path $FilePath)) {
        ## Create the log file
        New-Item $FilePath -Type File | Out-Null
    }
    ## Set the global variable to be used as the FilePath for all subsequent Write-Log calls in this session
    $global:ScriptLogFilePath = $FilePath
} catch {
    Write-Error $_.Exception.Message
}

这个功能超级简单。但是,这是为了防止我们每次需要在脚本中调用 Write-Log 函数时都必须传递 LogFile 。通过简单地提前创建一个全局变量,我们可以简单地调用Write-Log,它就会知道日志文件路径。

写日志

在脚本中调用 Start-Log 后,您现在就可以运行 Write-Log 将 SCCM 客户端日志消息写入日志文件。 Write-Log 有两个参数; 消息LogLevel消息很简单。这就是您想要写入日志的内容。 LogLevel 需要一些解释。

为了让 CMTrace 将线条突出显示为红色或黄色,需要以某种方式记录线条。更具体地说,它需要有一个像这样的字符串:type="1"。这种类型的键可以是 1,2 或 3。这些指示脚本中的严重性级别。

例如,如果我想记录一条简单的信息消息,那么那就是 1。如果我想记录更严重的活动,那么我可能会使用 2 ,它会突出显示为黄色。最后,如果我希望该行在 CMTrace 中突出显示为红色,我可以选择 3

param (
    [Parameter(Mandatory = $true)]
    [string]$Message,

    [Parameter()]
    [ValidateSet(1, 2, 3)]
    [int]$LogLevel = 1
)

注意到 LogLevel 参数了吗?默认情况下,它会将其设置为 1,但如果您想编写脚本执行期间发生的一些更严重的活动,您始终可以在必要时覆盖它。

接下来,您需要方便地显示日期/时间列。为此,需要通过此字符串操作魔法实现特定的日期/时间格式。

$TimeGenerated = "$(Get-Date -Format HH:mm:ss).$((Get-Date).Millisecond)+000"

接下来,我将使用日志行在 CMTrace 中正确显示所需的所有适当格式来构建日志行模板。

$Line = '<![LOG[{0}]LOG]!><time="{1}" date="{2}" component="{3}" context="" type="{4}" thread="" file="">'

获得模板后,接下来就是构建 {} 中的内容。在这里,我构建了一个数组,然后将其传递到 $Line 中,以用真实信息替换所有 {}

$LineFormat = $Message, $TimeGenerated, (Get-Date -Format MM-dd-yyyy), "$($MyInvocation.ScriptName | Split-Path -Leaf):$($MyInvocation.ScriptLineNumber)", $LogLevel

它们的顺序与上面的 {} 相同。 {0} 将转换为 $Message{1} 将转换为 $TimeGenerated{2} 将转换为今天的日期,{4} 将转换为 $LogLevel

注意到我跳过了 {3} 吗?这就是我对你的所有忍者的态度。 CMTrace 有一个我从未使用过的组件列,因此我决定用它来做一些事情。

我想查看脚本的名称和调用 Write-Log 的行号。此字符串: "$ ($MyInvocau.ScriptName | Split-Path -Leaf):$ ($MyInvocau.ScriptLineNumber)" 就是实现这一点的原因。

然后,我使用 PowerShell 的字符串格式将这两个变量组合在一起来构建 $Line

$Line = $Line -f $LineFormat

然后只需将 $Line 写入已由 Start-Log 定义的文本文件即可。

Add-Content -Value $Line -Path $ScriptLogFilePath

怎么运行的

假设我构建了一个类似于 LogDemo.ps1 的脚本:

Start-Log -FilePath C:\MyLog.log
Write-Host "Script log file path is [$ScriptLogFilePath]"
Write-Log -Message 'simple activity'
Write-Log -Message 'warning' -LogLevel 2
Write-Log -Message 'Error' -LogLevel 3

该脚本在 C:\MyLog.log 处创建日志文件,然后通过使用我上面解释的 LogLevel 参数将 3 个严重级别写入日志。

当我使用 Get-Content 检查该文件的输出时,它看起来非常难看。

<![LOG[simple activity]LOG]!><time="18:56:26.307+000" date="12-03-2015" component="LogDemo.ps1:3" context="" type="1" thread="" file=""> <![LOG[warning]LOG]!><time="18:56:26.307+000" date="12-03-2015" component="LogDemo.ps1:4" context="" type="2" thread="" file=""> <![LOG[Error]LOG]!><time="18:56:26.307+000" date="12-03-2015" component="LogDemo.ps1:5" context="" type="3" thread="" file="">

不过,让我们在 CMTrace 中打开它,看看它是什么样子的。

[玩转系统] 使用 PowerShell 读取和创建 SCCM 客户端日志

那不是很漂亮吗?

即使您不是 SCCM 管理员,我也强烈建议您使用 CMTrace 来满足您的所有日志查看需求。

一旦您获得了适当格式的日志文件(您现在没有理由不这么做),只需在 CMTrace 中打开它们并观察 CMTrace 的美妙之处!

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯