
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:
pip install psutilArdından aşağıdaki kodu çalıştırabilirsiniz:
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.
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
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.
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
