26 Mayıs 2013 Pazar

Windows PowerShell ile SQL Server 2012 (3. Bölüm)




    Merhaba arkadaşlar, geçen hafta sizlere Windows PowerShell ile SQL Server 2012'de bazı önemli veri tabanı işlemlerinden bahsetmiştim. Bugün sizlere Windows PowerShell ile ileri düzey (advanced) veri tabanı işlemlerinden bahsetmek istiyorum. Bu işlemlere örnek olarak "stored procedure", "trigger" ve "index"'i verebilirim. Bu işlemler veri tabanı tasarımında ve kullanımında geliştiriciye (developer) ve son kullanıcıya birçok kolaylık sağlamaktadırlar.


    Veri tabanına erişim esnasında veya veri tabanı üzerinde işlemler yaparken, sorguları tek bir satırda yapmamız gerekiyor. "Stored procedure", "function", "trigger" gibi teknikleri kullanarak bu zorluktan kurtulabiliriz. Kodları birer kod blokları içerisine yazmak bize birçok avantaj sağlar. Kod parçacıklarını tekrar tekrar kullanabilmemize ve hızlı bir şekilde sorgu yapmamıza olanak sağlar.


"Stored Procedure" Kullanımı


    İlk olrak "stored procedure"'ın ne olduğundan bahsetmek istiyorum. Veri tabanının "server" tarafında tutulan ve ilk derlemeden sonra bir daha derlemeye ihtiyaç duyulmayan SQL ifadeleridir. "Stored procedure"'ler parametreli ve parametresiz olarak çalışabildiği gibi geriye bir değer de döndürebilirler. [1]



    "Stored procedure"'ın SQL Server'da kullanımı aşağıdaki şekildedir. Aldığı parametre yardımıyla soyadı sizin belirlediğiniz bir değer olan ilk 10 öğrenciyi getirir.


CREATE PROCEDURE [dbo].[SISProc] @LastName [varchar]
(50)
WITH ENCRYPTION
AS
SELECT
TOP 10
StudendID,
LastName
FROM
Student.Student
WHERE
LastName = @LastName


    Bu örneği asıl konumuz olan Windows PowerShell ISE'de nasıl yapabiliriz? Aşağıdaki örneği inceleyebilirsiniz.


Import-Module SQLPS -DisableNameChecking

$instanceName = "KAZUYIX\SQLSERVER2012"
$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server -ArgumentList $instanceName

$dbName = "SIS"
$tableName = "Student"
$db = $server.Databases[$dbName]

$sprocName = "SISProc"
$sproc = $db.StoredProcedures[$sprocName]

#stored procedure varsa sil
if ($sproc){
    $sproc.Drop()
}

$sproc = New-Object -TypeName Microsoft.SqlServer.Management.SMO.StoredProcedure -ArgumentList $db, $sprocName
$sproc.TextMode = $false
$sproc.IsEncrypted = $true
$paramtype = [Microsoft.SqlServer.Management.SMO.Datatype]::VarChar(50);
$param = New-Object -TypeName Microsoft.SqlServer.Management.SMO.StoredProcedureParameter -ArgumentList $sproc,"@LastName",$paramtype
$sproc.Parameters.Add($param)

$sproc.TextBody = @"
SELECT
TOP 10
StudentID,
LastName
FROM
Studenr.Student
WHERE
LastName = @LastName
"@

$sproc.Create()




"Trigger" Kullanımı


    "Trigger" tetikleyici anlamına gelir ve programlarımızda belirli bir işlem gerçekleştiğinde programımızı tetiklemeye yarar veya tablolar arası veri bütünlüğünü korumak için kullanılırlar. Aslında "trigger" bir "stored procedure"'dır. Fakat kendiliğinden çalışırlar. "Trigger"'larda ya hep ya hiç mantığı vardır. Program zorlukla karşı karşıya kaldığında bütün işlem geri döner. "Trigger" tanımlarken "transaction" bloğu olması gerekir. [2]


    SQL Server'da "trigger" kullanımı aşağıdaki şekildedir. "Student" tablosuna eklenen ve tablodan silinen değerleri gösteren bir "trigger" örneğidir.


CREATE TRIGGER [Student].[triggerStudent]
ON [Student].[Student]
AFTER UPDATE
AS
SELECT
GETDATE() AS UpdatedOn,
SYSTEM_USER AS UpdatedBy,
i.LastName AS NewLastName,
i.FirstName AS NewFirstName,
d.LastName AS OldLastName,
d.FirstName AS OldFirstName
FROM
inserted i
INNER JOIN deleted d
ON i.StudentID = d.StudentID


    Bu işlem Windows PowerShell ISE'de nasıl yapılır onu göstermek istiyorum. Aşağıdaki örneği inceleyebilirsiniz.

Import-Module SQLPS -DisableNameChecking

$instanceName = "KAZUYIX\SQLSERVER2012"
$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server -ArgumentList $instanceName

$dbName = "SIS"
$tableName = "Student"
$db = $server.Databases[$dbName]

$tableName = "Student"
$schemaName = "dbo"

$table = $db.Tables | Where Schema -Like "$schemaName" | Where Name -Like "$tableName"
$triggerName = "tr_Student"
$trigger = $table.Triggers[$triggerName]

if ($trigger){
    $trigger.Drop()
}
$trigger = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Trigger -ArgumentList $table, $triggerName
$trigger.TextMode = $false

$trigger.Insert = $false
$trigger.Update = $true
$trigger.Delete = $false

$trigger.InsertOrder = [Microsoft.SqlServer.Management.SMO.Agent.ActivationOrder]::None
$trigger.ImplementationType = [Microsoft.SqlServer.Management.SMO.ImplementationType]::TransactSql

$trigger.TextBody = @"
SELECT
GETDATE() AS UpdatedOn,
SYSTEM_USER AS UpdatedBy,
i.LName AS NewLastName,
i.FName AS NewFirstName,
d.LName AS OldLastName,
d.FiName AS OldFirstName
FROM
inserted i
INNER JOIN deleted d
ON i.StudentID = d.StudentID
"@

$trigger.Create()




    Resimde gördüğünüz gibi Windows PowerShell'de oluşturduğumuz "trigger"'ın içerisindeki kodları SQL Server ekranında görebiliyoruz. Hatta bunun üzerinde güncellemeler yapabiliriz.

"Index" Kullanımı


    Veri tabanı üzerinde kayıt sayısı arttıkça çekilen sorguların döndüreceği değerlerin getirilmesi de o kadar zaman alacaktır. Verilere hızlı erişim için kullanılması gereken yöntem "index"'leme yöntemidir. SQL Server sorgusu çalıştırıldığında öncelikle "index"'leme var mı diye kontrol eder. Sorguyu bu duruma göre çalıştırır. Özellikle büyük veri tabanlarında kullanılması son kullanıcıya çok kolaylık sağlar.


    İki çeşit "index" vardır. Bunlar "Clustrered Index" ve "Non-Clustered Index"'dir. "Clustered Index", verilerin "index key" değerine göre fiziksel olarak alfabetik sıralandığı "index" türüdür. Bir tabloda en fazla bir tane bulunur. "Non-Clustered Index" mimarisinde fiziksel bir sıralama söz konusu değildir. "Index" değeri verinin kendisi değil "pointer" değeridir. Bu "pointer" değeri verinin nerede olduğunu gösterir. [3]


    SQL Server'da "index" kullanımı aşağıdaki şekildedir.


CREATE NONCLUSTERED INDEX [idxNLameFName]
ON [Person].[Person]
(
[LName] ASC,
[FName] ASC
)
INCLUDE ( [MiddleName])
GO


    Aynı örneğin Windows PowerShell'de kullanımı aşağıdaki şekildedir.

Import-Module SQLPS -DisableNameChecking

$instanceName = "KAZUYIX\SQLSERVER2012"
$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server -ArgumentList $instanceName

$dbName = "SIS"
$tableName = "Student"
$db = $server.Databases[$dbName]

$tableName = "Student"
$schemaName = "dbo"

$table = $db.Tables | Where Schema -Like "$schemaName" | Where Name -Like "$tableName"

$indexName = "idxLNameFName"
$index = $table.Indexes[$indexName]

if ($index){
$index.Drop()
}
$index = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Index -ArgumentList $table, $indexName

$idxCol1 = New-Object -TypeName Microsoft.SqlServer.Management.SMO.IndexedColumn -ArgumentList $index, "LName", $false
$index.IndexedColumns.Add($idxCol1)

$idxCol2 = New-Object -TypeName Microsoft.SqlServer.Management.SMO.IndexedColumn -ArgumentList $index, "FName", $false
$index.IndexedColumns.Add($idxCol2)

$inclCol1 = New-Object -TypeName Microsoft.SqlServer.Management.SMO.IndexedColumn -ArgumentList $index, "MiddleName"
$inclCol1.IsIncluded = $true
$index.IndexedColumns.Add($inclCol1)
$index.IndexKeyType = [Microsoft.SqlServer.Management.SMO.IndexKeyType]::None
$index.IsClustered = $false
$index.FillFactor = 70

$index.Create()




    Windows PowerShell hakkında anlatacaklarım bu kadar. İlerleyen zamanlar farklı bir konuyla sizlerle yeniden buluşmak dileğiyle, hoşçakalın...


Referanslar:

Kitap: "SQL Server 2012 with PowerShell V3 Cookbook"
[1]http://www.datawarehouse.gen.tr/Makale.aspx?ID=528
[2]http://www.serdardemir.net/sql-trigger-nedir-resimli-anlatim.html
[3]http://www.yazilimciblog.com/sql-index-yapilari/

12 Mayıs 2013 Pazar

Windows PowerShell ile SQL Server 2012 (2. Bölüm)




    Merhaba arkadaşlar, geçen hafta Windows PowerShell ile SQL Server 2012 konusuna giriş yapmıştım. Bugün yine aynı konudan devam edeceğim. Bazı önemli veri tabanı işlemlerinden ve bu işlemlerin Windows PowerShell ile nasıl kontrol edildiğinden bahsedeceğim.


    İlk olarak temel veri tabanı işlemlerini Windows PowerShell'den nasıl yapacağımızı anlatmak istiyorum. Bu işlemler veri tabanı oluşturma, tablo ekleme, tablo silme ve veri tabanını silme gibi temel işlemlerdir.


Veri Tabanı Oluşturma


    Öncelikle SQLPS modülünü yüklüyoruz (import). Daha sonra veri tabanı ile bağlantıyı sağlamak için SQL Server SMO nesnesi yaratıyoruz.


Import-Module SQLPS -DisableNameChecking

$instanceName = "KAZUYIX\SQLSERVER2012"
$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server
 -ArgumentList $instanceName

    Çıktısı aşağıdaki gibi olursa sorun yok demektir.

PS SQLSERVER:\> Import-Module SQLPS -DisableNameChecking

$instanceName = "KAZUYIX\SQLSERVER2012"
$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server -ArgumentList $instanceName
VERBOSE: Importing cmdlet 'Add-SqlAvailabilityDatabase'.
VERBOSE: Importing cmdlet 'Add-SqlAvailabilityGroupListenerStaticIp'.
VERBOSE: Importing cmdlet 'Backup-SqlDatabase'.
VERBOSE: Importing cmdlet 'Convert-UrnToPath'.
VERBOSE: The 'Decode-SqlName' command in the SQLPS' module was imported, but because its name does not include
 an approved verb, it might be difficult to find. For a list of approved verbs, type Get-Verb.
VERBOSE: Importing cmdlet 'Decode-SqlName'.
VERBOSE: Importing cmdlet 'Disable-SqlAlwaysOn'.
VERBOSE: Importing cmdlet 'Enable-SqlAlwaysOn'.
VERBOSE: The 'Encode-SqlName' command in the SQLPS' module was imported, but because its name does not include
 an approved verb, it might be difficult to find. For a list of approved verbs, type Get-Verb.
VERBOSE: Importing cmdlet 'Encode-SqlName'.
VERBOSE: Importing cmdlet 'Invoke-PolicyEvaluation'.
..............................

VERBOSE: Importing cmdlet 'Switch-SqlAvailabilityGroup'.
VERBOSE: Importing cmdlet 'Test-SqlAvailabilityGroup'.
VERBOSE: Importing cmdlet 'Test-SqlAvailabilityReplica'.
VERBOSE: Importing cmdlet 'Test-SqlDatabaseReplicaState'.
VERBOSE: Importing function 'SQLSERVER:'.
VERBOSE: Importing variable 'm'.


    Daha sonra aşağıdaki kodla veri tabanını oluşturuyoruz.


$dbName = "TestDB"
$db = New-Object Microsoft.SqlServer.Management.Smo.Database($server,$dbName)
$db.Create()

$server.Databases | Select Name, Status, Owner, CreateDate


Oluşturulan veri tabanı görüntüsü (PowerShell)

Oluşturulan veri tabanı görüntüsü (SQL Server)


Veri Tabanını Silme


    Veri tabanı oluşturmada yaptığımız gibi SQLPS modülünü yüklüyoruz. Ardından yeniden bağlantı sağlamak için SMO nesnesini yaratıyoruz ve veri tabanını silmek için gerekli kodları yazıp çalıştırıyoruz. Hata ile karşılaşmamak için sileceğimiz veri tabanının var olup olmadığını kontrol etmemiz gerekiyor. Aşağıdaki örneği inceleyebilirsiniz.


Import-Module SQLPS -DisableNameChecking

$instanceName = "KAZUYIX\SQLSERVER2012"
$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server 
-ArgumentList $instanceName

$dbName = "TestDB"

#veri tabanı var ise sil, yok ise hiçbişey yapma
$db = $server.Databases[$dbName]
if ($db)
{
    $server.KillDatabase($dbName)
}


Tablo Oluşturma


    Veri tabanı oluşturma ve silme işlemlerini göstermek için oluşturduğum "TestDB" veri tabanını sildiğim için tekrardan "SIS" adında bir veri tabanı oluşturdum. Tablo oluşturma ve diğer veri tabanı işlemleri için bu veri tabanını kullanacağım. Windows PowerShell'de yapacağımız her veri tabanı işlemlerinde SQLPS modülünü yüklememiz ve yeni bir SMO nesnesi yaratmamız gerekiyor.

    "Student" isminde bir tablo oluşturuyorum. Hata ile karşılaşmamak için tablonun var olup olmadığını kontrol etmemiz gerekiyor. Ardından oluşturacağımız tablonun her bir kolonunun özelliklerini yazıyoruz ve kod parçacığını çalıştırarak tabloyu oluşturuyoruz.


Import-Module SQLPS -DisableNameChecking

$instanceName = "KAZUYIX\SQLSERVER2012"
$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server -ArgumentList $instanceName

$dbName = "SIS"

$tableName = "Student"
$db = $server.Databases[$dbName]
$table = $db.Tables[$tableName]

#tablo var ise sil
if($table)
{
$table.Drop()
}

#istenilen tabloyu oluştur
$table = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Table -ArgumentList $db, $tableName

#column 1
$col1Name = "StudentID"
$type = [Microsoft.SqlServer.Management.SMO.DataType]::Int;
$col1 = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Column -ArgumentList $table, $col1Name, $type
$col1.Nullable = $false
$col1.Identity = $true
$col1.IdentitySeed = 1
$col1.IdentityIncrement = 1
$table.Columns.Add($col1)

#column 2 - İsim
$col2Name = "FName"
$type = [Microsoft.SqlServer.Management.SMO.DataType]::VarChar(50)
$col2 = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Column -ArgumentList $table, $col2Name, $type
$col2.Nullable = $true
$table.Columns.Add($col2)

#column 3 - Soyisim (default değeri var)
$col3Name = "LName"
$type = [Microsoft.SqlServer.Management.SMO.DataType]::VarChar(50)
$col3 = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Column -ArgumentList $table, $col3Name, $type
$col3.Nullable = $false
$col3.AddDefaultConstraint("DF_Student_LName").Text = "'Doe'"
$table.Columns.Add($col3)

#column 4 Yaş
$col4Name = "Age"
$type = [Microsoft.SqlServer.Management.SMO.DataType]::Int;
$col4 = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Column -ArgumentList $table, $col4Name, $type
$col4.Nullable = $true
$table.Columns.Add($col4)
$table.Create()


    Oluşturduğumuz bu tablonun "primary key"'i yoktur. "StudentId" kolonunu "primary key" yapmak için aşağıdaki kodu kullanabilirsiniz.


$PK=New-Object -TypeName Microsoft.SqlServer.Management.SMO.Index -ArgumentList $table, "PK_Student_StudentID"
$PK.IsClustered = $true
$PK.IndexKeyType = [Microsoft.SqlServer.Management.SMO.IndexKeyType]::DriPrimaryKey

#hangi kolonu primary key yapacağımızı belirtiyoruz
$PKcol = New-Object -TypeName Microsoft.SqlServer.Management.SMO.IndexedColumn -ArgumentList $PK, $col1Name
$PK.IndexedColumns.Add($PKcol)
$PK.Create()


Veri tabanı ve tabloların görüntüsü


"View" Oluşturma


    Soyadlarına göre sıralanmış ilk 10 öğrencinin listesini getiren bir "view" oluşturdum. Aşağıdaki örneği inceleyebilirsiniz.


Import-Module SQLPS -DisableNameChecking

$instanceName = "KAZUYIX\SQLSERVER2012"
$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server -ArgumentList $instanceName

$dbName = "SIS"
$db = $server.Databases[$dbName]
$viewName = "viewStudent"
$view = $db.Views[$viewName]

#varsa sil
if ($view)
{
    $view.Drop()
}
$view = New-Object -TypeName Microsoft.SqlServer.Management.SMO.View 
-ArgumentList $db, $viewName, "dbo"
$view.TextMode = $false
$view.TextBody = "SELECT TOP 10 StudentId, LName, FName 
FROM SIS.Student WHERE LName = 'IN' ORDER BY LName"
$view.Create()


Bu hafta anlatacaklarım bu kadar. Haftaya görüşürüz.


Referanslar:

Kitap: "SQL Server 2012 with PowerShell V3 Cookbook"

5 Mayıs 2013 Pazar

Windows PowerShell ile SQL Server 2012




    Merhaba arkadaşlar, geçen hafta sizlere Windows PowerShell ile uzaktan kontrol konusunu anlatmıştım. Bu hafta sizlere Windows PowerShell ile SQL Server 2012'yi anlatacağım. Aşağıdaki adresten SQL Server 2012 hakkında bilgi edinebilirsiniz.

http://www.microsoft.com/turkiye/basinodasi/2012/pr03023012.aspx


    Daha önceki yazılarımı ve örneklerimi Windows PowerShell 2.0 hakkında yapmıştım. Bundan sonra anlatacağım konular ve örnekler PowerShell 3.0 üzerinde olacaktır. Bunun nedeni ise Windows PowerShell 3.0 ile gelen yenilikler ve SQL Server 2012'nin Windows PowerShell 3.0 ile daha kolay kontrol edilmesidir. Windows 8'de PowerShell 3.0, işletim sistemiyle birlikte sunulmaktadır. Windows 7 veya daha eski bir işletim sistemi kullanıyorsanız bilgisayarınıza Windows PowerShell 3.0'ı kurmanız gerekmektedir. Bunun için bilgisayarınızda Microsoft .NET Framework 4.0'ın yüklü olması gerekmektedir. Windows PowerShell 3.0'ı yüklemek için Windows Management Framework 3.0'ı (WMF) bilgisayarınıza kurmanız yeterli olacaktır.


    Microsoft .NET Framework 4.0'ı indirmek için aşağıdaki adresi kullanabilirsiniz.

http://www.microsoft.com/en-in/download/details.aspx?id=17851

    Windows Management Framework 3.0'ı indirmek için aşağıdaki adresi kullanabilirsiniz.

http://www.microsoft.com/en-in/download/details.aspx?id=34595

    SQL Server 2012'yi aşağıdaki adresten indirebilirsiniz.

http://www.microsoft.com/betaexperience/pd/SQL2012EvalCTA/enus/default.aspx

    SQL Server 2012 kurulumu detaylı anlatımı için aşağıdaki adresi kullanabilirsiniz.

http://www.teknolojioku.com/forum/Konu-SQL-Server-2012-Kurulumu-4719.html

 

    PowerShell üzerinden yazacağımız komutlarla SQL Server'a bağlanabilir ve SQL Server üzerinde yaptığımız çoğu işlemleri PowerShell ekranından gerçekleştirebiliriz. SQL Server komutlarını yüklemek ve SQL Server'a bağlanmak için aşağıdaki komutu kullanıyoruz.

Import-Module SQLPS




    Resimde de görüldüğü gibi Windows PowerShell ISE daha gelişmiş bir arayüze sahiptir. Yükleyeceğimiz modülleri sağ taraftaki arama çubuğundan arayarak bulabiliriz. Aynı zamanda komutların, parametrelerin ve diğer yazıların renkleri farklı olduğundan bunları birbirinden ayırt etmek çok daha kolay hale gelmiştir.


    SQL Server'ı yönetirken kullanacağınız komutları listelemek için aşağıdaki komutu kullanabilirsiniz.

Get-Command -Module "*SQL*" | Select CommandType, Name, ModuleName | Format-Table -AutoSize

Output:
PS SQLSERVER:\> Get-Command -Module "*SQL*" | Select CommandType, Name, ModuleName | Format-Table -AutoSize

CommandType Name                                     ModuleName  
----------- ----                                     ----------  
   Function SQLSERVER:                               SQLPS       
     Cmdlet Add-RoleMember                           SQLASCMDLETS
     Cmdlet Add-SqlAvailabilityDatabase              SQLPS       
     Cmdlet Add-SqlAvailabilityGroupListenerStaticIp SQLPS       
     Cmdlet Backup-ASDatabase                        SQLASCMDLETS
     Cmdlet Backup-SqlDatabase                       SQLPS       
     Cmdlet Convert-UrnToPath                        SQLPS       
     Cmdlet Decode-SqlName                           SQLPS       
     Cmdlet Disable-SqlAlwaysOn                      SQLPS       
     Cmdlet Enable-SqlAlwaysOn                       SQLPS       
     Cmdlet Encode-SqlName                           SQLPS       
     Cmdlet Invoke-ASCmd                             SQLASCMDLETS
     Cmdlet Invoke-PolicyEvaluation                  SQLPS       
     Cmdlet Invoke-ProcessCube                       SQLASCMDLETS
     Cmdlet Invoke-ProcessDimension                  SQLASCMDLETS
     Cmdlet Invoke-ProcessPartition                  SQLASCMDLETS
     Cmdlet Invoke-Sqlcmd                            SQLPS       
     Cmdlet Join-SqlAvailabilityGroup                SQLPS       
     Cmdlet Merge-Partition                          SQLASCMDLETS
     Cmdlet New-RestoreFolder                        SQLASCMDLETS
     Cmdlet New-RestoreLocation                      SQLASCMDLETS
     Cmdlet New-SqlAvailabilityGroup                 SQLPS       
     Cmdlet New-SqlAvailabilityGroupListener         SQLPS       
     Cmdlet New-SqlAvailabilityReplica               SQLPS       
     Cmdlet New-SqlHADREndpoint                      SQLPS       
     Cmdlet Remove-RoleMember                        SQLASCMDLETS
     Cmdlet Remove-SqlAvailabilityDatabase           SQLPS       
     Cmdlet Remove-SqlAvailabilityGroup              SQLPS       
     Cmdlet Remove-SqlAvailabilityReplica            SQLPS       
     Cmdlet Restore-ASDatabase                       SQLASCMDLETS
     Cmdlet Restore-SqlDatabase                      SQLPS       
     Cmdlet Resume-SqlAvailabilityDatabase           SQLPS       
     Cmdlet Set-SqlAvailabilityGroup                 SQLPS       
     Cmdlet Set-SqlAvailabilityGroupListener         SQLPS       
     Cmdlet Set-SqlAvailabilityReplica               SQLPS       
     Cmdlet Set-SqlHADREndpoint                      SQLPS       
     Cmdlet Suspend-SqlAvailabilityDatabase          SQLPS       
     Cmdlet Switch-SqlAvailabilityGroup              SQLPS       
     Cmdlet Test-SqlAvailabilityGroup                SQLPS       
     Cmdlet Test-SqlAvailabilityReplica              SQLPS       
     Cmdlet Test-SqlDatabaseReplicaState             SQLPS       


Windows PowerShell ile SQL Server'da "Instance" Oluşturmak


    "Windows authentication" kullanarak bir "instance" oluşturmayı adım adım göstermek istiyorum.

  1. İlk olarak SQL komutlarını "import" ediyoruz.

  2. Import-Module SQLPS -DisableNameChecking

  3. Daha sonra "instance" ismini bir değişkene atıyoruz.

  4. $instanceName = "Vahit"
    

  5. SQL Server "instance"'ı aşağıdaki komutla kuruyoruz.

  6. $server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server -ArgumentList $instanceName
    

  7. "Login" esnasındaki isim ve şifre sorunlarından kurtulmak için bazı ayarlar yapıyoruz. Bilgisayar adı ve alan adı (domain) arasındaki "\\" (backslash") işaretinden kurtuluyoruz.

  8. Yapacağımız bağlantıda şifre olmasını istemiyorsak bunun da ayarını yapıyoruz.

  9. $server.ConnectionContext.set_LoginSecure($false)
    

    $credentials = Get-Credential
    

    $login = $credentials.UserName -replace("\\","")
    

    $server.ConnectionContext.set_Login($login)
    

    $server.ConnectionContext.set_SecurePassword($credentials.Password)
    

  10. Son olarak "connection string"'i kontrol ediyoruz.

  11. $server.ConnectionContext.ConnectionString
    

    Output:
    server='Vahit';uid='Vahit';password='';Application Name='SQL Management';
    multipleactiveresultsets=false
    

    Write-Verbose "Connected to $($server.Name)"
    Write-Verbose "Logged in as $($server.ConnectionContext.TrueLogin)"
    



    Bu haftalık kurulumlar ve bir kaç örnek üzerinde durdum. Haftaya ayrıntılı olarak Windows PowerShell ile SQL Server kullanımını anlatacağım.


    Haftaya görüşmek üzere, hoşçakalın.


Referanslar:

Kitap: "SQL Server 2012 with PowerShell V3 Cookbook"
http://www.microsoft.com/turkiye/basinodasi/2012/pr03023012.aspx
http://www.microsoft.com/betaexperience/pd/SQL2012EvalCTA/enus/default.aspx
http://www.microsoft.com/en-in/download/details.aspx?id=17851
http://www.microsoft.com/en-in/download/details.aspx?id=34595
http://www.teknolojioku.com/forum/Konu-SQL-Server-2012-Kurulumu-4719.html

28 Nisan 2013 Pazar

Windows PowerShell ile Uzaktan Kontrol




    Merhaba arkadaşlar, geçen hafta sizlere Windows PowerShell ile dosyalar, kayıtlar ve değişkenlerle çalışmayı anlatmıştım. Bugün sizlere Windows PowerShell ile uzaktan kontrol konusundan bahsedeceğim.


    Windows PowerShell ile sadece çalıştığınız bilgisayarı değil, aynı zamanda uzaktaki bir bilgisayarınızı da yönetebilirsiniz. Bunun için bilgisayarınızda Window PowerShell ile birlikte "Windows Remote Management" (WinRM) da yüklü olması gerekir. Windows 7 ve sonraki işletim sistemlerinde bu iki program işletim sisteminin içerisinde bulunmaktalar. Windows 7'den önceki işletim sistemlerinden birini kullanıyorsanız Windows PowerShell ve WinRM'yi yüklemeniz gerekmektedir.


    İlk olarak Windows PowerShell ile uzaktan kontrolün çalışma mantığından bahsetmek istiyorum. Uzaktaki bilgisayarla kullandığımız bilgisayar arasında bağlantı kuruyoruz. Daha sonra bilgisayarımızda komutu yazıyoruz. Bu komut ağ üzerinden uzaktaki bilgisayara iletilir. Komut daha sonra uzaktaki bilgisayarda çalıştırılır. Komut tamamlandığında sonuç XML formatına dönüştürülür ve bilgisayarımıza geri iletilir. Bilgisayarımız XML paketini alır ve tekrardanWindows PowerShell nesnesine dönüştürür.


   Uzaktan kontrol için anahtar kelimemiz "-ComputerName" parametresidir. Bu parametre ile kullanılan komutları görmek için aşağıdaki komutu kullanabilirsiniz. Bu sayede uzaktan kontrolde kullanacağımız komutları ve bu komutların açıklamalarını görebilirsiniz.


Get-Help * -Parameter ComputerName

Output:
PS C:\Windows\system32> Get-Help * -Parameter ComputerName

Name                              Category  Synopsis                                   
----                              --------  --------                                   
Get-WinEvent                      Cmdlet    Gets events from event logs and event tr...
Get-Counter                       Cmdlet    Gets performance counter data from local...
Test-WSMan                        Cmdlet    Tests whether the WinRM service is runni...
Invoke-WSManAction                Cmdlet    Invokes an action on the object that is ...
Connect-WSMan                     Cmdlet    Connects to the WinRM service on a remot...
Disconnect-WSMan                  Cmdlet    Disconnects the client from the WinRM se...
Get-WSManInstance                 Cmdlet    Displays management information for a re...
Set-WSManInstance                 Cmdlet    Modifies the management information that...
Remove-WSManInstance              Cmdlet    Deletes a management resource instance.    
New-WSManInstance                 Cmdlet    Creates a new instance of a management r...
Invoke-Command                    Cmdlet    Runs commands on local and remote comput...
New-PSSession                     Cmdlet    Creates a persistent connection to a loc...
Get-PSSession                     Cmdlet    Gets the Windows PowerShell sessions (PS...
Remove-PSSession                  Cmdlet    Closes one or more Windows PowerShell se...
Receive-Job                       Cmdlet    Gets the results of the Windows PowerShe...
Enter-PSSession                   Cmdlet    Starts an interactive session with a rem...
Get-EventLog                      Cmdlet    Gets the events in an event log, or a li...
Clear-EventLog                    Cmdlet    Deletes all entries from specified event...
Write-EventLog                    Cmdlet    Writes an event to an event log.           
Limit-EventLog                    Cmdlet    Sets the event log properties that limit...
Show-EventLog                     Cmdlet    Displays the event logs of the local or ...
New-EventLog                      Cmdlet    Creates a new event log and a new event ...
Remove-EventLog                   Cmdlet    Deletes an event log or unregisters an e...
Get-WmiObject                     Cmdlet    Gets instances of Windows Management Ins...
Invoke-WmiMethod                  Cmdlet    Calls Windows Management Instrumentation...
Get-Process                       Cmdlet    Gets the processes that are running on t...
Remove-WmiObject                  Cmdlet    Deletes an instance of an existing Windo...
Register-WmiEvent                 Cmdlet    Subscribes to a Windows Management Instr...
Get-Service                       Cmdlet    Gets the services on a local or remote c...
Set-Service                       Cmdlet    Starts, stops, and suspends a service, a...
Set-WmiInstance                   Cmdlet    Creates or updates an instance of an exi...
Get-HotFix                        Cmdlet    Gets the hotfixes that have been applied...
Test-Connection                   Cmdlet    Sends ICMP echo request packets ("pings"...
Restart-Computer                  Cmdlet    Restarts ("reboots") the operating syste...
Stop-Computer                     Cmdlet    Stops (shuts down) local and remote comp...


    Uzaktaki bir bilgisayarda çalışan servisleri görüntülemek için "Get-Service" komutunu, parametre olarak "-ComputerName" ve bilgisayar ismini yazmamız yeterli olacaktır.


Get-Service –ComputerName KAZUYIX

Output:


    Çıktıda uzaktaki bilgisayarın adını da görüntülemek istersek aşağıdaki komutu kullanabiliriz.


Get-Service –ComputerName KAZUYIX | Select-Object DisplayName, MachineName

Output:


Geçici Bağlantı Kurma


    Geçici bağlantıyı sadece bir komutu çalıştırmak için kullanırız. "Invoke-Command" komutunu kullanarak istediğimiz herhangi bir komutu uzaktaki bir bilgisayarda çalıştırabiliriz. Uzaktaki bilgisayarın adını belirtmek için yine "-ComputerName" parametresini kullanıyoruz. Daha sonra çalıştıracağımız komutu "-ScriptBlock" parametresini kullanarak küme parantezi içerisine yazıyoruz. Aşağıdaki örneği inceleyebilirsiniz.


Invoke-Command -ComputerName KAZUYIX -ScriptBlock {Get-PSDrive}

Output:
PS C:\Windows\system32> Invoke-Command -ComputerName KAZUYIX -ScriptBlock {Get-PSDrive}

WARNING: 2 columns do not fit into the display and were removed.

Name           Used (GB)     Free (GB) Provider      Root                              
----           ---------     --------- --------      ----                              
Alias                                                                                  
C                 119,55         21,18               C:\                               
cert                                                 \                                 
D                   3,43          4,78               D:\                               
E                                                    E:\                               
Env                                                                                    
F                                                    F:\                               
Function                                                                               
HKCU                                                 HKEY_CURRENT_USER                 
HKLM                                                 HKEY_LOCAL_MACHINE                
Variable                                                                               
WSMan                                                                                  



    Birden fazla bilgisayarda işlem yapmak için "-ComputerName" parametresinden sonra bilgisayar isimlerini aralarına virgül koyarak çalıştırabilirsiniz. Küme parantezi içerisine daha önce öğrendiğimiz Windows PowerShell komutlarından ve parametrelerden istediğinizi yazabilirsiniz.


Kalıcı Bağlantı Kurma


    Geçici bağlantı kurmak çoğu zaman verimli olmayabilir. Her bir komutu çalıştırmak için yeni bir bağlantı kurmak gerekiyor. Geçici bağlantıyı basit görevler için kullanabiliriz. Her seferinde "Invoke-Command" komutunu yazmaktansa uzaktaki bir bilgisayara bir kere bağlanıp, bağlantı açık olduğu sürece işlemlerimizi yapmak daha cazip ve pratiktir. Karmaşık işlemlerde kalıcı bağlantı kurmak gerekir. Bu yüzden uzaktaki bilgisayara yapılan bağlantılarda kalıcı bağlantı kurmanızı tavsiye ederim. 


    Uzaktaki bir bilgisayarda kalıcı bağlantı kurmak için öncelikle bir oturum (session) açmalıyız. Uzaktaki bilgisayarda oturum açmak için aşağıdaki komutu kullanabilirsiniz.


New-PSSession -ComputerName KAZUYIX 

Output:
_______________________________________________________________________________
PS C:\Windows\system32> New-PSSession -ComputerName KAZUYIX 

 Id Name            ComputerName    State    ConfigurationName     Availability
 -- ----            ------------    -----    -----------------     ------------
  1 Session1        kazuyix         Opened   Microsoft.PowerShell     Available


_______________________________________________________________________________


    Daha sonra bu açtığımız oturuma giriş yaparak uzaktaki bilgisayara bağlanmış oluruz. Aşağıdaki komutu kullanarak açmış olduğumuz oturuma giriş yapabiliriz. Artık oturumu kapatmadıkça uzaktaki bilgisayarımızda Windows PowerShell komutlarını kullanarak istediğimiz işlemleri yapabiliriz.


Enter-PSSession -ComputerName KAZUYIX

Output:
Parantez içindeki bilgisayar isminden uzaktaki bilgisayarda olduğumuzu görebiliriz.


$env:COMPUTERNAME

Output:
___________________________________________

[kazuyix]: PS C:\> $env:COMPUTERNAME
KAZUYIX
___________________________________________


    Uzaktaki bilgisayarla bağlantıyı sonlandırmak için "Remove-PSSession" komutunu kullanabiliriz. "Remove-PSSession" komutu parametre olarak oturumun numarasını (id) almaktadır. "Exit-PSSession" komutu ise bağlantıyı sonlandırmadan kendi bilgisayarımıza dönmemizi sağlar.


    Bu hafta anlatacaklarım bu kadar. Haftaya görüşürüz.


Referanslar:
Kitap: "The Windows PowerShell Owner's Manual: Version 2.0"

21 Nisan 2013 Pazar

Windows PowerShell: Dosyalar, Kayıtlar ve Değişkenlerle Çalışma



    Merhaba arkadaşlar, geçen hafta Windows PowerShell ile işletim sistemi yönetimini anlatmıştım. Bu hafta sizlere dosyalar, kayıtlar ve değişkenlerle çalışmayı anlatacağım. Dosya sisteminin "Unix Shell" ve "cmd" ekranında olduğu gibi Windows PowerShell'de önemi büyüktür. Aşağıda anlatacağım konularla sürücüler, dizin ve kayıt defteriyle çalışmayı gözlemleyebilir, yapacağınız bazı temel seviyede örneklerle bunları uygulayabilirsiniz.


    En önemli dosya sistemi komutlarını ve açıklamalarını aşağıdaki tabloda görebilirsiniz.


Komut
Açıklaması
Kısaltması
Add-Content
Bir dosyanın içeriğini ekler.

ac
Clear-Host
Konsol penceresini temizler

cls, clear
Clear-Item
Dosyanın içeriğini siler.

cli
Copy-Item
Dosya veya klasörü kopyalar.
copy, cp, cpi
Get-ChildItem
Klasör içeriğini listeler

dir, ls, gci
Get-Content
Text tipindeki dosyaların içeriğini görüntüler.
type, cat, gc
Get-Item
Özel dosya ve klasörlere erişim sağlar.
gi
Get-ItemProperty
Dosya ve Klasörlerin özelliklerini görüntüler.
gp
Move-Item
Dosya ve klasörleri taşır.

move, mv, mi
New-Item
Yeni dosya veya klasör yaratır.
ni
Remove-Item
Dosya veya klasörü siler

ri, rm, rmdir, del, erase, rd
Rename-Item
Dosya veya klasör ismini değiştirir.
rni, ren,
Set-Location
Belirtilen dizini değiştirir.

cd, chdir, sl


    Bir klasörün içeriğini görüntülemek için Get-ChildItem kullanılır. Get-ChildItem aşağıdaki bazı önemli görevleri yerine getirir.

  • Dizin içeriğini görünür hale getirir.
  • Bazı dosyaları, dosya sistemi üzerinden hızlı bir şekilde arar ve bulur.
  • Dosya veya klasörleri getirir.


Get-ChildItem


    Bulunduğunuz klasördeki belirli dosyaları görüntülemek istiyorsanız "Dir *.txt" komutunu kullanabilirsiniz. Örneğin ben "Courses" klasöründeki "pdf" uzantılı dosyaları görüntülemek istiyorum.

Dir *.pdf


    Get-Location komutunu kullanarak o anda bulunduğunuz klasörün yolunu (path) görebilirsiniz.

Get-Location

Özel Dosya ve Klasörleri Bulma 



    Windows, yüklediğiniz programların verilerini, geçici dosyalarını veya yükleme dosyalarını farklı farklı yerlere kaydeder. Bazı dosyalar önemlidir, bazıları ise önemsizdir. Bu önemsiz dosyaları bulup elle silebilirsiniz. Bu dosyalara ulaşmak için "$env: ?"  komutunu kullanırız. Aşağıdaki tabloda ulaşacağımız klasör tiplerini ve kullanılan komutları görebilirsiniz.


Özel Klasör
Açıklaması
Klasör ulaşmak için komut
Application data
Uygulama verilerinin tutulduğu klasör.
$env:localappdata
User Profile
Kullanıcı özel klasörü

$env:userprofile
Data used  in common
Kullanılan bütün programların verilerinin tutulduğu klasör
$env:commonprogramfiles
Public Directory
Bütün kullanıcılar için ortak klasör

$env:public
Program Directory
Bilgisayar kurulan programların dosyaları.
$env:programfiles
Roaming Profiles
Roaming profili için uygulama verilerinin olduğu yer.
$env:appdata
Temporary Files (private)
Kullanıcı geçici dosyaları

$env:tmp
Temporary Files
Windows geçici dosyaları

$env:temp
Windows Directory
Windows‘un kurulduğu klasör.

$env:windir


    Örnekleri ve çıktılarını aşağıda görebilirsiniz.



Dosya ve Klasörlerle Çalışma



    Yeni bir dosya veya klasör oluşturmak için New-Item komutunu kullanabiliriz. "Type" parametresini de kullanarak dosya mı yoksa klasör mü oluşturacağımızı belirtiyoruz.




    Bir dosyanın içeriğini görüntülemek için Get-Content komutunu kullanıyoruz. Örneğin Windows güncelleme günlükleri görüntülemek istersek aşağıdaki komutu kullanabiliriz. Bu günlükler biraz uzun olduğundan ilk 25 tanesini göstermem yeterli olacaktır.


PS C:\Users\Vahit> Get-Content $env:windir\windowsupdate.log | Select-Object -First 25


Output:

 
    Dosya veya klasörleri bir dizinden başka bir dizine taşımak için Move-Item komutunu, kopyalamak için ise Copy-Item komutunu kullanmalıyız. İki komut aynı mantıkla çalışır. İki tane parametre alırlar. İlk parametrede taşıyacağımız dosya bulunmalıdır. İkinci parametrede ise dosyanın taşınacağı dizin bulunmalıdır.


                 1.parametre        2.parametre
Move-Item  user.txt  C:\Users\Vahit\Courses



    Bir dosyanın ismini değiştirmek için Rename-Item komutunu kullanmalıyız. Burada da komut iki tane parametre almaktadır. İlk parametre değiştirmek istediğimiz dosyanın ismi, ikinci parametre ise yeni isimdir.


                         1.parametre    2. parametre
Rename-Item  .\user.csv  .\user.txt



    Bir dosyayı ya da klasörü silmek için Remove-Item komutunu kullanmalıyız. Dikkat edilmesi gereken bir komuttur. Çünkü sildiği dosyayı geri dönüşüme göndermeden bilgisayardan tamamen siliyor!

Remove-Item user.txt



Kayıt Defteri (Registry)



    Kayıt defteri neredeyse tüm merkezi Windows ayarlarının tutulduğu yerdir. Bu yüzden farklı bir yapıyla (ağaç yapısı) düzenlenmiştir. Çok önemli ayarları içinde barındırmaktadır. Kayıt defterinde çalışırken çok dikkatli olmak gerekir. Burada yapılacak herhangi bir hata sisteminizin bozulmasına hatta çökmesine neden olabilir.

    Kayıt defteri hakkında ayrıntılı bilgileri aşağıdaki linkten edinebilirsiniz.



    Dosya sisteminde kullandığımız tüm PowerShell komutları kayıt defterinde de kullanılırlar. Örneğin bir anahtar (key) ve değer (value) oluşturmak için New-Item komutu kullanılır. Silmek için ise Remove-Item komutunu kullanılır.


New-Item -type Directory HKCU:\Software\Test1


Output:
PS C:\Users\Vahit> New-Item -type Directory HKCU:\Software\Test1


    Hive: HKEY_CURRENT_USER\Software


SKC  VC Name                           Property                                                                                         
---  -- ----                           --------                                                                                         
  0   0 Test1                          {}                                                                                             


New-Item -itemType String HKCU:\Software\Test3 -value "A default value"


Output:
PS C:\Users\Vahit> New-Item -itemType String HKCU:\Software\Test3 -value "A default value"


    Hive: HKEY_CURRENT_USER\Software


SKC  VC Name                           Property                                        
---  -- ----                           --------                                        
  0   1 Test3                          {(default)}                                     





    Aşağıdaki komutlarla bu kayıtları kayıt defterinden silebilirsiniz.

Remove-Item HKCU:\Software\Test1
Del HKCU:\Software\Test2
Del HKCU:\Software\Test3


    Bu eklediğimiz kayıtlara yeni anahtarlar ve değerler ekleyebilir, değiştirebilir ve silebiliriz. Kayıt defteri üzerinde çok fazla durmak istemiyorum. Bu konuda daha ayrıntılı bilgi almak isteyenler verdiğim referansları inceleyebilirler.


    Bu hafta anlatacaklarım bu kadar. Haftaya görüşürüz.



Referanslar:

Kitap: "Master-PowerShell with Dr. Tobias Weltner"
http://technet.microsoft.com/tr-tr/library/cc776231(v=ws.10).aspx


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"