14 Nisan 2013 Pazar

Windows PowerShell ile İşletim Sistemi Yönetimi



    Merhaba arkadaşlar, geçen hafta sizlere Window PowerShell programlama dilini anlatmıştım. Bugün sizlere Windows PowerShell ile işletim sistemi yönetimini anlatacağım. Windows yönetim araçları (WMI) önemli bir konudur. WMI hizmeti ile işletim sisteminin hemen hemen her yönüyle ilgili bilgi alabilir ve bazı değişiklikler yapabiliriz. Bu yazımda WMI hizmetinin temelde nasıl çalıştığı ve Windows PowerShell ile bu hizmeti nasıl kullanabileceğimizi anlatacağım.


   WMI'nin içinde bulunan çok sayıda sınıf ve fonksiyonlarla işlemci, BIOS, bellek, hizmetler gibi birçok önemli işlevlerin kontrolünü sağlayabiliriz. Bir sınıfın adı genellikle "Win32" ön eki ile başlar ve ardından bu sınıfı tanımlamak için İngilizce bir kelime gelir.


    Eğer kullanacağınız WMI sınıf isimlerini bilmiyorsanız aşağıdaki komutu kullanarak bütün WMI sınıflarını ve bunların özelliklerini görebilirsiniz. Liste uzun olduğundan biraz zaman alabilir.


Get-WmiObject -List

Output:
PS C:\Users\Vahit> Get-WmiObject -List

   NameSpace: ROOT\cimv2

Name                                Methods              Properties                                                                     
----                                -------              ----------                                                                     
......                                           
__TimerNextFiring                   {}                   {NextEvent64BitTime, TimerId}                                                  
__Event                             {}                   {SECURITY_DESCRIPTOR, TIME_CREATED}                                            
__ExtrinsicEvent                    {}                   {SECURITY_DESCRIPTOR, TIME_CREATED}                                            
Win32_DeviceChangeEvent             {}                   {EventType, SECURITY_DESCRIPTOR, TIME_CREATED}                                 
Win32_SystemConfigurationChangeE... {}                   {EventType, SECURITY_DESCRIPTOR, TIME_CREATED}                                 
Win32_VolumeChangeEvent             {}                   {DriveName, EventType, SECURITY_DESCRIPTOR, TIME_CREATED}                      
MSFT_WMI_GenericNonCOMEvent         {}                   {ProcessId, PropertyNames, PropertyValues, ProviderName...}                    
MSFT_NCProvEvent                    {}                   {Namespace, ProviderName, Result, SECURITY_DESCRIPTOR...}                      
MSFT_NCProvCancelQuery              {}                   {ID, Namespace, ProviderName, Result...}                                       
MSFT_NCProvClientConnected          {}                   {Inproc, Namespace, ProviderName, Result...}                                   
MSFT_NCProvNewQuery                 {}                   {ID, Namespace, ProviderName, Query...}                                        
MSFT_NCProvAccessCheck              {}                   {Namespace, ProviderName, Query, QueryLanguage...}                             
Win32_SystemTrace                   {}                   {SECURITY_DESCRIPTOR, TIME_CREATED}                                            
Win32_ProcessTrace                  {}                   {ParentProcessID, ProcessID, ProcessName, SECURITY_DESCRIPTOR...}              
.......


    Örneğin bilgisayarınızın BIOS bilgilerini görmek istiyorsanız aşağıdaki komutu kullanabilirsiniz.

Get-WmiObject Win32_BIOS

Output:
PS C:\Users\Vahit> Get-WmiObject Win32_BIOS


SMBIOSBIOSVersion : F.38
Manufacturer      : Hewlett-Packard
Name              : Default System BIOS
SerialNumber      : CNF8275711
Version           : HPQOEM - 3

    BIOS'un tüm özelliklerini görmek için "Get-WmiObject Win32_BIOS | Format-List *" komutunu kullanabilirsiniz.


    PowerShell her WMI nesnesi için alt çizgi karakteri ile başlayan fakat bir nesnenin parçası olmayan birtakım özellikleri bağlar. Kullanmayacağımız bir özelliği görmek istemeyiz. Bunu sağlamak için PowerShell'in filtreleme özelliğini kullanabiliriz.


Get-WmiObject Win32_BIOS | Format-List [a-z]*

Output:
PS C:\Users\Vahit> Get-WmiObject Win32_BIOS | Format-List [a-z]*


Status                : OK
Name                  : Default System BIOS
Caption               : Default System BIOS
SMBIOSPresent         : True
BiosCharacteristics   : {4, 7, 9, 11...}
BIOSVersion           : {HPQOEM - 3}
BuildNumber           : 
CodeSet               : 
CurrentLanguage       : 
Description           : Default System BIOS
LanguageEdition       : 
ListOfLanguages       : 
Manufacturer          : Hewlett-Packard
OtherTargetOS         : 
PrimaryBIOS           : True
ReleaseDate           : 20091111000000.000000+000
SerialNumber          : CNF8275711
SMBIOSBIOSVersion     : F.38
SMBIOSMajorVersion    : 2
SMBIOSMinorVersion    : 4
SoftwareElementID     : Default System BIOS
SoftwareElementState  : 3
TargetOperatingSystem : 0
Version               : HPQOEM - 3
Scope                 : System.Management.ManagementScope
Path                  : \\K...X\root\cimv2:Win32_BIOS.Name="Default System BIOS",SoftwareElementID="Default System BIOS",SoftwareEleme
                        ntState=3,TargetOperatingSystem=0,Version="HPQOEM - 3"
Options               : System.Management.ObjectGetOptions
ClassPath             : \\K...X\root\cimv2:Win32_BIOS
Properties            : {BiosCharacteristics, BIOSVersion, BuildNumber, Caption...}
SystemProperties      : {__GENUS, __CLASS, __SUPERCLASS, __DYNASTY...}
Qualifiers            : {dynamic, Locale, provider, UUID}
Site                  : 
Container             : 


    PowerShell "-query" parametresi ile sorgu yapabiliriz. Belirlediğimiz bazı özellikleri sorgulayarak hızlı bir şekilde görüntüleyebiliriz. Aşağıdaki örnekte 'p' ile başlayan işlevleri ve dizinleri getiren sorguyu görebilirsiniz.


Get-WmiObject -query 'select caption,commandline from Win32_Process where name like "p%"' | 
Format-Table [a-z]* -wrap

"-query" örneği


     Her WMI nesnesinin (service) kendine özgü bir yolu vardır. Belirli bir nesneye doğrudan erişmek istiyorsak bu yol çok önemlidir. WMI nesnelerinin yolları "__Path property" bölümünde listelenmiştir. Buraya aşağıdaki şekilde ulaşabiliriz. Belirlediğimiz bir WMI nesnesinin durumunu aşağıdaki komutla görebiliriz.

    "__Path property" listesine ulaşmak için.


Get-WmiObject Win32_Service | ForEach-Object { $_.__PATH }

Output:
PS C:\Users\Vahit> Get-WmiObject Win32_Service | ForEach-Object { $_.__PATH }
\\K...X\root\cimv2:Win32_Service.Name="AdobeARMservice"
\\K...X\root\cimv2:Win32_Service.Name="AdobeFlashPlayerUpdateSvc"
\\K...X\root\cimv2:Win32_Service.Name="AeLookupSvc"
\\K...X\root\cimv2:Win32_Service.Name="AESTFilters"
\\K...X\root\cimv2:Win32_Service.Name="ALG"
\\K...X\root\cimv2:Win32_Service.Name="AMD External Events Utility"
\\K...X\root\cimv2:Win32_Service.Name="AppIDSvc"
\\K...X\root\cimv2:Win32_Service.Name="Appinfo"
\\K...X\root\cimv2:Win32_Service.Name="AppMgmt"
\\K...X\root\cimv2:Win32_Service.Name="aspnet_state"
\\K...X\root\cimv2:Win32_Service.Name="AudioEndpointBuilder"
\\K...X\root\cimv2:Win32_Service.Name="AudioSrv"
\\K...X\root\cimv2:Win32_Service.Name="AVP"
\\K...X\root\cimv2:Win32_Service.Name="AxInstSV"
\\K...X\root\cimv2:Win32_Service.Name="BDESVC"
\\K...X\root\cimv2:Win32_Service.Name="BFE"
\\K...X\root\cimv2:Win32_Service.Name="BITS"
\\K...X\root\cimv2:Win32_Service.Name="Browser"
......


    Belirli bir hizmetin durumuna bakmak için hizmetin isminden yararlanıyoruz. Aşağıdaki örneği inceleyebilirsiniz.


[wmi]"Win32_Service.Name='Browser'"

Output:
PS C:\Users\Vahit> [wmi]"Win32_Service.Name='Browser'"


ExitCode  : 0
Name      : Browser
ProcessId : 752
StartMode : Manual
State     : Running
Status    : OK


[wmi]"Win32_Service.Name='BITS'"

Output:
PS C:\Users\Vahit> [wmi]"Win32_Service.Name='BITS'"


ExitCode  : 0
Name      : BITS
ProcessId : 650
StartMode : Auto
State     : Running
Status    : OK


    Çoğu WMI nesneleri "read-only"(değişiklik yapılmaz) düzeyindedir. Fakat bazıları üzerinde değişiklikler yapabiliriz. Örneğin C sürücüsün ismini "VolumeName" değiştirelim.



PS C:\Users\Vahit> $drive = [wmi]"Win32_logicaldisk='C:'"
_____________________________________________________________________________________________ 
PS C:\Users\Vahit> [wmi]"Win32_logicaldisk='C:'"


DeviceID     : C:
DriveType    : 3
ProviderName : 
FreeSpace    : 25096294400
Size         : 151110283264
VolumeName   : 


_____________________________________________________________________________________________ 
PS C:\Users\Vahit> $drive.VolumeName = "MyHardDrive"
PS C:\Users\Vahit> $drive.Put()
_____________________________________________________________________________________________ 
PS C:\Users\Vahit> $drive


DeviceID     : C:
DriveType    : 3
ProviderName : 
FreeSpace    : 25096294400
Size         : 151110283264
VolumeName   : MyHardDrive

C sürücüsün ismi değişti


    Her WMI sınıfının bir tanımı vardır. Bu tanım ilk olarak görünmez haldedir. Bunu okunabilir hale getirebiliriz.


$class = [wmiclass]'Win32_LogicalDisk'
$class.psbase.Options.UseAmendedQualifiers = $true
($class.psbase.qualifiers["description"]).Value

Output:

The Win32_LogicalDisk class represents a data source that resolves to an actual local storage device on a Win32 system.
The class returns both local as well as mapped logical disks. However, the recommended approach is to use this class for obtaining infor
mation on local disks and to use the Win32_MappedLogicalDisk class for information on mapped logical disk.



    Son olarak sizlere ilgimi çeken bir konuyu anlatmak istiyorum. Windows PowerShell'de sisteminizin başlatıldığı (boot) tarihi ve o andaki tarihi bazı komutlar yardımıyla görüntüleyebilirsiniz. Hatta bilgisayarınızın ne kadar süredir çalıştığını gözlemleyebilirsiniz.

    Aşağıda sisteminizin ne zaman başlatıldığını ve anlık zamanı gösteren örneği inceleyebilirsiniz. Tarih formatının nasıl değiştirildiğini gözlemleyebilirsiniz.


Get-WmiObject win32_Operatingsystem | Format-List *time*

Output:
PS C:\Users\Vahit> Get-WmiObject win32_Operatingsystem | Format-List *time*


CurrentTimeZone : 180
LastBootUpTime  : 20130412033547.453437+180
LocalDateTime   : 20130414222406.659000+180


    Sisteminizin başlangıç tarihinin formatını değiştirebilirsiniz.

$boottime = (Get-WmiObject win32_Operatingsystem).LastBootUpTime
$boottime
$realtime = [System.Management.ManagementDateTimeConverter]::ToDateTime($boottime)
$realtime

Output:
#boottime
20130412033547.453437+180

#realtime
12 Nisan 2013 Cuma 03:35:47


    Sisteminizin o anki tarihinin formatını değiştirebilirsiniz.

$datetime = (Get-WmiObject win32_Operatingsystem).LocalDateTime
$datetime
$realtime2 = [System.Management.ManagementDateTimeConverter]::ToDateTime($datetime)
$realtime2

Output:

#datetime
20130414223430.639000+180

#realtime2
14 Nisan 2013 Pazar 22:34:30


    Sisteminizin ne kadar süredir çalıştığını gün, saat, dakika, saniye ve milisaniye cinsinden görmek için aşağıdaki komutu kullanabilirsiniz. Örneğin benim bilgisayarım an itibariyle 2 gün 19 saat 1 dakika 47 saniye 701 milisaniyedir çalışıyormuş. :)


New-TimeSpan $realtime (get-date)

Output:
PS C:\Users\Vahit> New-TimeSpan $realtime (get-date)



Days              : 2
Hours             : 19
Minutes           : 1
Seconds           : 47
Milliseconds      : 701
Ticks             : 2413077016934
TotalDays         : 2,79291321404398
TotalHours        : 67,0299171370555
TotalMinutes      : 4021,79502822333
TotalSeconds      : 241307,7016934
TotalMilliseconds : 241307701,6934



    Bugünlük anlatacaklarım bu kadar. Haftaya görüşmek üzere.


Referanslar:

Kitap: "Master-PowerShell with Dr. Tobias Weltner"

Hiç yorum yok:

Yorum Gönder