WMI ile PowerShell Sürümünü Alın


PowerShell 4.0'ın piyasaya sürülmesiyle ortamınızda birden fazla sistemin bulunması mümkündür. Bunu yaptığımı biliyorum çünkü test ağımda birden fazla sürüm gerektiren çok sayıda yazma, test etme ve geliştirme yapıyorum. Son zamanlarda WMI filtrelerini düşündüğümde bazı Grup İlkesi çalışmaları yapıyordum. WMI filtresi, Grup İlkesini belirli kriterleri karşılayan makinelerle sınırlamanın bir yoludur. Bilgisayarın PowerShell 3 veya 4'ü çalıştırıp çalıştırmadığını belirleyebilecek bir WMI filtresine sahip olmanın faydalı olacağını düşündüm. Neden? Bunun bir nedeni, v4 makinelerinin yerel bir v4 kaynağından gelen yardımı ve aynı şekilde v3 için de güncellemesi olabilir. Bu yüzden bir WMI sorgusu geliştirmeye bakmaya başladım.

Bu, bunun gelişmesine yol açtı:


Function Get-WMIPowerShell {

[cmdletbinding()]
Param(
[Parameter(Position=0,ValueFromPipeline=$True)]
[alias("cn","pscomputername")]
[string[]]$Computername = $env:COMPUTERNAME
)

Begin {
    Write-Verbose -Message "Starting $($MyInvocation.Mycommand)"  

    $wmiParam=@{
     class = 'CIM_datafile'
     filter= ""name='c:\\windows\\system32\\windowspowershell\\v1.0\\powershell.exe'"
     ComputerName= $Null
     ErrorAction= "Stop"
    }
} #begin

Process {

foreach ($computer in $computername) {
     Write-Verbose "Querying $computer.toUpper())"
     $wmiParam.Computername=$Computer
    Try {
     Get-WMIObject @wmiParam | Select @{name="Computername";Expression={$_.CSName}},
     Name,Version,FileSize,
     @{Name="Installed";Expression={$_.ConvertToDateTime($_.InstallDate)}}
    }
    Catch {
      Write-Warning "Failed to retrieve WMI information from $computername"
      Write-Warning $_.Exception.Message
    }
 } #foreach
} #process

End {
    Write-Verbose -Message "Ending $($MyInvocation.Mycommand)"
} #end

} #end function

Bu işlev, PowerShell.exe için CIM_DATAFILE sınıfının örneğini almak üzere WMI'yı kullanır. Bu sınıfı sorgularken sorgunuzda olabildiğince spesifik olmayı buldum. Bu oldukça hızlı çalışır ve bazı yararlı bilgiler döndürür. Bir grup bilgisayar için bile çalıştırabilirim.

PS S:\> Get-WMIPowerShell -comp chi-dc01,chi-dc02,chi-dc04,chi-hvr2.globomantics.local,jdhit-dc01,novo8 | out-gridview -title "PS Version"

Bu da bana şunu veriyor:

İlk iki makine PowerShell 2.0'ı, sonraki 2 v3'ü ve son 2 v4'ü çalıştırıyor. Artık bunun işe yaradığını bildiğime göre, şunun gibi bir sorguyla bir WMI filtresi oluşturabilirim:

"Select * from CIM_Datafile where name='c:\\windows\\system32\\windowspowershell\\v1.0\\powershell.exe' AND version like '6.2%'"

Bu yalnızca PowerShell 3,0 çalıştıran bilgisayarlar için filtre uygulamalıdır.

Bu işlevi alternatif kimlik bilgileri için destek ekleyeceğimi düşünerek yazdım. Ancak ihtiyacınız yoksa aynı bilgiyi [WMI] tipi hızlandırıcıyı kullanarak da alabilirsiniz.

PS S:\> [WMI]"\\CHI-DC04\root\cimv2:CIM_DataFile.Name='c:\\windows\\system32\\windowspowershell\\v1.0\\powershell.exe'"


Compressed : False
Encrypted  : False
Size       : 
Hidden     : False
Name       : c:\\windows\\system32\\windowspowershell\\v1.0\\powershell.exe
Readable   : True
System     : False
Version    : 6.2.9200.16384
Writeable  : True

Bir SELECT sorgusunu test edip geliştirmem gerekiyordu, bu yüzden yaptığım işlevi buldum. Tarih bilgisi ekstradır ve Get-CIMInstance kullanıyorsanız tarihler sizin için dönüştürülür.


$wmiParam=@{
     class = 'CIM_datafile'
     filter= "name='c:\\windows\\system32\\windowspowershell\\v1.0\\powershell.exe' AND version like '6.2%'"
     ComputerName= 'CHI-DC04'
     ErrorAction= "Stop"
    }

Get-CIMInstance @wmiParam | Select PSComputername,Name,Version,FileSize,InstallDate

Evet, bu bilgiyi Test-WSMan ile de alabileceğinizi biliyorum ve bu kesinlikle çok daha kolay bir yol. Şans eseri hala PowerShell 1.0'ı kullanıyor olsanız da bunun işe yarayacağını düşünmüyorum. Neyse, işte buradasın. PowerShell sürümünü öğrenmek için WMI kullanmanın hızlı bir yolu ve Grup İlkesi için bir WMI filtresi oluşturmak için kullanabileceğiniz bir sorgu.

Eğlence.

GÜNCELLEME 11/14
Orijinal sorgumla ne düşündüğümü bilmiyorum. Olması gerekenden çok daha karmaşıktı. Kod örneklerimi daha iyi bir filtreyle güncelledim. Herhangi bir yolda\kullanıldığında, bundan kaçış yapılması gerektiğini ve bu nedenle adı bu şekilde gördüğünüzü unutmayın.

İlgili makaleler