PowerShell ile SCCM İstemci Günlüklerini Okuma ve Oluşturma


Bir SCCM yöneticisiyseniz, muhtemelen CMtrace günlük okuma aracına aşinasınızdır. CMTrace, SCCM istemci günlüklerinin özel şemasını biliyor ancak PowerShell'i CMTrace gibi kullanabileceğinizi biliyor muydunuz?

PowerShell'i kullanarak şunları okuyabilirsiniz:

  • SCCM istemci yazılımı yükleme günlükleri
  • SCCM istemci yazılımı güncelleme günlükleri
  • SCCM istemci donanım envanter günlükleri

..ve hemen hemen geri kalanların hepsi!

SCCM istemci günlükleri belirli bir şemayı takip eder. Onlardan bir tür standartlaştırılmış çıktı almak için bu şemayı anlamalısınız. Neyse ki, sizin için bu zaten yapıldı.

PowrShell ile SCCM İstemci Günlüklerini Okuma

SCCM istemci günlüklerini sorgulayan aşağıdaki PowerShell koduna bir göz atın.

Bu Get-SCCMClientLog PowerShell işlevinin iki parametresi vardır; BilgisayarAdı ve GünlükAdı uzak bilgisayarları sorgulamanıza ve görüntülemek istediğiniz günlük adını belirtmenize olanak tanır.

İlgili: PowerShell İşlevine Giriş

Bu fonksiyonu PowerShell konsolunuzda kullanılabilir hale getirdikten sonra aşağıdaki gibi çalıştırabilirsiniz. Aşağıdaki örnek, PC adı verilen uzak bilgisayarı sorgulayacak ve execmgr günlük dosyasını alacaktır.

Get-SccmClientLog -ComputerName PC -LogName execmgr

Bu fonksiyonda tüm ağır işler sizin için zaten yapıldı.

Kendi SCCM İstemci Günlüklerinizi Oluşturma

Get-SCCMClientLog işlevini başka amaçlarla kullanmak istiyorsanız ne olur? Kendi SCCM istemcisi benzeri günlük dosyalarınızı da oluşturabilirsiniz!

Sıralanabilir sütunların ve kırmızı vurgunun güzelliğine bakın! İlk başta, CMTrace'de her türlü metin günlüğünü görüntüleyebileceğinizi düşünebilirsiniz ve haklısınız. Ancak gelin CMTrace'deki WindowsUpdate.log dosyasına bir göz atalım.

Tüm sütunların gittiğini fark ettiniz mi? CMTrace normal günlük dosyalarını görüntülemeye devam edecek ancak CMTrace'i mükemmel kılan bazı özelliklerden yararlanamayacaksınız. Yakında, tüm bu yararlı sütunların gösterilmesi ve hangi satırların sarı veya kırmızı olarak vurgulanması gerektiğini doğru bir şekilde tanımlamak için bir metin dosyasının doğru şekilde biçimlendirilmesi gerektiğini göreceksiniz. vs. hiçbir şey.

Size Write-Log ve Start-Log adlı birkaç PowerShell işlevini göstermek istiyorum. Bu işlevler, komut dosyanızın etkinliğini daha sonra CMTrace'de okunabilecek bir günlük dosyasına kaydetmek için özel olarak oluşturulmuştur.

Bu yazının sonunda, CMTrace'in bunları doğru şekilde okuyabileceği şekilde günlük dosyaları oluşturmak için komut dosyalarınızı çağırabileceğiniz bir işleve sahip olacaksınız.

Başlangıç-Günlüğü

Aynı SCCM istemci günlük dosyası yolunu tekrar tekrar belirtmek zorunda kalmamak için Start-Log adında bir işlev oluşturmayı seçtim. Bu işlevin betiğinizin üst kısmında çağrılması amaçlanmıştır. Bu işlev basitçe bir metin dosyası oluşturur ve (önemli kısım) ScriptLogFilePath adı verilen genel bir değişkeni ayarlar.

[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
}

Bu işlev son derece basittir. Ancak, betiklerimizde Write-Log fonksiyonumuzu her çağırmamız gerektiğinde LogFile'ı geçmek zorunda kalmamamızı önlemek için gereklidir. Önceden global bir değişken oluşturarak basitçe Write-Log'u çağırabiliriz ve bu, günlük dosyası yolunu bilir.

Yazma Günlüğü

Komut dosyanızda Start-Log'u çağırdıktan sonra, artık SCCM istemci günlük mesajlarını günlük dosyasına yazmak için Write-Log komutunu çalıştırabilirsiniz. Write-Log'un iki parametresi vardır; Mesaj ve LogLevel. Mesaj kolaydır. Günlüğe yazmak istediğiniz şey budur. LogLevel biraz açıklama gerektirir.

CMTrace'in satırları kırmızı veya sarı olarak vurgulamasını sağlamak için satırın belirli bir şekilde kaydedilmesi gerekir. Daha spesifik olarak şunun gibi bir dizeye sahip olması gerekir: type="1". Bu anahtar türü 1,2 veya 3 olabilir. Bunlar, komut dosyanızdaki önem düzeylerini gösterir.

Örneğin, basit bir bilgi mesajını günlüğe kaydetmek istersem bu bir 1 olur. Daha şiddetli bir aktiviteyi günlüğe kaydetmek istersem sarı renkle vurgulanacak 2 kullanabilirim. Son olarak, CMTrace'de o satırın kırmızıyla vurgulanmasını istersem 3'ü seçebilirim.

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

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

LogLevel parametresine dikkat ettiniz mi? Varsayılan olarak bunu bir 1 olarak ayarlayacaktır, ancak komut dosyanızın yürütülmesi sırasında meydana gelen daha ciddi etkinlikleri yazmak isterseniz, gerekirse bunu her zaman geçersiz kılabilirsiniz.

Daha sonra, doğru şekilde görünmesi için bu kullanışlı tarih/saat sütununa ihtiyacınız var. Bunu yapmak için, bu dize işleme sihirbazlığıyla elde edilen belirli bir tarih/saat biçimi gerekiyordu.

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

Sırada, satırın CMTrace'de doğru şekilde görünmesi için ihtiyaç duyduğu tüm uygun formatları kullanarak bir günlük satırı şablonu oluşturacağım yer var.

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

Şablonu aldıktan sonra sıra { 'lara ne gireceğini oluşturma meselesine kalıyor. Burada bir dizi oluşturuyorum ve bu diziyi daha sonra $Line'a geçirerek tüm {'lerimizi gerçek bilgilerle değiştireceğim.

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

Bunlar yukarıdaki {comcode>'lerle aynı sıradadır. {0}, $Message'a dönüştürülecek, {1}, $TimeGeneated'a dönüştürülecek, {2} bugünün tarihine dönüştürülecek ve {4}, $LogLevel'a dönüştürülecek.

{3}'ı atladığımı fark ettiniz mi? Burası sana tüm ninjaları yönelttiğim yer. CMTrace'in hiç kullanmadığım bir bileşen sütunu var, bu yüzden ondan bir şeyler yapmaya karar verdim.

Betiğin adını ve Write-Log'un çağrıldığı satır numarasını görmek istedim. Bu dize: "$ ($MyIntained.ScriptName | Split-Path -Leaf):$ ($MyIntained.ScriptLineNumber)" bunu sağlayan şeydir.

Daha sonra $Line'ı oluşturmak için PowerShell'in dize biçimlendirmesini kullanarak bu iki değişkeni bir araya getiriyorum.

$Line = $Line -f $LineFormat

O zaman geri kalan tek şey, zaten Start-Log tarafından tanımlanmış bir metin dosyasına $Line yazmaktır.

Add-Content -Value $Line -Path $ScriptLogFilePath

Nasıl çalışır

Diyelim ki LogDemo.ps1 adında buna benzeyen bir komut dosyası oluşturdum:

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

Bu script C:\MyLog.log adresinde log dosyamızı oluşturur ve daha sonra yukarıda anlattığım LogLevel parametrelerini kullanarak loga 3 seviyeli önem derecesi yazmaya devam eder.

Bu dosyanın çıktısını Get-Content ile kontrol ettiğimde oldukça çirkin görünüyor.

<![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="">

Ancak gelin bunu CMTrace'de açalım ve neye benzediğine bakalım.

Çok güzel değil mi?

SCCM yöneticisi olmasanız bile, tüm günlük görüntüleme ihtiyaçlarınız için CMTrace'i kullanmanızı şiddetle tavsiye ederim.

Günlük dosyalarını uygun formatta aldıktan sonra (ve artık bunu yapmamak için hiçbir mazeretiniz kalmadığında) bunları CMTrace'de açın ve CMTrace'in güzelliğini gözlemleyin!

İlgili makaleler