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 başka bir yazılım veya modül yüklemenize gerek kalmadan ç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 bir Windows 11 sisteminden 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
-----------     ----                                               -------
Cmdlet          Get-WmiObject                                      3.1.0.0
Cmdlet          Invoke-WmiMethod                                   3.1.0.0
Cmdlet          Register-WmiEvent                                  3.1.0.0
Cmdlet          Remove-WmiObject                                   3.1.0.0
Cmdlet          Set-WmiInstance                                    3.1.0.0

Ortak Bilgi Modeli (CIM) cmdlet'leri PowerShell 3.0'da kullanıma sunulmuştur ve ayrılmış bir modülde gruplandırılmıştır. Kullanılabilir tüm CIM cmdlet'lerini listelemek için, aşağıdaki örnekte gösterildiği gibi Module parametresiyle cmdlet'ini kullanınGet-Command.

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

CIM cmdlet'leri hala WMI ile çalışmanıza izin verir, bu nedenle birisi şunu belirttiğinde kafanız karışmasın: "WMI'yi PowerShell CIM cmdlet'leriyle sorguladığımda".

Daha önce belirtildiği 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

WQL sorgusunu VBScript'ten alabilir ve herhangi bir değişiklik yapmadan cmdlet ile 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

Önceki örnek normalde PowerShell ile WMI'yi nasıl sorguladığımla ilgili değildir. Ancak çalışır ve mevcut Visual Basic betiklerini PowerShell'e kolayca geçirmenizi sağlar. WMI'yi sorgulamak için tek satırlık bir komut yazarken 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ı istiyorsanız, çıktıyı adresine yöneltin Select-Object ve yalnızca SerialNumber özelliğini belirtin.

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

Varsayılan olarak, WMI sorgulandığında, genellikle kullanılmayan birkaç özellik arka planda otomatik olarak alınır. Yerel bilgisayarda WMI sorgularken çok önemli değildir. Ancak uzak bilgisayarları sorgulamaya başladığınızda, yalnızca bu bilgileri döndürmek için fazladan işlem süresi değil, aynı zamanda ağ üzerinden gönderilecek daha gereksiz bilgiler de olur. Get-CimInstance , alınan bilgileri sınırlayan bir Property parametresine sahiptir ve 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ü. 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

Nokta söz dizimi stilini kullanarak bir dize döndürebilir ve bu da Select-Object ihtiyacını ortadan kaldırabilir.

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

CIM cmdlet'leriyle Uzak Bilgisayarları Sorgulama

PowerShell'i hala yerel yönetici ve etki alanı kullanıcısı olarak çalıştırıyor olmanız gerekir. Cmdlet'ini kullanarak uzak bir bilgisayardan bilgi sorgulamaya Get-CimInstance çalıştığınızda erişim reddedildi hata iletisi alırsınız.

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:Stri
   ng) [Get-CimInstance], CimException
    + FullyQualifiedErrorId : HRESULT 0x80070005,Microsoft.Management.Infra
   structure.CimCmdlets.GetCimInstanceCommand
    + PSComputerName        : dc01

Birçok kişinin PowerShell ile ilgili güvenlik endişeleri vardır, ancak PowerShell'de GUI'deki izinlerle aynı izinlere sahipsiniz. Ne eksik, ne fazla. Ö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şlatabilirsiniz. Ancak PowerShell'den çalıştırdığınız her şey etki alanı yöneticisi olarak çalıştırıldığından bu iyi bir fikir değildir. Duruma bağlı olarak, bu senaryo güvenlik açısından tehlikeli olabilir.

En az ayrıcalık ilkesini kullanarak, bir komutun varsa Credential parametresini kullanarak komut başına etki alanı yönetici hesabınıza yükseltin. Get-CimInstance Kimlik Bilgisi parametresi olmadığından, bu senaryoda çözüm önce bir CimSession oluşturmaktır. Ardından, uzak bilgisayardaki WMI'yi sorgulamak için bilgisayar adı yerine CimSession kullanın.

$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, $CimSession adlı bir değişkende depolandı. Ayrıca cmdlet'i parantez içinde belirttiğinize dikkat edin, böylece yeni oturumu oluşturmadan önce yürütülür ve alternatif kimlik bilgileri istenir. 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.

Artık uzak bilgisayardaki WMI'den BIOS bilgilerini sorgulamak için cmdlet'iyle Get-CimInstance önceki örnekte oluşturulan CIM oturumunu kullanabilirsiniz.

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

Yalnızca bir bilgisayar adı belirtmek yerine CIM oturumlarını kullanmanın çeşitli avantajları vardır. Aynı bilgisayarda birden çok sorgu çalıştırdığınızda, CIM oturumu kullanmak her sorgu için bilgisayar adını kullanmaktan daha verimlidir. CIM oturumu oluşturmak, bağlantıyı yalnızca bir kez kurar. Ardından, birden çok sorgu bilgileri almak için aynı oturumu kullanır. Bilgisayar adını kullanmak için cmdlet'lerin her sorguyla bağlantıyı kurması ve kapatması 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 olması gerekiyor, bu da PowerShell 3.0 ve üzeri sürümleri ile bulunur.

Test-WSMan -ComputerName dc01
wsmid           : http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentit
                  y.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, güvenlik duvarı genellikle Windows'un daha yeni sürümlerinde DCOM'yi engeller. New-CimSessionOption cmdlet'i, New-CimSession ile kullanılmak üzere bir DCOM protokol bağlantısı oluşturmanıza olanak tanır. Bu seçenek, cmdlet'in Get-CimInstance Windows Server 2000 kadar eski Windows sürümleriyle iletişim kurmasını sağlar. Bu özellik, cmdlet'i DCOM protokolunu kullanacak şekilde yapılandırılmış bir CimSession ile kullanırken Get-CimInstance 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, kimlik bilgilerinizi yeniden el ile girmek yerine Credential parametresinin değeri olarak adlandırılan $Cred değişkeni belirttiğinize dikkat edin.

Sorgunun çıktısı, temel alınan 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ğlı 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 öğesini adlı $CimSessionbir değişkende alın ve depolayın.

$CimSession = Get-CimSession

Biri WSMan protokollü, diğeri DCOM ile birlikte tek 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ındaki blog makalelerimden birinde WSMan veya DCOM kullanılıp kullanılmayacağını otomatik olarak algılayan ve sizin için uygun CIM oturumunu ayarlayan bir PowerShell işlevi bulunur. Daha fazla bilgi için bkz. Dcom'a Geri Dönüş ile Uzak Bilgisayarlara CimSessions Oluşturmak için PowerShell İşlevi.

CIM oturumlarını bitirdiğinizde, cmdlet Remove-CimSession komutunu kullanarak bunları kaldırın. Tüm CIM oturumlarını kaldırmak için Get-CimSession'i Remove-CimSession'e yönlendirin.

Get-CimSession | Remove-CimSession

Özet

Bu bölümde, yerel ve uzak bilgisayarlarda WMI ile çalışmak için PowerShell kullanmayı öğrendiniz. Ayrıca WSMan ve DCOM protokollerini kullanarak uzak bilgisayarlarla çalışmak için CIM cmdlet'lerini kullanmayı da öğrendinsiniz.

Eleştiri

  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 bazı avantajları 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?

Kaynaklar