1. Anasayfa
  2. Server 2008

Sistem Uzmanları için Scripting (Kod Parçacıkları) – Bölüm 1


5

Web programcıları için yayınlanmış binlerce ASP kaynağında yer alan web programlamaya yönelik VBScript dili anlatımı var olmasına rağmen Sitem Yönetimi amacı ile bu dilin kullanıma yönelik kaynaklar oldukça sınırlıdır. Özellikle Türkçe kaynak daha da sınırlı görünüyor. Bende bu konuda en basit kavramlardan başlayıp Sistem Yönetimi konusunda uygulamalara doğru giden bir dizi yazı yazmaya karar verdim.

İlk önce temel VBScript kavramlarından dilin yapısından kullanımından bahsedeceğim. Arkasından sırasıyla File System, WMI, WMI sorgulama, AD ve ADSI, scriptlerini inceleyerek tamamlayacağım.

İlk bölümleri temel VBScript bilgilerine sahipseniz atlayabilir ve sistem yönetimi ile ilgili bölümlere geçebilirsiniz.

Bu arada bazı teknik terimler için bundan böyle Türkçe karşılıklarını kullanarak yazıya devam edeceğim. Örnek olarak “Script” yerine “Betik” kullanacağım. Bu konuda sorularınız ve/veya önerileriniz olursa okumaktan ve cevaplamaktan memnuniyet duyarım.

Sistem yöneticisi olarak neden VBScript Betikleri kullanmalıyım?

Aslında kullanmak zorunda değilsiniz…

Kullanmak zorunda olmasak da kullanmak için bazı iyi nedenlerimiz olduğunu söylemeliyim. Herhangi bir yönetici zamanının beşte birini rutin görevlerle beşte birini acil durumlarla kalan beşte üçünü ileride oluşabilecek ihtiyaçlar ve acil durumlar için önlem alarak geçiriyor ise başarısı neredeyse garantidir.

Ancak Bilişim alanında çalışan bizler genelde bir acil durumdan başka bir acil duruma koşar bunun dışındaki zamanlarımızı rutin sayılabilecek yedekleme ve çalışan sistemleri sorunlara karşı denetleme gibi işlerle geçiririz. Bu bize tasarım ve acil durum oluşmasını engelleyici önlemleri almak için zaman bırakmaz ve biz acil durumlara koşmaya devam ederiz. Bu kısır döngüyü kırmak için birçok yönetim aracı mevcuttur. Ancak bazı zamanlarda elimizde bu araçlar olmayabilir, örneğin bütçemizde yeterli kaynak olmadığında. VBScript ücretsiz, hemen hemen her durum için çözüm örnekleri bol ve notepad gibi bir araç yardımı ile tamamen özelleştirilebilir.

Ayrıca VBScript yerine neden PS (PowerShell) veya diğer bir betik dili kullanmayalım. Aslında bununda cevabı kullanmanın mümkün olduğudur. Bununla beraber PowerShell her bilgisayarda yüklü gelmez. Hatta PowerShell için temel olan .Net bileşenleri de yüklü olmayabilir. Diğer betik dillerini çalıştırmak için runtime environment (Çalışma zamanı bileşenleri) daha önceden yüklü olmalıdır. VBScript kullanıyorsanız WSH’ın Windows 2000’den bu yana çıkan bütün Windows işletim sistemlerinde yüklü olduğuna güvenebilirsiniz.

Neden VBScript sorusuna yanıtlarımı kısaca özetlersek:

  1. Yinelen işler için otomatikleştirilmiş yöntemler sağlar. Zaman kazandırır.
  2. Uzaktan yapılması gereken bir dizi işlemi yapmanıza olanak verir.
  3. Hemen her Windows işletim sistemine sahip bilgisayarda ön hazırlık gerekmeksizin çalıştırmak mümkündür.

Bu kadar gevezelik yeter…

VBScript Temelleri

İlk Betiğimizi Yazalım

Birçok programlama dilinde öğrenim kitapları “Hello Word” uygulaması ile başlar. Bu bana biraz saçma gelir. Biz işimize yarayacak bir örnekle başlayalım.

‘Üstbilgi

Option Explicit

On Error Resume Next

Dim objShell

Dim regActiveComputerName, regComputerName, regHostname

Dim ActiveComputerName, Computername, Hostname

‘Başvuru bilgileri

regActiveComputerName = “HKLM\SYSTEM\CurrentControlSet\Control\” &_

“ComputerName\ActiveComputerName\ComputerName”

regComputerName = “HKLM\SYSTEM\CurrentControlSet\Control\” &_

“ComputerName\ComputerName”

regHostname = “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\” &_

“services\Tcpip\Parameters\Hostname”

‘İşleyiş Bilgileri

Set objShell = CreateObject(“WScript.Shell”)

ActiveComputerName = objShell.RegRead(regActiveComputerName)

ComputerName = objShell.RegRead(regComputerName)

Hostname = objShell.RegRead(regHostname)

‘Çıktı

WScript.Echo ActiveComputerName & ” Etkin Bilgisayar adıdır”

WScript.Echo ComputerName & ” Bilgisayar adıdır”

WScript.Echo Hostname & ” Ağda görünen adıdır”

Herhangi bir betik dilini öğrenmenin en iyi yöntemi betikleri okumaktır. O zaman bu sayfayı birlikte okuyalım.

Üstten tek ayraç  ‘ özel bir karakterdir ve anlamı “Bu işaretten sonra gelen bölüm betiğin bir parçası değil” demektir. Açıklamalar için kullanılır. Sizin de fark etmiş olabileceğiniz gibi betik içerisinde 4 adet açıklama bulunuyor. Bunları betiğin bölümlere ayrılmış yerlerini göstermekte kullandım.  Aslında VBScript böyle bir bölümlendirme ve/veya kısım içeren bir dil değil.

Peki, neden bölümlendirelim ya da herhangi bir açıklama koyalım? İlk başta da VBScript’e ihtiyaç duymamızın temelinde yatan şeyin zaman kazanmak olduğunu düşündüğümü hatırlarsanız bu konu da bununla ilgili. Her işlem için bir betik yazarsak sıkıcı olmaya başlar. Ayrıca birçok betik benzer işlemler yapmayı gerektirebilir.  Bu durumda bir betiği uygun değişikliklerle yeniden kullanılabilir durama getirmek veya başka bir betiğin bir parçasını içerisinde kullanmak isteyebilirim. Betik içerisindeki kısa bir belgeleme bu işi hızla yapmamı sağlayabilir. Bu sebeple betiğe bilgilendirici cümleler ilave ederek bölümlere ayırıyorum.

Üstbilgi bölümünü inceleyelim:

“Option Explicit” terimi betik üzerinde kullanacağımız değişkenleri kullanmadan önce bildireceğimizi ilan eder. Pek anlaşılır olmadı değil mi? Yine de izin verin devam edeyim.

“On Error Resume Next” oldukça kullanışlı bir ifadedir. Eğer betik öngörülmemiş bir hata ile karşılaşırsa “On Error” bir sonraki ile devam etmesi yönünde bir “Resume Next” emir verir. Peki, bir sonraki “ne” ile devam edecek? Betiği işleyen WSH (Windows Scripting Host) aynen bizim yaptığımız gibi bir satırdaki bilgiyi okur ne anlama geldiğini hesaplar sonraki satıra geçer.  Dolayısı ile bu ifadenin yer aldığı betiklerde hata oluşması durumunda bir sonraki satırdaki işleme geçilir. Bu komut betiği geliştirirken hataları görmenize engel olacaktır. Ancak geliştirme bittikten sonra kullanıcıların betikten haberdar olmasını istemediğiniz durumlarda kullanışlıdır.

“Dim regActiveComputerName, regComputerName, regHostname” Bu satırdaki anahtar kelime “Dim” şu anlama gelir. Birazdan kullanacağım değişkenlerin adlarını açıklayacağım. Sonrasında virgülle ayrılmış değerler şeklinde giriş yapılabilir. İsteğiniz kadar değişkeni bir arada tanımlayabilirsiniz. Değişkenlere istediğiniz ismi verebilirsiniz. Mesela a, b, c diyebilirdim ve bu beni bir sürü uzun kelime yazmaktan kurtarabilirdi. Ancak bu defa değişkenin hangi veriyi tuttuğunu hatırlamam zor olurdu. Bu sebeple değişkenlerinizi isimlendirirken tutacağı verinin içeriğinin isminden anlaşılabilir olmasını amaçladım.

Yukarıda tanımladığım “Option Explicit” Dim ile bildirilmeyen bir değişkenin kullanılmasını engeller. Şimdi biraz daha anlaşılır sanırım. Ama tam değil ayrıca açıklayacağım.

Başvuru bilgileri:

Burada yaptığımız iş oldukça basit.

regActiveComputerName = “HKLM\SYSTEM\CurrentControlSet\Control\”  & _ “ComputerName\ActiveComputerName\ComputerName”

Değişkene bir veri atıyoruz. Kısaca betik içerisinde regActiveComputerName yazmamla HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName\ComputerName yazmam arasında bundan sonra bir şey değişmeyecek. Bu arada &_ işaretleri ne anlama geliyor derseniz & Kendinden önce ve sonra gelen metinleri birleştirmeye yarar _ ise kodlamanın alt satırda devam ettiği bilgisini verir. Burada dikkat edilecek bir nokta değişkene atanan metin türü bilgilerin tırnak işaretleri içinde olması gerektiğidir.

İşleyiş Bilgileri:

Set objShell = CreateObject(“WScript.Shell”)

İşte şimdi işler biraz hız kazanıyor. Set VBScript içerisinde yer alan bir komuttur. Değişkene bir nesne ilişkisi (object reference) atanmasını sağlar. Object? Evet bu soruya daha sonra bakacağız. Kısaca burada yeni bir nesne yaratıyoruz (CreateObject). Bu nesne WScript.Shell bir kabuk. Windows üzerinde çalıştığımız için Windows kabuğu. Nedir şimdi bu soyulur mu yenir mi? Windows komut istemi CMD örnek olabilir. Yaptığımız şeyde aynen budur bir komut istemi kabuğu yaratmak. Bu nesne içerisinde CMD içerisinde çalıştırdığımız komutlara benzer komutlar çalıştırabiliriz.

ActiveComputerName = objShell.RegRead(regActiveComputerName)

WSH içerisinde RegRead adında bir yöntem (Method) bulunmaktadır ve bu metodu kullanacağız.

“WScript.Shell.RegRead (HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName\ComputerName)” yazarsak bu yöntem bize kayıt defteri içerisinden bu değeri okuyup getirecektir.

Dolayısı ile burada bu anahtar içerisindeki değeri ActiveComputerName değişkenine atadık.

Çıktı:

Şimdiye kadar bilgisayarın adını kayıt defterinden okuyup değişkenlere atadık. Bu bilginin bize yarar sağlaması için bu bilgiyi bir şekilde görmemiz gerekiyor.

WScript.Echo WScript yöntemlerinden biridir ve kendinden sonra gelen kısmın ekranda veya komut isteminde görünmesini sağlar.

Hadi deneyelim…

Bir komut istemi açarak aşağıdaki komutları sırası ile deneyin.

Cscript.exe c:\VBScrip\BilgisayarAdi.vbs

Dosyayı C içerisinde VBScript adlı bir klasörde BilgisayarAdi.vbs adında kaydettiğinizi varsayıyorum. Başka bir yere başka bir isimle vs kaydettiyseniz kendi dosya yolunuzu yamalısınız.

Birde bu komutu çalıştırın.

Wscript.exe c:\VBScrip\BilgisayarAdi.vbs

Herhalde numarayı anladınız. CScript.exe vbs dosyasını komut isteminde çalıştırır. WScript.exe ise Windows arabiriminde çıktılar üretir. J

Biraz Geri Dönelim

Üstbilgi kısmında yaptığımız her leyi silip dosyayı yeniden çalıştırdığımızda aynı sonuçları alabiliriz. İnanmayan denesin. Peki, o kadar satırı neden yazdık?

İlk önce Dim bildirimi ile başlayalım.

Dim a

Dim b

a = 5

b = 10

Wscript.Echo a + b

Yukarıdaki basit betik tahmin edilebileceği üzere 15 sonucunu üretir. Aşağıdaki betik de aynen bu sonucu üretir: 15.

a = 5

b = 10

Wscript.Echo a + b

Dim bildirimini kullandığımızda VBScript bellekte bildirilen değişken için bir yer ayırması gerektiğini bilir. Çünkü ileride bu değişkeni kullanacağız. Ancak bunun dışında bir işlem yapmaz. Dim zaman zaman gereklidir. Ancak olmasa da olur biraz önce gördüğümüz gibi.

Buna karşın aşağıdaki betik hata verecektir.

Option Explicit

a = 5

b =10

Wscript.Echo a + b

Tahmin edebileceğiniz gibi Option Explicit bildirimi buna sebep olmaktadır. Bu bildirim betiğe kullanılacak değişkenlerin önceden tanımlanacağını bildirmektedir.

BirinciSayi = 5

İkinciSayi = 10

Wscript.Echo BirinciSayi + İkinciSayı

Her şey düzgün görünüyor değil mi? Deneyin bakalım, 15 yerine 5 sonucunu verdiğini göreceksiniz. Neden? Çünkü dikkatli bakarsanız Toplama sırasında İkinciSayi yerine İkinciSayı yazdığımı fark edeceksiniz. Option Explicit kullanılmadığı için hata döndürmek yerine İkinciSayı olarak boş bir değişken kullandık ve bu sonucu elde ettik. Bu tip hatalar hata mesajlarından çok daha zor fark edilir.

Option Explicit

Dim BirinciSayi

Dim İkinciSayi

BirinciSayi = 5

İkinciSayi = 10

Wscript.Echo BirinciSayi + İkinciSayı

Eğer betiği bu şekilde kullanırsak İkinciSayı değişkeni daha önce bildirilmediği için hata oluşacaktır. Bu hatayı düzeltmek ve fark etmek çok daha kolaydır.

Hadi biraz daha derine dalalım:

Dim bildirisinin bir kullanıma da Genel Değişken (Global variable) tanımlanmasıdır. Genel Değişkende ne ola? Bir betik içerisinde genel yordamlar gibi alt yordamlarda olabilir. Ana programın içerisinde küçük işler yapan küçük programlar. Bir genel değişken bütün betik içerisinde hem ana yordam hem de alt yordamlar tarafından kullanılabilir.

a = 5

b = 10

ADegistir

Wscript.Echo a + b

Sub ADegistir

a = 10

End Sub

Bu betik 20 sonucunu üretecektir. Tahmin edeceğiniz üzere Adegistir alt yordamımızın ismi. Burada yaptığımız işlem a değişkenini toplama yapmadan önce bir alt yordam ile değiştirmek. Sonuçta buna uygun olarak 20 oldu. Bir de aşağıdaki betiğin sonucunu tahmin etmeyi deneyin.

b = 10

ADegistir

Wscript.Echo a + b

Sub ADegistir

a = 10

End Sub

Bu defa betik 20 yerine 10 sonucunu verecektir. Çünkü değişken sadece alt yordam içerisinde kullanılan bir değişkendir(Yerel Değişken). Betiğin genelinde tanımlı değildir. Bu durumda b 10 değerine sahipken betiğin genel yordamında a herhangi bir değere sahip olmamıştır.

Dim a

b = 10

ADegistir

Wscript.Echo a + b

Sub ADegistir

a = 10

End Sub

Burada yine 20 sonucunu elde ederiz. A değişkeni Dim ile genel yordam içerisinde belirlendiğinden alt yordamlar da bu değişkene atama yapabilir.

Dim a

a = 5

b = 10

ADegistir

Wscript.Echo a + b

Sub ADegistir

Dim a

a = 10

End Sub

Son bir tahmin oyunu daha oynarsak burada sonuç ne olur. A değişkeni Dim bildirimi ile genel yordam içerisinde belirtilmiş olmasına rağmen alt yordama has başka bir a değişkeni atanmış. Dolayısı ile sonuç yine 15 olacaktır. Alt yordamlarda Dim ile bildirilen değişkenler genel yordam içerisinde kullanılmaz. Bu sayede dim ile bütün betik içerisinde bir değişken bildirebileceği gibi alt yordamlar içerisinde özel olarak kullanılacak değişkenlerde bildirmenin mümkün olduğunu görüyoruz.

İlk betiğimizi yazdık ve Option Explicit ve Dim bildirimi ile ilgili yeterince şey öğrendiğimizi düşünüyorum.  Eğer konu hakkında sorularınız olursa lütfen yorum yazmaktan çekinmeyin.

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar

VBScript Step by Step

https://www.mshowto.org

Bu İçeriğe Tepkin Ne Oldu?
  • 2
    harika_
    Harika!!
  • 1
    be_enmedim
    Beğenmedim
  • 0
    _ok_iyi
    Çok iyi
  • 0
    sevdim_
    Sevdim!
  • 0
    bilemedim_
    Bilemedim!
  • 1
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

Kıdemli Altyapı Danışmanı.

Yazarın Profili

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Yorumlar (5)

  1. Bugüne değin okuduğum, incelediğim ve istinasız hepsinde bir eksik olarak gördüğüm yazılardaki öğrenen için önemli ancak yazan için önemsiz görülen detay açıklamalarına önemle yer vermişsiniz; teşekkürler. Bir “faydalı linkler” arşivim vardır, bu siteyi de dahil ettim içersine :)

  2. Ve örneği kullanacaklar için bir uyarı, ilk çalıştırmada göreceğiniz hataları, ‘ nın yerine ‘ ve “” nın yerine ” işaretine kullanarak aşabilirsiniz.

  3. 25/03/2015

    Beyler powershell’in uzantısı nedir?

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir