PowerShell ile Windows Rol ve Özellik Kurulumu

Windows Server ortamlarında rol ve özellik kurulumu, her sistem yöneticisinin günlük işlerinin ayrılmaz bir parçası. Eskiden Server Manager arayüzünü açıp tıkla-tıkla-tıkla yapısında kurulum yapardık. Ama ölçeklenebilir, tekrarlanabilir ve denetlenebilir bir altyapı istiyorsak, bu işleri PowerShell ile otomatize etmek artık bir tercih değil, zorunluluk. Bugün bu konuyu baştan sona, gerçek dünya senaryolarıyla birlikte ele alacağız.

Temel Kavramlar: Role ve Feature Farkı

Windows Server’da iki ayrı kavram var ve bunları karıştırmamak önemli.

Roller (Roles): Sunucunun ana işlevini tanımlar. DNS, DHCP, Active Directory, IIS, Hyper-V gibi büyük yapı taşları rol kategorisine girer. Bir sunucu genellikle birkaç rol üstlenir.

Özellikler (Features): Rolleri destekleyen ya da bağımsız işlev sunan bileşenler. .NET Framework, RSAT araçları, Windows Server Backup gibi şeyler feature kapsamında değerlendirilir.

Rol Servisleri (Role Services): Bazı rollerin altında daha granüler bileşenler bulunur. IIS kurduğunuzda HTTP Redirect, WebDAV, CGI gibi rol servisleri ayrıca seçilebilir.

Bu ayrımı anlamadan yazdığınız scriptler beklenmedik hatalar verebilir ya da eksik kurulum yapabilir.

Get-WindowsFeature ile Mevcut Durumu Keşfetmek

Herhangi bir kurulum yapmadan önce sistemin mevcut durumunu anlamak gerekiyor. Get-WindowsFeature komutu bu iş için biçilmiş kaftan.

# Tüm rol ve özellikleri listele
Get-WindowsFeature

# Yalnızca kurulu olanları filtrele
Get-WindowsFeature | Where-Object { $_.InstallState -eq "Installed" }

# Belirli bir isimle arama yap
Get-WindowsFeature -Name *Web*

# Detaylı bilgi almak için
Get-WindowsFeature -Name Web-Server | Select-Object *

Bu komutun çıktısında dikkat etmeniz gereken birkaç alan var:

  • Name: PowerShell’de kullanacağınız teknik isim, görünen isim değil
  • InstallState: Available, Installed, Removed gibi durumları gösterir
  • Removed durumu önemli: Bu özellik sisteme hiç yüklenmemiş, kurulum için kaynak medyasına ihtiyaç duyabilirsiniz
  • FeatureType: Role, Feature veya Role Service olduğunu belirtir
  • SubFeatures: Bağımlı alt bileşenleri gösterir

Uzak bir sunucuda bu komutu çalıştırmak istiyorsanız -ComputerName parametresini kullanabilirsiniz, ancak bunun için WinRM aktif olmalı.

# Uzak sunucuda feature durumunu kontrol et
Get-WindowsFeature -ComputerName "SRV-WEB-01" | Where-Object { $_.InstallState -eq "Installed" }

Install-WindowsFeature Komutu ve Parametreleri

Kurulum komutunun temel sözdizimini öğrendikten sonra işler hızla kolaylaşıyor.

# Tek bir rol kurulumu - en basit hali
Install-WindowsFeature -Name Web-Server

# Yönetim araçlarıyla birlikte kur
Install-WindowsFeature -Name Web-Server -IncludeManagementTools

# Tüm alt özellikleri dahil et
Install-WindowsFeature -Name Web-Server -IncludeAllSubFeature

# Her ikisini de birlikte kullan
Install-WindowsFeature -Name Web-Server -IncludeAllSubFeature -IncludeManagementTools

# Kurulum log dosyası oluştur
Install-WindowsFeature -Name Web-Server -IncludeManagementTools -LogPath "C:LogsIIS_Install.log"

Kritik parametreler şunlar:

  • -Name: Kurulacak feature ya da role’ün teknik adı, virgülle birden fazla belirtebilirsiniz
  • -IncludeManagementTools: GUI yönetim araçlarını, MMC snap-in’leri de kurar
  • -IncludeAllSubFeature: Seçilen özelliğin tüm alt bileşenlerini otomatik olarak ekler
  • -ComputerName: Uzak sunucuda kurulum yapar
  • -LogPath: Kurulum çıktısını dosyaya yazar, problem takibi için çok değerli
  • -Restart: Kurulum sonrası yeniden başlatma gerekirse otomatik yapar
  • -WhatIf: Gerçekten kurmadan ne yapacağını simüle eder, test ortamı için mükemmel
  • -Source: Kaynak medya yolu, Removed durumundaki özellikler için gerekli

Gerçek Dünya Senaryosu 1: Tam IIS Web Sunucu Kurulumu

Diyelim ki yeni bir web sunucusu hazırlıyorsunuz. Sadece temel IIS değil, SSL, sıkıştırma, statik içerik ve yönetim araçlarının hepsini istiyorsunuz. İşte bunu GUI’den yapmak yerine script olarak kaydetmek nasıl görünür:

# Kapsamlı IIS kurulumu
$IISFeatures = @(
    "Web-Server",
    "Web-Common-Http",
    "Web-Default-Doc",
    "Web-Dir-Browsing",
    "Web-Http-Errors",
    "Web-Static-Content",
    "Web-Http-Redirect",
    "Web-Health",
    "Web-Http-Logging",
    "Web-Log-Libraries",
    "Web-Request-Monitor",
    "Web-Http-Tracing",
    "Web-Performance",
    "Web-Stat-Compression",
    "Web-Dyn-Compression",
    "Web-Security",
    "Web-Filtering",
    "Web-Basic-Auth",
    "Web-Windows-Auth",
    "Web-Net-Ext45",
    "Web-Asp-Net45",
    "Web-ISAPI-Ext",
    "Web-ISAPI-Filter",
    "Web-Mgmt-Tools",
    "Web-Mgmt-Console",
    "Web-Mgmt-Compat",
    "NET-Framework-45-ASPNET"
)

$LogPath = "C:LogsIIS_Install_$(Get-Date -Format 'yyyyMMdd_HHmm').log"

# Log dizinini oluştur
if (-not (Test-Path "C:Logs")) {
    New-Item -ItemType Directory -Path "C:Logs" | Out-Null
}

Write-Host "IIS kurulumu basliyor..." -ForegroundColor Yellow

$Result = Install-WindowsFeature -Name $IISFeatures -IncludeManagementTools -LogPath $LogPath

if ($Result.Success) {
    Write-Host "IIS kurulumu basarili!" -ForegroundColor Green
    Write-Host "Yeniden baslatma gerekli mi: $($Result.RestartNeeded)" -ForegroundColor Cyan
} else {
    Write-Host "Kurulum sirasinda hata olustu. Log dosyasini kontrol edin: $LogPath" -ForegroundColor Red
}

Bu scripti C:ScriptsInstall-IIS.ps1 olarak kaydedip istediğiniz zaman çalıştırabilirsiniz. Yeni bir web sunucusu hazırlamanız gerektiğinde sıfırdan başlamak yerine bu scripti çalıştırırsınız, her seferinde aynı standart yapılandırma elde edersiniz.

Gerçek Dünya Senaryosu 2: Active Directory Domain Services Kurulumu

ADDS kurulumu biraz daha karmaşık çünkü özelliği kurduktan sonra domain controller’ı promote etmeniz gerekiyor. İki adımlı bir süreç bu.

# Adım 1: ADDS rol ve araçlarını kur
Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools

# Adım 2: Yeni bir forest oluştur (ilk DC için)
Import-Module ADDSDeployment

Install-ADDSForest `
    -DomainName "sirket.local" `
    -DomainNetbiosName "SIRKET" `
    -DomainMode "WinThreshold" `
    -ForestMode "WinThreshold" `
    -DatabasePath "C:WindowsNTDS" `
    -LogPath "C:WindowsNTDS" `
    -SysvolPath "C:WindowsSYSVOL" `
    -InstallDns:$true `
    -NoRebootOnCompletion:$false `
    -Force:$true

Mevcut bir domain’e ikinci DC eklemek için ise Install-ADDSDomainController kullanırsınız. Bu komutlar ADDSDeployment modülünden gelir, ServerManager modülünden değil. İlk önce Install-WindowsFeature ile rolü kurmanız şart.

Gerçek Dünya Senaryosu 3: Birden Fazla Sunucuya Toplu Kurulum

Elinizde 10 tane uygulama sunucusu var ve hepsine aynı özellikleri kurmanız gerekiyor. Bunu tek tek yapmak saatler alır ve hata riski taşır. PowerShell Remoting ile toplu kurulum yapın:

# Hedef sunucu listesi - bu listeyi bir dosyadan da okuyabilirsiniz
$Sunucular = @(
    "APP-SRV-01",
    "APP-SRV-02", 
    "APP-SRV-03",
    "APP-SRV-04",
    "APP-SRV-05"
)

$KurulacakOzellikler = @(
    "NET-Framework-45-Features",
    "NET-Framework-45-Core",
    "NET-Framework-45-ASPNET",
    "Web-Server",
    "Web-Asp-Net45",
    "Windows-Server-Backup"
)

$Sonuclar = @()

foreach ($Sunucu in $Sunucular) {
    Write-Host "Isleniyor: $Sunucu" -ForegroundColor Yellow
    
    try {
        $Sonuc = Invoke-Command -ComputerName $Sunucu -ScriptBlock {
            param($Ozellikler)
            Install-WindowsFeature -Name $Ozellikler -IncludeManagementTools
        } -ArgumentList @(,$KurulacakOzellikler)
        
        $Sonuclar += [PSCustomObject]@{
            Sunucu    = $Sunucu
            Basari    = $Sonuc.Success
            Yeniden   = $Sonuc.RestartNeeded
            Hata      = ""
        }
        
        Write-Host "$Sunucu: Basarili" -ForegroundColor Green
    }
    catch {
        $Sonuclar += [PSCustomObject]@{
            Sunucu    = $Sunucu
            Basari    = $false
            Yeniden   = "Unknown"
            Hata      = $_.Exception.Message
        }
        Write-Host "$Sunucu: HATA - $($_.Exception.Message)" -ForegroundColor Red
    }
}

# Özet rapor
Write-Host "`n=== KURULUM OZETI ===" -ForegroundColor Cyan
$Sonuclar | Format-List

Bu script size her sunucunun durumunu özetleyen bir rapor verir. Hangi sunucularda sorun çıktığını anında görürsünüz.

Remove-WindowsFeature ile Kaldırma İşlemleri

Kurulum kadar kaldırma da önemli. Kullanılmayan roller saldırı yüzeyini genişletir, gereksiz kaynak tüketir.

# Tek özellik kaldır
Remove-WindowsFeature -Name Telnet-Client

# Birden fazla özelliği kaldır
Remove-WindowsFeature -Name @("TFTP-Client", "Telnet-Client", "SMTP-Server")

# Yönetim araçlarını da kaldır
Remove-WindowsFeature -Name Web-Server -IncludeManagementTools

# Kaldırma simülasyonu - önce ne olacağını gör
Remove-WindowsFeature -Name Web-Server -WhatIf

# Kaldırma sonrası log
Remove-WindowsFeature -Name Web-Server -LogPath "C:LogsRemove_IIS.log"

Önemli bir nokta: Bazı bileşenleri kaldırdığınızda Removed durumuna geçer ve kaynak medya olmadan tekrar kuramazsınız. Özellikle Core kurulum yapılmış sunucularda bu durumla sık karşılaşırsınız.

Kaynak Medya Olmadan Kurulum Sorunu ve Çözümü

Windows Server Core ya da bazı sıkılaştırılmış kurulumlarında bazı özellikler tamamen kaldırılmış olabilir. Bu durumda kurulum sırasında şu hatayla karşılaşırsınız: “The source files could not be found.”

# WIM dosyasından kaynak belirterek kurulum
Install-WindowsFeature -Name NET-Framework-Core `
    -Source "D:sourcessxs"

# Network üzerinden kaynak belirterek
Install-WindowsFeature -Name NET-Framework-Core `
    -Source "\dosya-sunucusuWindowsSourcesxs"

# DISM ile de yapılabilir - PowerShell içinden
Dism /Online /Enable-Feature /FeatureName:NetFx3 `
    /All /LimitAccess /Source:"D:sourcessxs"

Bu durumu önceden tespit etmek için:

# Removed durumundaki özellikleri bul
Get-WindowsFeature | Where-Object { $_.InstallState -eq "Removed" } | 
    Select-Object Name, DisplayName, InstallState

RSAT Araçları ve Yönetim Workstation Kurulumu

Domain ortamında yönetim workstation’ınıza RSAT araçlarını PowerShell ile kurmak da aynı mantıkla çalışıyor:

# Windows 10/11'de RSAT kurulumu (farklı cmdlet kullanılır)
# Önce mevcut RSAT paketlerini listele
Get-WindowsCapability -Name RSAT* -Online | Select-Object Name, State

# Tüm RSAT araçlarını kur
Get-WindowsCapability -Name RSAT* -Online | Add-WindowsCapability -Online

# Belirli RSAT araçlarını kur
Add-WindowsCapability -Name "Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0" -Online
Add-WindowsCapability -Name "Rsat.Dns.Tools~~~~0.0.1.0" -Online
Add-WindowsCapability -Name "Rsat.DHCP.Tools~~~~0.0.1.0" -Online
Add-WindowsCapability -Name "Rsat.GroupPolicy.Management.Tools~~~~0.0.1.0" -Online

Windows Server’da ise hala Install-WindowsFeature kullanıyoruz:

# Server üzerinde RSAT araçlarını kur
Install-WindowsFeature -Name RSAT-AD-Tools, RSAT-DNS-Server, RSAT-DHCP

Kurulum Sonucu Nesnesini Anlamak

Install-WindowsFeature bir nesne döndürür ve bu nesneyi scriptlerinizde kontrol mekanizması olarak kullanmanız gerekiyor.

# Sonucu değişkene al ve analiz et
$KurulumSonucu = Install-WindowsFeature -Name DHCP -IncludeManagementTools

# Başarı durumunu kontrol et
if ($KurulumSonucu.Success -eq $true) {
    Write-Host "Kurulum basarili!" -ForegroundColor Green
    
    # Yeniden başlatma gerekiyor mu?
    if ($KurulumSonucu.RestartNeeded -eq "Yes") {
        Write-Host "Dikkat: Yeniden baslatma gerekiyor!" -ForegroundColor Yellow
        
        # Otomatik restart isteniyorsa
        # Restart-Computer -Force
    }
    
    # Hangi özellikler kuruldu?
    Write-Host "Kurulan ozellikler:"
    $KurulumSonucu.FeatureResult | Where-Object { $_.Success } | 
        Select-Object DisplayName, Message
} else {
    Write-Host "Kurulum basarisiz!" -ForegroundColor Red
    $KurulumSonucu.FeatureResult | Where-Object { -not $_.Success } | 
        Select-Object DisplayName, Message
}

$KurulumSonucu nesnesinin içerdiği önemli alanlar:

  • Success: Boolean, genel kurulumun başarılı olup olmadığı
  • RestartNeeded: Yes, No veya Maybe değerleri alır
  • FeatureResult: Her özellik için detaylı sonuç koleksiyonu
  • ExitCode: Sistem çıkış kodu

Idempotent Scriptler Yazmak

Profesyonel bir sysadmin olarak scriptlerinizin idempotent olmasına dikkat etmelisiniz. Yani aynı scripti birden fazla çalıştırsanız da sorunsuz çalışmalı, zaten kurulu bir şeyi kurmaya çalıştığınızda hata vermemeli.

# Idempotent kurulum scripti örneği
function Install-IfNotPresent {
    param(
        [string[]]$Features,
        [string]$LogPath = "C:Logsfeature_install.log"
    )
    
    # Log dizinini oluştur
    $LogDir = Split-Path $LogPath -Parent
    if (-not (Test-Path $LogDir)) {
        New-Item -ItemType Directory -Path $LogDir -Force | Out-Null
    }
    
    # Hangi özellikler zaten kurulu?
    $KuruluOlanlar = Get-WindowsFeature -Name $Features | 
        Where-Object { $_.InstallState -eq "Installed" }
    
    $KurulacakOlanlar = Get-WindowsFeature -Name $Features | 
        Where-Object { $_.InstallState -ne "Installed" }
    
    if ($KuruluOlanlar) {
        Write-Host "Zaten kurulu: $($KuruluOlanlar.Name -join ', ')" -ForegroundColor Gray
    }
    
    if ($KurulacakOlanlar) {
        Write-Host "Kurulacak: $($KurulacakOlanlar.Name -join ', ')" -ForegroundColor Yellow
        $Sonuc = Install-WindowsFeature -Name $KurulacakOlanlar.Name `
            -IncludeManagementTools -LogPath $LogPath
        return $Sonuc
    } else {
        Write-Host "Tum ozellikler zaten kurulu, islem yapilmadi." -ForegroundColor Green
        return $null
    }
}

# Kullanım
Install-IfNotPresent -Features @("Web-Server", "DHCP", "DNS") `
    -LogPath "C:LogsKurulum_$(Get-Date -Format 'yyyyMMdd').log"

Sonuç

PowerShell ile Windows rol ve özellik yönetimi, başlangıçta karmaşık görünse de birkaç temel komutu kavradıktan sonra son derece güçlü bir araç haline geliyor. Get-WindowsFeature, Install-WindowsFeature ve Remove-WindowsFeature üçlüsü bu işin bel kemiğini oluşturuyor.

Dikkat etmeniz gereken en önemli nokta, kurulum scriptlerinizi her zaman idempotent yazmanız. Prod ortamında aynı scripti birden fazla çalıştırmanız gerekebilir ve o anda “zaten kurulu” hatası alıyorum diye paniklemek istemezsiniz. Kurulum sonucu nesnesini mutlaka kontrol edin, özellikle RestartNeeded alanını görmezden gelmeyin çünkü bazı servisler yeniden başlatma yapılmadan doğru çalışmaz.

Toplu sunucu yönetimi için Invoke-Command ile birleştirme alışkanlığı edindiğinizde, onlarca sunucuya aynı yapılandırmayı dakikalar içinde uygulayabilirsiniz. Configuration Management araçlarına (Ansible, DSC) geçmeden önce bile bu yaklaşım size ciddi bir verimlilik sağlar.

Son olarak, scriptlerinizi kaynak kontrolünde (Git) tutun. Bugün yazdığınız kurulum scripti, altı ay sonra yeni bir sunucu kurmanız gerektiğinde ya da bir audit sırasında “bu sunucuya ne kurulmuş nasıl kurulmuş” sorusuna cevap vermeniz gerektiğinde hayat kurtarır.

Yorum yapın