Aracılığıyla paylaş


Bölüm 7 - WMI ile çalışma

WMI ve CIM

Windows PowerShell, Windows Yönetim Araçları (WMI) gibi diğer teknolojilerle çalışmak için varsayılan olarak cmdlet'lerle birlikte görüntülenir. WMI cmdlet'leri kullanım dışıdır ve PowerShell 6+ sürümlerinde kullanılamaz, ancak Windows PowerShell'de çalışan eski betiklerde karşılaşabileceğiniz için burada ele alınmıştır. Yeni geliştirme için bunun yerine CIM cmdlet'lerini kullanın.

PowerShell'de ek yazılım veya modül yüklemek zorunda kalmadan var olan çeşitli yerel WMI cmdlet'leri vardır. Get-Command , Windows PowerShell'de hangi WMI cmdlet'lerinin mevcut olduğunu belirlemek için kullanılabilir. Aşağıdaki sonuçlar PowerShell sürüm 5.1 çalıştıran Windows 10 laboratuvar ortamı bilgisayarımdan alınıyor. Sonuçlarınız, çalıştırdığınız PowerShell sürümüne bağlı olarak farklılık gösterebilir.

Get-Command -Noun WMI*
CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Get-WmiObject                                      3.1.0.0    Microsof...
Cmdlet          Invoke-WmiMethod                                   3.1.0.0    Microsof...
Cmdlet          Register-WmiEvent                                  3.1.0.0    Microsof...
Cmdlet          Remove-WmiObject                                   3.1.0.0    Microsof...
Cmdlet          Set-WmiInstance                                    3.1.0.0    Microsof...

Ortak Bilgi Modeli (CIM) cmdlet'leri PowerShell sürüm 3.0'da kullanıma sunulmuştur. CIM cmdlet'leri hem Windows hem de Windows olmayan makinelerde kullanılabilmesi için tasarlanmıştır.

CIM cmdlet'lerinin tümü bir modülün içinde yer alır. CIM cmdlet'lerinin listesini almak için aşağıdaki örnekte gösterildiği gibi Module parametresiyle kullanın.Get-Command

Get-Command -Module CimCmdlets
CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Export-BinaryMiLog                                 1.0.0.0    CimCmdlets
Cmdlet          Get-CimAssociatedInstance                          1.0.0.0    CimCmdlets
Cmdlet          Get-CimClass                                       1.0.0.0    CimCmdlets
Cmdlet          Get-CimInstance                                    1.0.0.0    CimCmdlets
Cmdlet          Get-CimSession                                     1.0.0.0    CimCmdlets
Cmdlet          Import-BinaryMiLog                                 1.0.0.0    CimCmdlets
Cmdlet          Invoke-CimMethod                                   1.0.0.0    CimCmdlets
Cmdlet          New-CimInstance                                    1.0.0.0    CimCmdlets
Cmdlet          New-CimSession                                     1.0.0.0    CimCmdlets
Cmdlet          New-CimSessionOption                               1.0.0.0    CimCmdlets
Cmdlet          Register-CimIndicationEvent                        1.0.0.0    CimCmdlets
Cmdlet          Remove-CimInstance                                 1.0.0.0    CimCmdlets
Cmdlet          Remove-CimSession                                  1.0.0.0    CimCmdlets
Cmdlet          Set-CimInstance                                    1.0.0.0    CimCmdlets

CIM cmdlet'leri hala WMI ile çalışmanıza izin verir, bu nedenle birisi "POWERShell CIM cmdlet'leriyle WMI'yi sorguladığımda..." deyimini yaptığında kafanız karışmasın.

Daha önce de belirttiğim gibi WMI, PowerShell'den ayrı bir teknolojidir ve WMI'ye erişmek için yalnızca CIM cmdlet'lerini kullanıyorsunuz. Aşağıdaki örnekte olduğu gibi WMI'yi sorgulamak için WMI Sorgu Dili (WQL) kullanan eski bir VBScript bulabilirsiniz.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colBIOS = objWMIService.ExecQuery _
    ("Select * from Win32_BIOS")

For each objBIOS in colBIOS
    Wscript.Echo "Manufacturer: " & objBIOS.Manufacturer
    Wscript.Echo "Name: " & objBIOS.Name
    Wscript.Echo "Serial Number: " & objBIOS.SerialNumber
    Wscript.Echo "SMBIOS Version: " & objBIOS.SMBIOSBIOSVersion
    Wscript.Echo "Version: " & objBIOS.Version
Next

Bu VBScript'ten WQL sorgusunu alabilir ve herhangi bir değişiklik yapmadan cmdlet'iyle Get-CimInstance kullanabilirsiniz.

Get-CimInstance -Query 'Select * from Win32_BIOS'
SMBIOSBIOSVersion : 090006
Manufacturer      : American Megatrends Inc.
Name              : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber      : 3810-1995-1654-4615-2295-2755-89
Version           : VRTUAL - 4001628

Wmi'ı genellikle PowerShell ile bu şekilde sorgulamam. Ancak çalışır ve mevcut VBScript'leri PowerShell'e kolayca geçirmenizi sağlar. WMI'yi sorgulamak için tek satırlı bir satır yazmaya başladığımda aşağıdaki söz dizimini kullanıyorum.

Get-CimInstance -ClassName Win32_BIOS
SMBIOSBIOSVersion : 090006
Manufacturer      : American Megatrends Inc.
Name              : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber      : 3810-1995-1654-4615-2295-2755-89
Version           : VRTUAL - 4001628

Yalnızca seri numarasını istiyorsam, çıktıyı adresine Select-Object yöneltebilir ve yalnızca SerialNumber özelliğini belirtebilirim.

Get-CimInstance -ClassName Win32_BIOS | Select-Object -Property SerialNumber
SerialNumber
------------
3810-1995-1654-4615-2295-2755-89

Varsayılan olarak, arka planda hiçbir zaman kullanılmayan birkaç özellik alınır. Yerel bilgisayarda WMI sorgularken çok önemli olmayabilir. Ancak uzak bilgisayarları sorgulamaya başladıktan sonra, yalnızca bu bilgileri döndürmek için ek işlem süresi değil, aynı zamanda ağ üzerinden çekmeniz gereken ek gereksiz bilgiler de olur. Get-CimInstance , alınan bilgileri sınırlayan bir Property parametresine sahiptir. Bu, WMI sorgusunu daha verimli hale getirir.

Get-CimInstance -ClassName Win32_BIOS -Property SerialNumber |
Select-Object -Property SerialNumber
SerialNumber
------------
3810-1995-1654-4615-2295-2755-89

Önceki sonuçlar bir nesne döndürdü. Basit bir dize döndürmek için ExpandProperty parametresini kullanın.

Get-CimInstance -ClassName Win32_BIOS -Property SerialNumber |
Select-Object -ExpandProperty SerialNumber
3810-1995-1654-4615-2295-2755-89

Basit bir dize döndürmek için noktalı söz dizimi stilini de kullanabilirsiniz. Bu, adresine kanal gönderme gereksinimini Select-Objectortadan kaldırır.

(Get-CimInstance -ClassName Win32_BIOS -Property SerialNumber).SerialNumber
3810-1995-1654-4615-2295-2755-89

CIM cmdlet'leriyle Uzak Bilgisayarları Sorgulama

PowerShell'i hala etki alanı kullanıcısı olan bir yerel yönetici olarak çalıştırıyorum. Cmdlet'ini kullanarak uzak bir bilgisayardan bilgi sorgulamaya çalıştığımda Get-CimInstance erişim reddedildi hata iletisi alıyorum.

Get-CimInstance -ComputerName dc01 -ClassName Win32_BIOS
Get-CimInstance : Access is denied.
At line:1 char:1
+ Get-CimInstance -ComputerName dc01 -ClassName Win32_BIOS
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (root\cimv2:Win32_BIOS:String) [Get-CimI
   nstance], CimException
    + FullyQualifiedErrorId : HRESULT 0x80070005,Microsoft.Management.Infrastructure.Cim
   Cmdlets.GetCimInstanceCommand
    + PSComputerName        : dc01

PowerShell söz konusu olduğunda birçok kişinin güvenlikle ilgili endişeleri vardır, ancak gerçek şu ki, PowerShell'de GUI'deki izinlerle tam olarak aynı izinlere sahipsiniz. Bunun herhangi bir şekilde fazlasıyla ve daha küçük bir kısmıyla eşleşmez. Önceki örnekteki sorun, PowerShell çalıştıran kullanıcının DC01 sunucusundan WMI bilgilerini sorgulama hakkı olmamasıdır. Kimlik Bilgisi parametresi olmadığından PowerShell'i etki alanı yöneticisi Get-CimInstance olarak yeniden başlatabilirim. Ancak güven bana, bu iyi bir fikir değil çünkü PowerShell'den çalıştırdığım her şey etki alanı yöneticisi olarak çalışıyor olabilir. Bu duruma bağlı olarak güvenlik açısından tehlikeli olabilir.

En az ayrıcalık ilkesini kullanarak, bir komutun varsa Credential parametresini kullanarak her komut için etki alanı yönetici hesabıma yükseltiyorum. Get-CimInstancekimlik bilgisi parametresine sahip olmadığından, bu senaryodaki çözüm önce bir CimSession oluşturmaktır. Ardından uzak bilgisayardaki WMI'yi sorgulamak için bilgisayar adı yerine CimSession kullanıyorum.

$CimSession = New-CimSession -ComputerName dc01 -Credential (Get-Credential)
cmdlet Get-Credential at command pipeline position 1
Supply values for the following parameters:
Credential

CIM oturumu adlı $CimSessionbir değişkende depolandı. Yeni oturumu oluşturmadan önce cmdlet'i önce yürütülmesi ve alternatif kimlik bilgileri istenmesi için parantez içinde de belirttiğime Get-Credential dikkat edin. Bu bölümün ilerleyen bölümlerinde size alternatif kimlik bilgilerini belirtmenin daha verimli bir yolunu göstereceğim, ancak daha karmaşık hale getirmeden önce bu temel kavramı anlamanız önemlidir.

Önceki örnekte oluşturulan CIM oturumu artık uzak bilgisayardaki WMI'den BIOS bilgilerini sorgulamak için cmdlet'iyle Get-CimInstance birlikte kullanılabilir.

Get-CimInstance -CimSession $CimSession -ClassName Win32_BIOS
SMBIOSBIOSVersion : 090006
Manufacturer      : American Megatrends Inc.
Name              : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber      : 0986-6980-3916-0512-6608-8243-13
Version           : VRTUAL - 4001628
PSComputerName    : dc01

CIM oturumlarını kullanmanın yalnızca bir bilgisayar adı belirtmek yerine birkaç ek avantajı vardır. Aynı bilgisayarda birden çok sorgu çalıştırırken CIM oturumu kullanmak, her sorgu için bilgisayar adını kullanmaktan daha verimlidir. CIM oturumu oluşturma, bağlantıyı yalnızca bir kez ayarlar. Ardından, birden çok sorgu bilgileri almak için aynı oturumu kullanır. Bilgisayar adını kullanmak için cmdlet'lerin her bir sorguyla bağlantıyı kurması ve bağlantısını koparmaları gerekir.

Get-CimInstance Cmdlet varsayılan olarak WSMan protokolunu kullanır; bu da uzak bilgisayarın bağlanmak için PowerShell sürüm 3.0 veya üzeri olması gerektiği anlamına gelir. Aslında önemli olan PowerShell sürümü değil, yığın sürümüdür. Yığın sürümü cmdlet'i Test-WSMan kullanılarak belirlenebilir. Sürüm 3.0 olmalıdır. PowerShell sürüm 3.0 ve üzeri ile bu sürümü bulacaksınız.

Test-WSMan -ComputerName dc01
wsmid           : http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd
ProtocolVersion : http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd
ProductVendor   : Microsoft Corporation
ProductVersion  : OS: 0.0.0 SP: 0.0 Stack: 3.0

Eski WMI cmdlet'leri, Windows'un eski sürümleriyle uyumlu olan DCOM protokollerini kullanır. Ancak DCOM genellikle windows'un daha yeni sürümlerinde güvenlik duvarı tarafından engellenir. cmdlet'i New-CimSessionOption ile New-CimSessionkullanmak üzere bir DCOM protokolü bağlantısı oluşturmanıza olanak tanır. Bu, cmdlet'in Get-CimInstance Windows Server 2000 kadar eski Windows sürümleriyle iletişim kurmak için kullanılmasını sağlar. Bu, cmdlet'i DCOM protokolunu Get-CimInstance kullanacak şekilde yapılandırılmış bir CimSession ile kullanırken uzak bilgisayarda PowerShell'in gerekli olmadığı anlamına da gelir.

cmdlet'ini New-CimSessionOption kullanarak DCOM protokol seçeneğini oluşturun ve bir değişkende depolayın.

$DCOM = New-CimSessionOption -Protocol Dcom

Verimlilik için, etki alanı yöneticinizi veya yükseltilmiş kimlik bilgilerinizi bir değişkende depolayabilirsiniz, böylece her komut için bunları sürekli olarak girmeniz gerekmez.

$Cred = Get-Credential
cmdlet Get-Credential at command pipeline position 1
Supply values for the following parameters:
Credential

Windows Server 2008 (R2 olmayan) çalıştıran SQL03 adlı bir sunucum var. PowerShell'in varsayılan olarak yüklü olmadığı en yeni Windows Server işletim sistemidir.

DCOM protokolunu kullanarak SQL03'e bir CimSession oluşturun.

$CimSession = New-CimSession -ComputerName sql03 -SessionOption $DCOM -Credential $Cred

Önceki komutta, bu kez credential parametresinin değerini yeniden el ile girmek zorunda kalmak yerine adlı $Cred değişkeni belirttiğime dikkat edin.

Sorgunun çıktısı, kullanılan temel protokolden bağımsız olarak aynıdır.

Get-CimInstance -CimSession $CimSession -ClassName Win32_BIOS
SMBIOSBIOSVersion : 090006
Manufacturer      : American Megatrends Inc.
Name              : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber      : 7237-7483-8873-8926-7271-5004-86
Version           : VRTUAL - 4001628
PSComputerName    : sql03

Get-CimSession Cmdlet, cimSessions'ın şu anda hangi bağlantıda olduğunu ve hangi protokolleri kullandığını görmek için kullanılır.

Get-CimSession
Id           : 1
Name         : CimSession1
InstanceId   : 80742787-e38e-41b1-a7d7-fa1369cf1402
ComputerName : dc01
Protocol     : WSMAN

Id           : 2
Name         : CimSession2
InstanceId   : 8fcabd81-43cf-4682-bd53-ccce1e24aecb
ComputerName : sql03
Protocol     : DCOM

Daha önce oluşturulan CimSessions'ın her ikisini de adlı $CimSessionbir değişkende alın ve depolayın.

$CimSession = Get-CimSession

Biri WSMan protokolünün, diğeri de DCOM'un kullanıldığı bir komutla her iki bilgisayarı da sorgular.

Get-CimInstance -CimSession $CimSession -ClassName Win32_BIOS
SMBIOSBIOSVersion : 090006
Manufacturer      : American Megatrends Inc.
Name              : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber      : 0986-6980-3916-0512-6608-8243-13
Version           : VRTUAL - 4001628
PSComputerName    : dc01

SMBIOSBIOSVersion : 090006
Manufacturer      : American Megatrends Inc.
Name              : Intel(R) Xeon(R) CPU E3-1505M v5 @ 2.80GHz
SerialNumber      : 7237-7483-8873-8926-7271-5004-86
Version           : VRTUAL - 4001628
PSComputerName    : sql03

WMI ve CIM cmdlet'leri hakkında çok sayıda blog makalesi yazdım. En kullanışlılarından biri, WSMan veya DCOM'un kullanılması gerekip gerekmediğini otomatik olarak belirlemek ve hangisini el ile belirlemek zorunda kalmadan CIM oturumunu otomatik olarak ayarlamak için oluşturduğum bir işlevle ilgilidir. Bu blog makalesi, Dcom'a Geri Dönüş ile Uzak Bilgisayarlara CimSessions Oluşturmak için PowerShell İşlevi başlıklıdır.

CIM oturumlarıyla işiniz bittiğinde, bunları cmdlet'iyle Remove-CimSession kaldırmanız gerekir. Tüm CIM oturumlarını kaldırmak için adresine kanal Get-CimSession açmanız yeterlidir Remove-CimSession.

Get-CimSession | Remove-CimSession

Özet

Bu bölümde hem yerel hem de uzak bilgisayarlarda WMI ile çalışmak için PowerShell kullanmayı öğrendiniz. Ayrıca hem WSMan hem de DCOM protokolüne sahip uzak bilgisayarlarla çalışmak için CIM cmdlet'lerini kullanmayı da öğrendinsiniz.

İnceleyin

  1. WMI ve CIM cmdlet'lerindeki fark nedir?
  2. Varsayılan olarak, cmdlet hangi protokolü Get-CimInstance kullanır?
  3. ile Get-CimInstancebir bilgisayar adı belirtmek yerine CIM oturumu kullanmanın avantajlarından bazıları nelerdir?
  4. Ile Get-CimInstancekullanılacak varsayılan protokol dışında bir alternatif protokolü nasıl belirtirsiniz?
  5. CIM oturumlarını nasıl kapatır veya kaldırırsınız?