Uç Nokta Yönetimi10 Mayıs 2026Serdar7 dk okuma

PowerShell ile KOBİ IT Otomasyonu: 10 Pratik Senaryo

PowerShell ile KOBİ IT Otomasyonu: 10 Pratik Senaryo

Özet: KOBİ IT'sinde PowerShell ile otomasyon; 10 pratik senaryo, AD yönetimi, kullanıcı raporları ve günlük rutin script örnekleri.

Özet: PowerShell, Microsoft'un sistem yöneticileri için tasarladığı modern komut dili ve betikleme ortamıdır. Windows yerleşik gelir, ücretsiz, KOBİ IT ekibinin günlük rutinini saatlerden dakikalara indirebilir. Bu yazıda 10 pratik senaryo örneği sunuyoruz: toplu kullanıcı oluşturma, eski hesap raporu, disk dolma uyarı, dosya temizliği, BitLocker durum, MFA raporu, yazıcı listesi, log analizi, e-posta gönderimi, scheduled task. Her örnek KOBİ ölçeğinde gerçek bir ihtiyaca cevap verir; kopyala-uyarla-kullan formatında.

KOBİ IT'sinde "her ay aynı işi tekrar yapıyorum" hissiyatı yaygın. Yeni çalışanın AD hesabı oluşturma, eski hesap raporu, diskte dolu klasör tespiti, audit talepleri — hepsi tek tek manuel yapıldığında saatler sürer. PowerShell ile bu işler script'e döner; sonraki seferde tek komutla halledilir. PowerShell öğrenme yatırımı 1-2 hafta; karşılığında yıllarca verim sağlar.

Bu yazıda KOBİ ölçeğinde PowerShell otomasyon için 10 pratik senaryoyu kod örnekleriyle ele alıyoruz. Hedef kitlemiz IT yöneticileri, sistem yöneticileri ve manuel rutinleri otomatize etmek isteyen karar vericiler.

PowerShell Neden Önemli?

Avantajları

  • Windows yerleşik (Win 7 sonrası)
  • Ücretsiz
  • Cmdlet'ler obje tabanlı (bash gibi metin değil)
  • Modüler (Active Directory, Exchange, Azure modülleri)
  • Cross-platform (PowerShell Core 7+ Linux/macOS'ta da)
  • Geniş topluluk, hazır script kütüphaneleri

KOBİ Ölçeğinde Tipik Faydalar

  • Toplu işlemler (50 kullanıcı oluşturma)
  • Düzenli raporlar (haftalık, aylık)
  • Otomasyon (Scheduled Task ile çalışan script'ler)
  • API entegrasyonu
  • Log analizi

PowerShell Temelleri (Hızlı Bakış)

Temel Cmdlet Yapısı

Verb-Noun -Parameter Value

Örnek:

Get-Service -Name Spooler
Get-Process | Where-Object {$_.CPU -gt 100}
Get-EventLog -LogName System -Newest 50

Pipe (|) Operatörü

Bir cmdlet çıktısını diğerine besleme:

Get-ADUser -Filter * | Where-Object {$_.Enabled -eq $true} | Export-Csv users.csv

Modüller

# AD modülü import (RSAT veya server)
Import-Module ActiveDirectory

# Exchange Online modülü
Install-Module -Name ExchangeOnlineManagement
Connect-ExchangeOnline

10 Pratik KOBİ Senaryosu

Senaryo 1: Toplu Yeni Kullanıcı Oluşturma

Yeni 5 çalışan başladı; CSV'den toplu oluşturma:

Import-Csv "C:\new_users.csv" | ForEach-Object {
    $password = ConvertTo-SecureString $_.Password -AsPlainText -Force
    
    New-ADUser `
        -Name "$($_.FirstName) $($_.LastName)" `
        -GivenName $_.FirstName `
        -Surname $_.LastName `
        -SamAccountName $_.UserName `
        -UserPrincipalName "$($_.UserName)@firma.local" `
        -EmailAddress $_.Email `
        -Title $_.Title `
        -Department $_.Department `
        -Path "OU=Calisanlar,DC=firma,DC=local" `
        -AccountPassword $password `
        -Enabled $true `
        -ChangePasswordAtLogon $true
    
    Add-ADGroupMember -Identity "Tüm Çalışanlar" -Members $_.UserName
    Write-Host "Kullanıcı oluşturuldu: $($_.UserName)" -ForegroundColor Green
}

CSV format:

FirstName,LastName,UserName,Email,Title,Department,Password
Mehmet,Yılmaz,myilmaz,myilmaz@firma.com,Satış Uzmanı,Satış,Tmp123!
Ayşe,Kaya,akaya,akaya@firma.com,Muhasebe,Finans,Tmp123!

Senaryo 2: 90+ Gün Logon Olmamış Hesaplar

Eski/inaktif hesap raporu:

$cutoffDate = (Get-Date).AddDays(-90)

Search-ADAccount -AccountInactive -TimeSpan 90 -UsersOnly |
    Where-Object {$_.Enabled -eq $true} |
    Select-Object Name, SamAccountName, LastLogonDate, Enabled |
    Sort-Object LastLogonDate |
    Export-Csv "C:\Reports\Inactive_Users_$(Get-Date -Format yyyy-MM-dd).csv" -NoTypeInformation

Write-Host "İnaktif kullanıcı raporu hazır" -ForegroundColor Yellow

Senaryo 3: Disk Dolma Uyarısı

Sunucu disklerini kontrol et, %85 üzerinde uyar:

$threshold = 85
$servers = "DC01", "FILESVR01", "SQL01", "BACKUP01"

foreach ($server in $servers) {
    Get-WmiObject Win32_LogicalDisk -ComputerName $server -Filter "DriveType=3" |
        ForEach-Object {
            $usedPercent = [math]::Round((($_.Size - $_.FreeSpace) / $_.Size) * 100, 2)
            
            if ($usedPercent -gt $threshold) {
                $message = "UYARI: $server üzerinde $($_.DeviceID) doluluk %$usedPercent"
                Write-Host $message -ForegroundColor Red
                
                # E-posta uyarısı
                Send-MailMessage -To "it@firma.com" -From "monitor@firma.com" `
                    -Subject "Disk Doluluk Uyarısı: $server" `
                    -Body $message -SmtpServer "smtp.firma.com"
            }
        }
}

Senaryo 4: 30 Gün Eskimiş Dosya Temizliği

Geçici klasörlerde 30+ gün dosya silme:

$tempPath = "D:\Temp"
$cutoffDate = (Get-Date).AddDays(-30)

Get-ChildItem -Path $tempPath -Recurse |
    Where-Object {$_.LastWriteTime -lt $cutoffDate} |
    ForEach-Object {
        Write-Host "Siliniyor: $($_.FullName)"
        Remove-Item $_.FullName -Force -Recurse -ErrorAction SilentlyContinue
    }

Write-Host "Geçici dosya temizliği tamamlandı"

Senaryo 5: BitLocker Durum Raporu

Tüm domain bilgisayarlarının BitLocker durumu:

$computers = Get-ADComputer -Filter * -SearchBase "OU=Laptoplar,DC=firma,DC=local"

$report = foreach ($computer in $computers) {
    if (Test-Connection -ComputerName $computer.Name -Count 1 -Quiet) {
        $bitlocker = Invoke-Command -ComputerName $computer.Name -ScriptBlock {
            Get-BitLockerVolume -MountPoint "C:" -ErrorAction SilentlyContinue
        } -ErrorAction SilentlyContinue
        
        [PSCustomObject]@{
            ComputerName = $computer.Name
            ProtectionStatus = $bitlocker.ProtectionStatus
            EncryptionPercentage = $bitlocker.EncryptionPercentage
            VolumeStatus = $bitlocker.VolumeStatus
        }
    }
}

$report | Export-Csv "C:\Reports\BitLocker_Status.csv" -NoTypeInformation
$report | Where-Object {$_.ProtectionStatus -ne "On"} | Format-Table

Senaryo 6: MFA Olmayan Hesaplar (M365)

Azure AD'de MFA aktif olmayan kullanıcılar:

# MgGraph modülü gerekli
Connect-MgGraph -Scopes "User.Read.All", "UserAuthenticationMethod.Read.All"

$users = Get-MgUser -All

$mfaReport = foreach ($user in $users) {
    $methods = Get-MgUserAuthenticationMethod -UserId $user.Id
    $hasMfa = $false
    
    foreach ($method in $methods) {
        if ($method.AdditionalProperties["@odata.type"] -ne "#microsoft.graph.passwordAuthenticationMethod") {
            $hasMfa = $true
            break
        }
    }
    
    [PSCustomObject]@{
        UserPrincipalName = $user.UserPrincipalName
        DisplayName = $user.DisplayName
        MFAEnabled = $hasMfa
    }
}

$mfaReport | Where-Object {$_.MFAEnabled -eq $false} |
    Export-Csv "C:\Reports\MFA_Missing.csv" -NoTypeInformation

Senaryo 7: Print Server Kuyruk Temizliği

Yazdırma kuyruğunda takılan işleri temizle:

$printer = "Buro_Yazici_01"

# Stuck job'ları (1 saat üzeri) temizle
Get-PrintJob -PrinterName $printer |
    Where-Object {$_.SubmittedTime -lt (Get-Date).AddHours(-1)} |
    ForEach-Object {
        Write-Host "Siliniyor: $($_.DocumentName) - $($_.UserName)"
        Remove-PrintJob -InputObject $_
    }

# Spooler servisini yeniden başlat
Restart-Service Spooler
Write-Host "Print Spooler yeniden başlatıldı"

Senaryo 8: Olay Günlüğü (Event Log) Analizi

Son 24 saatte sistem hatalarını topla:

$startTime = (Get-Date).AddHours(-24)

$errors = Get-WinEvent -FilterHashtable @{
    LogName = 'System'
    Level = 1, 2  # Critical, Error
    StartTime = $startTime
}

$errorSummary = $errors | Group-Object -Property ProviderName |
    Sort-Object -Property Count -Descending |
    Select-Object -First 10 Count, Name

Write-Host "Son 24 saatte en çok hata veren kaynaklar:"
$errorSummary | Format-Table -AutoSize

# E-posta raporu
$body = $errors | Format-Table -AutoSize | Out-String
Send-MailMessage -To "it@firma.com" -From "monitor@firma.com" `
    -Subject "Günlük Sistem Hata Raporu" `
    -Body $body -SmtpServer "smtp.firma.com"

Senaryo 9: Otomatik E-posta Raporu

Aylık IT durum raporu (script'e koyup task'a ekle):

$reportDate = Get-Date -Format "yyyy-MM-dd"
$reportPath = "C:\Reports\Monthly_IT_$reportDate.html"

# Toplama
$totalUsers = (Get-ADUser -Filter *).Count
$totalComputers = (Get-ADComputer -Filter *).Count
$inactiveUsers = (Search-ADAccount -AccountInactive -TimeSpan 90 -UsersOnly).Count
$disabledUsers = (Search-ADAccount -AccountDisabled -UsersOnly).Count

# HTML rapor
$html = @"
<html>
<head><title>Aylık IT Raporu</title></head>
<body>
<h1>Aylık IT Durum Raporu - $reportDate</h1>
<table>
<tr><th>Metrik</th><th>Değer</th></tr>
<tr><td>Toplam Kullanıcı</td><td>$totalUsers</td></tr>
<tr><td>Toplam Bilgisayar</td><td>$totalComputers</td></tr>
<tr><td>İnaktif Kullanıcı (90+ gün)</td><td>$inactiveUsers</td></tr>
<tr><td>Devre Dışı Kullanıcı</td><td>$disabledUsers</td></tr>
</table>
</body>
</html>
"@

$html | Out-File $reportPath

Send-MailMessage -To "yonetim@firma.com" -From "it@firma.com" `
    -Subject "Aylık IT Raporu" `
    -Body $html -BodyAsHtml `
    -SmtpServer "smtp.firma.com"

Senaryo 10: Scheduled Task ile Otomatik Çalıştırma

Script'i her gün 06:00'da çalıştır:

$action = New-ScheduledTaskAction -Execute "powershell.exe" `
    -Argument "-ExecutionPolicy Bypass -File C:\Scripts\daily_check.ps1"

$trigger = New-ScheduledTaskTrigger -Daily -At "06:00"

$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -RunLevel Highest

Register-ScheduledTask -TaskName "Daily_IT_Check" `
    -Action $action `
    -Trigger $trigger `
    -Principal $principal `
    -Description "Günlük IT kontrol scripti"

Write-Host "Scheduled task oluşturuldu: Daily_IT_Check"

PowerShell Best Practices

Güvenlik

  • Execution Policy: AllSigned (production)
  • Script imzalama (kurum sertifikası)
  • Hassas bilgiler (parolalar) Secret Store veya Credential Manager
  • Logging: tüm script aktivitesi log

Yazım Stili

  • Verb-Noun naming convention (Get-, Set-, Remove-)
  • Comment'ler açıklayıcı
  • Try/Catch ile error handling
  • Verbose, WhatIf, Confirm parametreleri

Versioning

  • Scripts Git'te (GitHub, GitLab)
  • Değişiklik log'u
  • Test ortamında dene, sonra production

Yamanlar Bilişim Olarak Sunduğumuz Hizmetler

KOBİ ölçeğinde PowerShell otomasyon destek alanlarımız:

  • Mevcut manuel rutin denetimi
  • Script geliştirme (özelleştirilmiş)
  • Scheduled Task otomasyonu
  • AD, Exchange, M365 script kütüphanesi
  • Aylık/yıllık otomatik rapor
  • IT ekibe PowerShell eğitimi
  • Script güvenlik denetimi

Sıkça Sorulan Sorular

Sonuç

PowerShell; KOBİ IT'sinin günlük rutinini otomatize eden, ücretsiz, güçlü ve öğrenmesi pratik bir araçtır. 10 pratik senaryo örneği — toplu kullanıcı, eski hesap raporu, disk uyarı, BitLocker durum, MFA raporu, log analizi — günlük operasyonun büyük kısmını oluşturur ve PowerShell ile saatlerden dakikalara iner. IT ekibinin PowerShell yatırımı, KOBİ verimliliğinin en yüksek getirili kalemlerinden biridir.

Yamanlar Bilişim olarak ölçeğinize uygun script geliştirme, scheduled task otomasyonu ve IT ekip eğitimi hizmetleri sunuyor; tekrarlayan IT yükünüzü otomatize bir disipline çeviriyoruz.

Sıkça Sorulan Sorular

PowerShell öğrenmek ne kadar sürer?

KOBİ IT için temel: 1-2 hafta. AD modülü, dosya işlemleri, log analizi öğrenilir. İleri seviye (Exchange, Azure, REST API): 1-2 ay. Microsoft Learn, ücretsiz eğitim platformu — pratik öğrenme için yeterli.

Linux taki bash gibi mi?

Konsept benzer ama PowerShell obje tabanlı , bash metin tabanlı. PowerShell daha güçlü tip yönetimi, .NET entegrasyonu sunar. KOBİ ortamında Windows ağırlıklı + AD/Exchange/Azure entegrasyonu için PowerShell çok daha pratik.

PowerShell Core (7) mu yoksa Windows PowerShell (5.1) mı?

PowerShell 5.1 Windows yerleşik, AD modülü gibi Windows-only özellikler için uyumlu. PowerShell 7 (cross-platform) modern, hızlı, Linux/macOS ta da çalışır. KOBİ AD ağırlıklı: 5.1 kalır; modern bulut/Linux entegrasyon: 7. Çoğu zaman ikisi de yan yana kullanılır.

Script lerimi nasıl güvenli saklamalıyım?

Git repository (GitHub private, GitLab self-hosted) version control. Hassas bilgiler kod içinde değil, Azure Key Vault / Windows Credential Manager / SecretManagement modülünden okunur. Script imzalama (kurum CA) yetkisiz değişiklikleri önler.

KOBİ olarak başkasının script ini kullanmak güvenli mi?

GitHub, PowerShell Gallery den indirilen script ler — kaynak güvenilirliği önemli. Resmi Microsoft, popüler PSGallery modülleri (PSReadLine, dbatools) genelde güvenli. Bilinmeyen kaynak script leri mutlaka okunup test edilmeli. Kuruma uygulamadan önce test ortamında çalıştır.

Otomasyon ile manuel iş arasındaki dengeyi nasıl kurmalıyım?

Pareto kuralı: 1-2 saatlik script %50+ manuel iş kazanımı sağlıyorsa otomatize et. 10 dakikalık manuel iş için 10 saat script yazma anlamsız. Tekrarlayan, hata-prone (hata olabilen) işleri öncelikle otomatize et. Manuel kararı gerektiren işler (örnek karmaşık troubleshooting) script e dönüşmemeli.

Paylaş:
Son güncelleme: 10 Mayıs 2026
S

Yazar

Serdar

Yamanlar Bilişim Uzmanı

Yamanlar Bilişim bünyesinde IT altyapısı, siber güvenlik ve dijital dönüşüm konularında içerikler üretmektedir. Sorularınız için iletişime geçebilirsiniz.

Profesyonel Destek

Bu konuda destek alın

Uç Nokta Yönetimi alanında ihtiyaç duyduğunuz çözümü birlikte tasarlayalım. Uzman ekibimiz 1 iş günü içinde size geri döner.

support@yamanlarbilisim.com.tr · Yanıt süresi: 1 iş günü