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.