Windows Etkinleştirmede Yeni Dönem: slmgr.vbs'den PowerShell'e Geçiş

Windows Server ve Windows 11 altyapılarında güvenlik nedeniyle kaldırılan VBScript altyapısı sonrası, slmgr.vbs yerine PowerShell CIM/WMI nesneleriyle lisans ve KMS yönetimi.

Yıllardır Windows sistem yöneticilerinin lisans kontrolü, ürün anahtarı girme ve KMS sunucusu yapılandırma işlemlerinde ilk başvurduğu araç slmgr.vbs (Software Licensing Management Tool) betiği olmuştur. Ancak Microsoft'un siber güvenlik stratejileri kapsamında VBScript ve Windows Script Host (WSH) altyapısını aşamalı olarak işletim sistemlerinden kaldıracağını açıklaması, sistem yönetiminde yeni bir dönemi başlattı.

Kötü amaçlı yazılımların (malware/ransomware) en sık kullandığı saldırı vektörlerinden biri olan VBScript'in devre dışı bırakılmasıyla birlikte, lisanslama operasyonlarının modern, güvenli ve nesne odaklı PowerShell mimarisine taşınması zorunlu hale gelmiştir.

Neden slmgr.vbs Yerine PowerShell Tercih Edilmeli?

  • Güvenlik Sıkılaştırma (Hardening): GPO üzerinden VBScript yürütme yetkileri kısıtlandığında slmgr.vbs çalışmaz hale gelir. PowerShell CIM (Common Information Model) nesneleri ise güvenli yönetim ortamı sunar.
  • Nesne Odaklı Çıktı Yönetimi: slmgr.vbs çıktıları düz metin (string) kutucukları veya metin blokları olarak sunarken, PowerShell verileri işlenebilir nesne (Object) olarak döndürür. Bu durum otomasyon ve raporlamayı kolaylaştırır.
  • Merkezi Yönetim (Remoting): PowerShell Remoting (WinRM/PSDirect) veya Azure Arc vasıtasıyla yüzlerce sunucuda aynı anda lisans durumunu sorgulamak ve etkinleştirmek mümkündür.

slmgr.vbs Komutlarının PowerShell Katmanındaki Karşılıkları

Windows lisanslama mimarisi arka planda SoftwareLicensingService ve SoftwareLicensingProduct WMI/CIM sınıflarını kullanır. Aşağıda en sık kullanılan komutların dönüşüm tablosu yer almaktadır:

1. Lisans Durumunu ve Detaylarını Sorgulama

Geleneksel komut: slmgr.vbs /dli veya slmgr.vbs /dlv

PowerShell CIM Karşılığı:

Get-CimInstance -ClassName SoftwareLicensingProduct | 
    Where-Object {$_.PartialProductKey} | 
    Select-Object Name, ApplicationId, LicenseStatus, PartialProductKey

Not: LicenseStatus değerinin 1 olması sistemin lisanslı (Licensed) olduğunu gösterir.

2. Yeni Ürün Anahtarı (Product Key) Yükleme

Geleneksel komut: slmgr.vbs /ipk XXXXX-XXXXX-XXXXX-XXXXX-XXXXX

PowerShell CIM Karşılığı:

$service = Get-CimInstance -ClassName SoftwareLicensingService
$service | Invoke-CimMethod -MethodName InstallProductKey -Arguments @{ProductKey = "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX"}

3. Windows'u Online Etkinleştirme

Geleneksel komut: slmgr.vbs /ato

PowerShell CIM Karşılığı:

$product = Get-CimInstance -ClassName SoftwareLicensingProduct | Where-Object {$_.PartialProductKey}
$product | Invoke-CimMethod -MethodName Activate

4. KMS Sunucu Adresi Tanımlama

Geleneksel komut: slmgr.vbs /skms kms.sirketiniz.local:1688

PowerShell CIM Karşılığı:

$service = Get-CimInstance -ClassName SoftwareLicensingService
$service | Invoke-CimMethod -MethodName SetKeyManagementServiceMachine -Arguments @{MachineName = "kms.sirketiniz.local"}

Gelişmiş PowerShell Otomasyonu: Otomatik Etkinleştirme Fonksiyonu

Sunucu yaygınlaştırma (provisioning) süreçlerinizde veya CI/CD hatlarınızda kullanabileceğiniz, ortamın lisans durumunu denetleyip gerekirse otomatik etkinleştiren modüler PowerShell örneği:

function Confirm-WindowsActivation {
    [CmdletBinding()]
    param()

    process {
        $licenceInfo = Get-CimInstance -ClassName SoftwareLicensingProduct | Where-Object {$_.PartialProductKey}
        
        switch ($licenceInfo.LicenseStatus) {
            1 {
                Write-Host "Sistem zaten lisanslı ve etkin durumda." -ForegroundColor Green
            }
            0 {
                Write-Warning "Sistem lisanssız (Unlicensed). Etkinleştirme başlatılıyor..."
                $licenceInfo | Invoke-CimMethod -MethodName Activate
            }
            default {
                Write-Host "Lisans Durum Kodu: $($licenceInfo.LicenseStatus). İşlem gerekiyor." -ForegroundColor Yellow
            }
        }
    }
}

Sonuç ve Dönüşüm Stratejisi

Windows Server 2025 ve yeni nesil Windows 11 sürümlerinde VBScript bağımlılıklarını azaltmak, sadece bir tercih değil güvenlik standartlarının bir gereğidir. Mevcut dağıtım betiklerinizi (Deployment Scripts) ve GPO startup tanımlarınızı PowerShell CIM komutlarına dönüştürerek hem daha güvenli hem de modern bir altyapı yönetimi sağlayabilirsiniz.

Sıkça Sorulan Sorular

  • Henüz tamamen kaldırılmadı ancak VBScript altyapısı "Deprecated" (kullanımdan kaldırılacaklar) listesine alındı. Gelecek Windows ve Windows Server sürümlerinde VBScript bileşenleri isteğe bağlı özellik (Feature on Demand) haline getirilecek ve ardından tamamen silinecektir.
  • Hayır. Windows lisanslama motoru arka planda sppsvc (Software Protection Service) servisini ve WMI/CIM altyapısını kullanır. VBScript'in engellenmesi yalnızca .vbs uzantılı betiklerin çalışmasını durdurur, PowerShell CIM komutlarıyla lisanslama sorunsuz devam eder.
  • Get-WmiObject komut seti PowerShell 3.0 sonrası eski kabul edilmiş (deprecated) ve PowerShell 7+ sürümlerinden tamamen çıkarılmıştır. WMI sorgularında güncel, hızlı ve standart protokol olan CIM (Get-CimInstance / Invoke-CimMethod) kullanılmalıdır.
  • Evet. SoftwareLicensingService sınıfının InstallProductKey metodu kullanılarak mevcut sisteme yeni bir GVK (Generic Volume License Key) veya MAK anahtarı uygulanabilir, ardından Activate metoduyla ilgili sunucu üzerinden süreç tamamlanabilir.