Python psutil Kütüphanesi İle Windows Hizmetler’e Erişim ve Yönetme

Windows işletim sisteminde hizmetler (services), kullanıcı etkileşimi olmadan arka planda çalışan uygulamalardır. Yazıcı kuyruğundan veritabanı sunucularına, antivirüs yazılımlarından Windows Update’e kadar pek çok kritik işlev bu hizmetler üzerinden yürütülür.

Çoğu kullanıcı için services.msc komutuyla açılan Hizmetler penceresi yeterlidir. Ancak iş otomasyon, ölçek ve tekrarlanabilirlik olduğunda, tıklamayla yönetim hızla yetersiz kalır. İşte tam bu noktada Python devreye girer.

Neden Python? Neden Betik?

Şunu netleştirelim: services.msc kötü bir araç değil. Tek bir makinede, tek bir hizmeti elle durdurmak için hâlâ en hızlı yol. Ama şu senaryoları düşünün:

  • 50 sunucuda “SQL” ile başlayan hizmetlerin durumunu raporlamanız gerekiyor.
  • Her gece 03:00’te belirli bir hizmeti durdurup temizlik yapıp yeniden başlatmak istiyorsunuz.
  • Bir web arayüzüne “Hizmeti Yeniden Başlat” butonu eklemek istiyorsunuz.
  • İzleme sisteminize (Prometheus, Zabbix) hizmet durumlarını beslemek istiyorsunuz.
  • GUI olmayan bir Windows Server Core üzerinde çalışıyorsunuz.

Bu senaryoların hiçbirinde services.msc size yardımcı olamaz. Python ise bu işlerin hepsini birkaç satır kodla halleder.

psutil ile Hizmetleri Listeleme

psutil, sistem bilgilerine erişmek için kullanılan, platformlar arası ve son derece olgun bir kütüphanedir. Windows’ta win_service_iter() fonksiyonu aracılığıyla tüm hizmetler üzerinde yineleme yapmanızı sağlar.

Öncelikle psutil kütüphanesini kuralım:

Python
pip install psutil

Ardından aşağıdaki kodu çalıştırabilirsiniz:

Python
import psutil

def list_services(status="all"):
    count = 0
    print(f"{'HİZMET ADI':<30} {'GÖRÜNEN AD':<40} {'DURUM':<10} {'BAŞLANGIÇ':<12} {'AÇIKLAMA'}")
    print("-" * 130)

    for svc in psutil.win_service_iter():
        # Ad, görünen ad, durum ve başlangıç türü — bunlar her zaman okunabilir
        try:
            name = svc.name()
            display_name = svc.display_name()
            svc_status = svc.status()
            start_type = svc.start_type()
        except (psutil.Error, OSError):
            # Bu dördü bile okunamıyorsa, hizmet gerçekten erişilemez demektir
            continue

        # Açıklama — burada hata olabilir, ama hizmeti listeden çıkarmayalım
        try:
            description = svc.description() or "(açıklama yok)"
        except (psutil.Error, FileNotFoundError, OSError):
            description = "(açıklama okunamadı)"

        # Açıklamayı kısaltıyoruz
        if len(description) > 50:
            description = description[:47] + "..."

        if status == "all" or svc_status == status:
            print(f"{name:<30} {display_name:<40} {svc_status:<10} {start_type:<12} {description}")
            count += 1

    print("-" * 130)
    print(f"Toplam {count} hizmet listelendi.")


if __name__ == "__main__":
    list_services("all")

Python betiğini çalıştırdığınızda aşağıdaki gibi bir çıktı elde edersiniz.

PowerShell
HİZMET ADI                     GÖRÜNEN AD                               DURUM      BAŞLANGIÇ    AÇIKLAMA
----------------------------------------------------------------------------------------------------------------------------------
ADPSvc                         Toplu Veri Platformu Hizmeti             stopped    manual       Bu hizmet, Kümelenmiş Veri Platformu senaryolar...
ALG                            Uygulama Katmanı Ağ Geçidi Hizmeti       stopped    manual       Internet Bağlantı Paylaşımı için üçüncü şahıs p...
AppIDSvc                       Uygulama Kimliği                         stopped    manual       Bir uygulamanın kimliğini belirler ve doğrular....
Appinfo                        Uygulama Bilgileri                       running    manual       Etkileşimli uygulamaların ek yönetimsel ayrıcal...
AppMgmt                        Uygulama Yönetimi                        stopped    manual       Grup İlkesi ile dağıtılan yazılımlara yönelik y...
AppReadiness                   Uygulama Hazır Olma Durumu               stopped    manual       Kullanıcı bu bilgisayarda ilk kez oturum açtığı...
AppVClient                     Microsoft App-V Client                   stopped    disabled     Manages App-V users and virtual applications
AppXSvc                        AppX Deployment Service (AppXSVC)        stopped    automatic    Provides infrastructure support for deploying S...
ApxSvc                         Windows Sanal Ses Cihazı Ara Sunucu Hizmeti stopped    manual       Windows tabanlı programlar için sanal ses cihaz...

Açıkçası sadece bu şekilde çalıştırmak services.msc nin çalışabilir olduğu durumlarda pek bir işinize yaramaz.

psutil ve Filtreleme Kullanarak Hizmetleri Listeleme

Python
import psutil

def list_services_by_prefix(prefix, status="all"):
    count = 0
    print(f"{'HİZMET ADI':<30} {'GÖRÜNEN AD':<45} {'DURUM':<12} {'BAŞLANGIÇ TÜRÜ'}")
    print("-" * 110)

    prefix_lower = prefix.casefold()

    for svc in psutil.win_service_iter():
        try:
            name = svc.name()
            display_name = svc.display_name()
            svc_status = svc.status()
            start_type = svc.start_type()
        except (psutil.Error, FileNotFoundError, OSError):
            continue

        # Görünen ad, önek ile başlıyor mu? (büyük/küçük harf duyarsız)
        if not display_name.casefold().startswith(prefix_lower):
            continue

        if status == "all" or svc_status == status:
            print(f"{name:<30} {display_name:<45} {svc_status:<12} {start_type}")
            count += 1

    print("-" * 110)
    print(f"Toplam {count} hizmet listelendi.")


if __name__ == "__main__":
    list_services_by_prefix("Ağ")

Burada “AĞ” ile başlayan hizmetleri listeledik: Ekran çıktısı aşağıdaki gibi olur.

PowerShell
HİZMET ADI                     GÖRÜNEN AD                                    DURUM        BAŞLANGIÇ TÜRÜ
--------------------------------------------------------------------------------------------------------------
NcaSvc                         Ağ Bağlantısı Yardımcısı                      stopped      manual
NcbService                     Ağ Bağlantısı Aracısı                         running      manual
NcdAutoSetup                   Ağ Bağlantılı Cihazların Otomatik Kurulumu    stopped      manual
Netman                         Ağ Bağlantıları                               running      manual
netprofm                       Ağ Listesi Hizmeti                            running      manual
NetSetupSvc                    Ağ Kurulum Hizmeti                            stopped      manual
NlaSvc                         Ağ Konumu Tanıma                              stopped      manual
nsi                            Ağ Depo Arabirimi Hizmeti                     running      automatic
--------------------------------------------------------------------------------------------------------------
Toplam 8 hizmet listelendi.

Yukarıda yaptığımız her iki örnek de psutil kütüphanesinin en basit ve temel işlemlerindendir. Bu tür senaryolar için psutil kütühanesi kullanılarak bir betik yazmak açıkçası psutil kütüphanesinden tamamen yaralanmıyorsunuz demektir.

İşte psutil ve diğer kütüphanelerle beraber yapabileceklerinizin kısa bir listesi:

1. Toplu Keşif ve Envanter: Belirli bir kriteri karşılayan tüm hizmetleri bulup raporlamak.

  • “Otomatik başlaması gereken ama şu an durmuş olan hizmetler” → sistemde bir sorun olduğunun işareti.
  • “Belirli bir kullanıcı hesabıyla çalışan tüm hizmetler” → güvenlik denetimi.
  • “Son 30 günde eklenen hizmetler” → istenmeyen yazılım tespiti.
  • Tüm hizmetleri CSV/JSON/Excel’e döküp envanter çıkarmak.

Kullanım: psutil listeleme + filtre + dosyaya yazma.

2. Durum İzleme ve Alarm: Kritik hizmetleri düzenli aralıklarla kontrol edip, beklenmedik durumda uyarı üretmek.

  • “Spooler durursa bana e-posta at.”
  • “SQL Server hizmeti 5 dakikadan uzun süredir durmuşsa Slack’e mesaj gönder.”
  • “Şu hizmetlerin durumunu Prometheus’a besle.”

Kullanım: psutil + smtplib / requests (webhook) + zamanlanmış görev.

3. Toplu Yapılandırma Değişikliği: Onlarca hizmetin başlangıç türünü tek seferde değiştirmek.

  • “Tüm Xbox hizmetlerini devre dışı bırak.”
  • “Tüm Bluetooth hizmetlerini manuel yap.”
  • “Bu sunucudaki tüm gereksiz hizmetleri devre dışı bırak, listesini de raporla.”

Kullanım: sc config <ad> start= disabled + döngü. Yönetici yetkisi şart.

4. Bağımlılık Analizi: Bir hizmeti durdurmadan önce ona bağımlı olan hizmetleri bulmak.

  • “X hizmetini durdurursam hangi hizmetler etkilenir?”
  • “Bu hizmetlerin bağımlılık ağacını çıkar.”
  • “Durdurulacak hizmete bağımlı başka bir hizmet çalışıyorsa uyar.”

Kullanım: sc enumdepend <ad> veya sc qc <ad> çıktısını ayrıştırma.

5. Zamanlanmış Bakım: Belirli saatlerde hizmetleri durdurup, işlem yapıp, tekrar başlatmak.

  • “Her gece 03:00’te SQL hizmetini durdur, yedek al, başlat.”
  • “Hafta sonu boyunca gereksiz hizmetleri kapat, pazartesi aç.”
  • “Güncelleme öncesi ilgili hizmetleri durdur, sonra başlat.”

Kullanım: sc stop / sc start + Windows Task Scheduler + Python betiği.

6. Güvenlik Denetimi: Hizmet yapılandırmalarını güvenlik açısından taramak.

  • “LocalSystem yerine NetworkService ile çalışması gereken hizmetler.”
  • “Devre dışı olması gereken ama çalışan hizmetler.”
  • “Beklenmeyen bir kullanıcı hesabıyla çalışan hizmetler.”
  • “Açıklaması olmayan veya şüpheli görünen hizmetler.”

Kullanım: psutil + sc qc çıktısı + kural tabanlı filtre.

7. Kaynak Tüketimi Analizi: Hangi hizmetin ne kadar CPU/bellek/disk kullandığını izlemek.

  • “En çok bellek kullanan 10 hizmeti listele.”
  • “Şu hizmetin PID’sini bul, kaynak tüketimini izle.”
  • “Bir hizmetin ani CPU artışı yaptığı anları logla.”

Kullanım: psutil (hizmet + süreç bilgisi birleştirme).

8. Uzak Yönetim: Birden fazla sunucudaki hizmetleri tek merkezden yönetmek.

  • “50 sunucuda ZTDNS hizmetini durdur.”
  • “Tüm sunuculardan hizmet envanterini topla.”
  • “Belirli bir sunucuda hizmet çökerse otomatik müdahale et.”

Kullanım: sc \\sunucu_adı stop <hizmet> (sc’nin uzak modu) veya WinRM/SSH + Python.

9. Otomatik Kurtarma: Çöken bir hizmeti algılayıp otomatik yeniden başlatmak.

  • “Spooler 3 dakika içinde 2 kez çökerse yeniden başlat ve logla.”
  • “Kritik hizmet durduğunda otomatik start komutu gönder.”
  • “Yeniden başlatma başarısız olursa yöneticiye bildir.”

Kullanım: psutil (durum kontrolü) + sc start (müdahale) + log.

10. Entegrasyon Senaryoları: Hizmet yönetimini başka sistemlere bağlamak.

  • Web arayüzü: “Panelde ‘Hizmeti Yeniden Başlat’ butonu olsun.” → Flask/FastAPI + sc.
  • CI/CD: “Deployment öncesi X hizmetini durdur, sonrasında başlat.” → pipeline adımı.
  • İzleme sistemleri: “Hizmet durumlarını Zabbix/Prometheus/Nagios’a besle.”
  • Chatbot: “Slack’ten ‘Spooler’ı başlat’ komutu ver.”
  • Olay günlüğü: “Hizmet çöktüğünde Event Log’a bak, sebebini raporla.”

11. Karşılaştırma ve Sapma Tespiti: İki farklı zamandaki hizmet listesini karşılaştırıp değişiklikleri bulmak.

  • “Dün ile bugün arasında hangi hizmetler eklendi/silindi?”
  • “İki sunucu arasındaki hizmet farkları neler?”
  • “Bu hizmetin başlangıç türü ne zaman değişti?”

Kullanım: İki psutil anlık görüntüsünü set farkıyla karşılaştırma.

12. Test ve Doğrulama: Kurulum sonrası hizmetlerin doğru yapılandırıldığını kontrol etmek.

  • “Kurulum sonrası şu 10 hizmet çalışıyor mu?”
  • “Gerekli hizmetler otomatik başlatmaya ayarlı mı?”
  • “Kurulum betiği sonrası hizmet durumlarını raporla.”

Kullanım: psutil + assert tabanlı test.

Kaynaklar

Benzer Yazılar

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir