1. Anasayfa
  2. Active Directory

Domain Kullanıcısı ile Çalışan Servis Hesabı Restart Sonrası Çalışmıyorsa?


Kurumsal Windows ortamlarında servislerin belirli bir domain kullanıcısı hesabı ile çalıştırılması güvenlik ve yetkilendirme yönetimi açısından oldukça yaygın bir uygulamadır. Bu sayede hem servislerin erişim denetimi sağlanır hem de merkezi yönetim kolaylaşır. Ancak pek çok sistem yöneticisi bir servisin restart (ör. sunucu yeniden başlatılması) sonrası başlatılamaması ve “Error 1069: The service did not start due to a logon failure” hatası ile karşılaşma sorunuyla karşılaşabilir.

Bu durum özellikle domain kullanıcıları ile çalışan servislerin kurulum ve yapılandırma süreçlerinde dikkat edilmesi gereken önemli bir noktadır.

Bu makalemde bu sorunun kök nedenlerini neden sıklıkla karşılaşıldığını çözüm yollarını ve en iyi uygulama yöntemlerini (best practices) detaylı bir şekilde ele alacağız.

Hatanın Tanımı ve Belirtileri

  • Servisin Log On sekmesinde domain kullanıcısı (ör. DOMAIN\sqlsvc) atanmış.
  • Servis manuel olarak başlatıldığında sorunsuz çalışıyor.
  • Ancak sunucu restart edildiğinde servis otomatik olarak başlamıyor ve şu hata mesajını veriyor:
Error 1069: The service did not start due to a logon failure
  • Manuel başlatmaya çalıştığınızda da aynı hata tekrarlanıyor.

Bu hata servisin domain kullanıcısı hesabı ile kimlik doğrulama sürecinin başarısız olduğunu ve doğru parola ile oturum açma işleminin sağlanamadığını gösterir.

Olası Kök Neden – GPO (Group Policy) Etkisi

Windows ortamlarında servis hesapları GPO (Group Policy Object) ile yönetilebilir. Özellikle güvenlik veya otomasyon amacıyla:

  • Belirli bir servisin domain kullanıcısı ile çalışması GPO üzerinden atanabilir.
  • Ancak GPO üzerinden parola bilgisi atanamaz!

Bu durumda:

  1. GPO servisin Log On sekmesine domain kullanıcısını yazar.
  2. Ancak parola bilgisi (credential) GPO tarafından iletilemez.
  3. Servis restart sonrası parolayı bilmediği için kimlik doğrulama başarısız olur.
  4. “Error 1069” hatası alınır.

Bu nedenle sorunun kök nedeni %99 oranında GPO kaynaklıdır.

Sorunun Daha Teknik Arkası (Detaylar)

Windows servisleri, Win32_Service WMI sınıfı ile yönetilir. Bir servis için:

  • StartName → Kullanıcı adı
  • StartPassword → Parola (Bellekte tutulur)

GPO, StartName (domain account) değerini atar ama StartPassword’ü atayamaz. Çünkü:

  • GPO şifre ataması yapacak bir mekanizma içermez.
  • Parola güvenliği nedeniyle GPO ile dağıtılamaz.

Sonuçta restart sonrası servis, kullanıcı adıyla başlatılmaya çalışır ama parola bilgisi eksiktir.

Çözüm Yolları – Detaylı Anlatım

PowerShell Script + Görev Zamanlayıcı (Tavsiye Edilen ve Kurumsal Yöntem)

Bu yöntemde:

  • Her sunucu açılışında (startup) servisin domain kullanıcı adı ve parolası otomatik atanır.
  • Servis, kimlik doğrulama hatasına düşmeden başlar.

Adımlar:

  1. PowerShell Script’i Hazırlayın:
$serviceName = "ReportServer"
$username = "DOMAIN\\sqlsvc"
$password = "ParolaBuraya"

$svc = Get-WmiObject Win32_Service -Filter "Name='$serviceName'"
$svc.Change($null,$null,$null,$null,$null,$null,$username,$password)
Start-Service -Name $serviceName
  1. Script’i .ps1 dosyasına kaydedin (ör. C:\Scripts\Start-Service.ps1).
  2. Görev Zamanlayıcı (Task Scheduler) ile bu script’i:
    • Trigger: At Startup (Bilgisayar açıldığında)
    • Action: PowerShell script çalıştır
    • Highest Privileges (Yönetici yetkisiyle çalıştır)

Bu yöntemle, servis her açılışta doğru kullanıcı/parola ile başlatılır.

GPO’yu Servis Özelinde Devre Dışı Bırakma

Eğer GPO ile bu servisin yönetilmesine gerek yoksa:

  1. Servisin GPO atamasını devre dışı bırakın (ör. GPO Filter ile bu servisi kapsam dışına çıkarın).
  2. Servis özelliklerinden Log On sekmesine kullanıcı adı/parola bilgilerini manuel olarak yazın.
  3. Bu yöntemle parola bellekte tutulur ve GPO karışmadığı için servis restart sonrası otomatik başlar.

Parolayı Script İçinde Güvenli Saklama (En İyi Uygulama)

PowerShell scriptinde parolanın düz metin (plaintext) yazılması güvenlik açığı oluşturur. Bunun yerine:

  1. Parolayı şifreli credential dosyasına kaydedin:
$User = "DOMAIN\sqlsvc"
$Password = Read-Host "Şifreyi girin" -AsSecureString
$Cred = New-Object PSCredential($User, $Password)
$Cred | Export-Clixml -Path "C:\Scripts\sqlsvc.cred"

Script, credential dosyasından güvenli şekilde parola çeksin:

$serviceName = "ReportServer"
$cred = Import-Clixml "C:\Scripts\sqlsvc.cred"

$username = $cred.UserName
$password = $cred.GetNetworkCredential().Password

$svc = Get-WmiObject Win32_Service -Filter "Name='$serviceName'"
$svc.Change($null,$null,$null,$null,$null,$null,$username,$password)
Start-Service -Name $serviceName

Karşılaştırmalı Öneriler

YöntemGüvenlikYönetim KolaylığıUygunluk
PowerShell + Görev Zamanlayıcı🛡️ Yüksek⚙️ OrtaKurumsal
GPO Devre Dışı + Manuel Giriş🛡️ Orta⚙️ YüksekKüçük ortam
Parola Şifreleme (Credential)🛡️ Çok Yüksek⚙️ OrtaTavsiye Edilen