Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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ı $CimSession
bir 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
- WMI ve CIM cmdlet'lerindeki fark nedir?
- Varsayılan olarak, cmdlet hangi protokolü
Get-CimInstance
kullanır? - ile
Get-CimInstance
bir bilgisayar adı belirtmek yerine CIM oturumu kullanmanın bazı avantajları nelerdir? - Ile
Get-CimInstance
kullanılacak varsayılan protokol dışında bir alternatif protokolü nasıl belirtirsiniz? - CIM oturumlarını nasıl kapatır veya kaldırırsınız?
Kaynaklar
PowerShell