Sistem yöneticiliğinde en sık karşılaşılan sorunların başında “Bu servis neden başlangıçta çalışıyor?” veya “Sunucu açılışta neden bu kadar yavaş?” soruları gelir. Windows Server ortamlarında başlangıç programlarını yönetmek, hem performans optimizasyonu hem de güvenlik açısından kritik bir beceridir. GUI üzerinden bu işlemleri yapmak mümkün olsa da, CMD ve PowerShell komutlarını kullanmak özellikle uzak sunucu yönetimi ve otomasyon senaryolarında hayat kurtarır.
Başlangıç Programları Nerede Saklanır?
Windows’ta başlangıç programları birkaç farklı konumda tutulur ve bunların hepsini bilmek, sistemi tam anlamıyla kontrol altına almanın temelidir.
Registry konumları:
- HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun: Mevcut kullanıcı için başlangıç programları
- HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRun: Tüm kullanıcılar için başlangıç programları
- HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunOnce: Bir kere çalışıp silinecek programlar
- HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunOnce: Kullanıcı bazlı tek seferlik başlangıç
Klasör konumları:
- C:ProgramDataMicrosoftWindowsStart MenuProgramsStartup: Tüm kullanıcılar için başlangıç klasörü
- C:Users%USERNAME%AppDataRoamingMicrosoftWindowsStart MenuProgramsStartup: Mevcut kullanıcının başlangıç klasörü
Servisler: Windows servisleri ayrı bir kategori olarak ele alınmalıdır. Otomatik başlayan servisler, yukarıdaki konumlardan bağımsız şekilde yönetilir.
CMD ile Mevcut Başlangıç Programlarını Listeleme
İlk adım her zaman mevcut durumu görmektir. Bir sunucuya bağlandığınızda ilk yapmanız gereken şey, neyin çalıştığını tespit etmektir.
WMIC ile Başlangıç Programlarını Görme
wmic startup get caption, command, location, user
Bu komut size başlangıç programlarının adını, çalıştırdıkları komutu, kayıt defterindeki konumunu ve hangi kullanıcıya ait olduğunu gösterir. Özellikle sorun giderme sırasında bu çıktıyı bir dosyaya yönlendirmek çok işe yarar:
wmic startup get caption, command, location, user > C:logsstartup_audit.txt
Reg Query ile Registry Tabanlı Başlangıç Girişlerini Görme
reg query HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun
reg query HKCUSOFTWAREMicrosoftWindowsCurrentVersionRun
64 bit sistemlerde 32 bit uygulamalar için ayrı bir registry hive kullanılır. Bunu atlamak ciddi sorunlara yol açabilir:
reg query HKLMSOFTWAREWOW6432NodeMicrosoftWindowsCurrentVersionRun
Başlangıç Klasörü İçeriğini Listeleme
dir "C:ProgramDataMicrosoftWindowsStart MenuProgramsStartup" /b
dir "%APPDATA%MicrosoftWindowsStart MenuProgramsStartup" /b
/b parametresi sadece dosya adlarını gösterir, çıktıyı temiz tutar. Script’lerde kullanırken tercih etmeniz gereken format budur.
Başlangıç Programı Ekleme
Şimdi asıl işe geliyoruz. Bir uygulamayı başlangıca eklemek için birkaç yöntem var.
Registry Üzerinden Başlangıç Programı Ekleme
Tüm kullanıcılar için bir program eklemek istediğinizde HKLM hive’ını kullanın. Bu işlem için yönetici yetkisi gereklidir:
reg add "HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun" /v "MonitoringAgent" /t REG_SZ /d "C:ToolsMonitoringAgentagent.exe -silent" /f
Parametrelerin açıklaması:
- /v: Değer adı (Value Name), yani programın registry’deki tanımlayıcısı
- /t REG_SZ: Veri tipi, string değer için REG_SZ kullanılır
- /d: Çalıştırılacak komut veya uygulama yolu
- /f: Onay istemeden üzerine yaz
Sadece mevcut kullanıcı için eklemek istiyorsanız:
reg add "HKCUSOFTWAREMicrosoftWindowsCurrentVersionRun" /v "PersonalBackup" /t REG_SZ /d "C:Scriptsbackup.bat" /f
Başlangıç Klasörüne Kısayol Ekleme
Bazen registry yerine başlangıç klasörünü tercih edersiniz, özellikle basit script’ler veya batch dosyaları için:
copy "C:Scriptsstartup_check.bat" "C:ProgramDataMicrosoftWindowsStart MenuProgramsStartup"
Ya da bir kısayol oluşturmak için PowerShell’i CMD içinden çağırabilirsiniz:
powershell -Command "$WshShell = New-Object -comObject WScript.Shell; $Shortcut = $WshShell.CreateShortcut('C:ProgramDataMicrosoftWindowsStart MenuProgramsStartupMyApp.lnk'); $Shortcut.TargetPath = 'C:MyAppmyapp.exe'; $Shortcut.Arguments = '--autostart'; $Shortcut.Save()"
Başlangıç Programı Kaldırma
Güvenlik denetimlerinde veya sorun giderme sırasında istemediğiniz başlangıç girişlerini kaldırmanız gerekecektir.
Registry Girişini Silme
reg delete "HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun" /v "IstenmedikProgram" /f
reg delete "HKCUSOFTWAREMicrosoftWindowsCurrentVersionRun" /v "IstenmedikProgram" /f
/f parametresi olmadan bu komut size onay sorar. Script’lerde her zaman /f kullanın, aksi halde script takılıp kalır.
Başlangıç Klasöründen Dosya Kaldırma
del "C:ProgramDataMicrosoftWindowsStart MenuProgramsStartupistenmeyen_uygulama.lnk" /f
Windows Servisleri ile Başlangıç Yönetimi
Başlangıç programları meselesinde servisleri ayrı tutmamak büyük bir hata olur. Windows Server ortamında çoğu kritik servis, registry başlangıç kayıtları yerine Windows Service Manager üzerinden yönetilir.
SC Komutu ile Servis Başlangıç Tipini Yönetme
Bir servisin başlangıç tipini görmek için:
sc query "Spooler"
sc qc "Spooler"
sc query çalışma durumunu, sc qc ise konfigürasyon bilgilerini (başlangıç tipi dahil) gösterir.
Bir servisi otomatik başlayacak şekilde ayarlamak:
sc config "W3SVC" start= auto
Dikkat edin: start= ile auto arasında bir boşluk var. Bu bir yazım hatası değil, sc komutunun sözdizimi böyle. Bunu atlarsanız komut çalışmaz.
Diğer başlangıç tipleri:
- auto: Sistem başlangıcında otomatik başlar
- delayed-auto: Sistem başladıktan bir süre sonra başlar (performans için iyi)
- demand: Sadece elle başlatılır
- disabled: Tamamen devre dışı
sc config "Fax" start= disabled
sc config "WSearch" start= delayed-auto
NET Komutu ile Servis Yönetimi
net start "Windows Update"
net stop "Windows Update"
net start ve net stop komutları anlık başlatma/durdurma için kullanılır, ancak başlangıç tipini değiştirmez. Sunucuyu yeniden başlattığınızda servis yine aynı konfigürasyonla gelir.
Gerçek Dünya Senaryosu 1: Yeni Server Kurulumu Sonrası Sertleştirme
Bir Windows Server 2019 kurulumu tamamlandı ve sunucuyu production’a almadan önce gereksiz servisleri ve başlangıç programlarını temizlemeniz gerekiyor. İşte tipik bir sertleştirme script’i:
@echo off
echo Gereksiz servisler devre disi birakiliyor...
:: Fax servisi
sc config "Fax" start= disabled
sc stop "Fax" 2>nul
:: Remote Registry - Bunu devre disi birakmak guvenlik acisindan onemli
sc config "RemoteRegistry" start= disabled
sc stop "RemoteRegistry" 2>nul
:: Xbox ile ilgili servisler (Server'da ne isi var?)
sc config "XblAuthManager" start= disabled 2>nul
sc config "XblGameSave" start= disabled 2>nul
sc config "XboxNetApiSvc" start= disabled 2>nul
:: Windows Search - Sunucu rolune gore karar verin
:: Dosya sunucularinda acik birakin, web sunucularinda kapatabilirsiniz
:: sc config "WSearch" start= disabled
echo Mevcut startup programlari kontrol ediliyor...
wmic startup get caption, command, location > C:logsstartup_before_hardening.txt
echo Tamamlandi. Log dosyasini kontrol edin: C:logsstartup_before_hardening.txt
Bu script’i çalıştırmadan önce mutlaka C:logs dizininin var olduğundan emin olun:
if not exist C:logs mkdir C:logs
Gerçek Dünya Senaryosu 2: Uzaktan Çalışan Bir İzleme Ajanını Dağıtmak
Bir IT ekibi olarak 50 sunucuya izleme ajanı dağıtmanız gerekiyor. Her sunucuda ajanın başlangıçta çalışmasını istiyorsunuz. Bu işlemi tek tek yapmak yerine CMD script’i kullanabilirsiniz:
@echo off
setlocal
set AGENT_PATH=C:MonitoringAgentagent.exe
set AGENT_NAME=CompanyMonitoringAgent
set AGENT_ARGS=-config C:MonitoringAgentconfig.ini -silent
:: Kurulum dosyasini kopyala (kaynak bir network share'den geldigi varsayiliyor)
if not exist "C:MonitoringAgent" mkdir "C:MonitoringAgent"
copy "\fileservertoolsMonitoringAgent*" "C:MonitoringAgent" /Y
:: Registry'e ekle
reg add "HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun" ^
/v "%AGENT_NAME%" ^
/t REG_SZ ^
/d ""%AGENT_PATH%" %AGENT_ARGS%" ^
/f
:: Simdi baslatmak istiyorsak
start "" "%AGENT_PATH%" %AGENT_ARGS%
:: Dogrulama
reg query "HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun" /v "%AGENT_NAME%"
if %errorlevel% == 0 (
echo [OK] %AGENT_NAME% basayla eklendi.
) else (
echo [HATA] Kayit eklenemedi!
exit /b 1
)
Bu script’i PsExec veya Group Policy üzerinden tüm sunuculara dağıtabilirsiniz.
Gerçek Dünya Senaryosu 3: Güvenlik Olayı Sonrası Denetim
Bir sunucuda şüpheli aktivite tespit ettiniz. Hızlıca tüm başlangıç noktalarını denetlemeniz gerekiyor. Aşağıdaki kapsamlı denetim script’i işinizi görecektir:
@echo off
set LOGFILE=C:incident_responsestartup_audit_%date:~-4,4%%date:~-7,2%%date:~-10,2%.txt
if not exist C:incident_response mkdir C:incident_response
echo =============================== >> %LOGFILE%
echo STARTUP AUDIT - %date% %time% >> %LOGFILE%
echo =============================== >> %LOGFILE%
echo. >> %LOGFILE%
echo [WMIC STARTUP] >> %LOGFILE%
wmic startup get caption, command, location, user >> %LOGFILE%
echo. >> %LOGFILE%
echo [HKLM RUN] >> %LOGFILE%
reg query "HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun" >> %LOGFILE%
echo. >> %LOGFILE%
echo [HKCU RUN] >> %LOGFILE%
reg query "HKCUSOFTWAREMicrosoftWindowsCurrentVersionRun" >> %LOGFILE%
echo. >> %LOGFILE%
echo [HKLM RUNONCE] >> %LOGFILE%
reg query "HKLMSOFTWAREMicrosoftWindowsCurrentVersionRunOnce" 2>>%LOGFILE%
echo. >> %LOGFILE%
echo [WOW6432 RUN] >> %LOGFILE%
reg query "HKLMSOFTWAREWOW6432NodeMicrosoftWindowsCurrentVersionRun" >> %LOGFILE%
echo. >> %LOGFILE%
echo [STARTUP KLASORU - TUM KULLANICILAR] >> %LOGFILE%
dir "C:ProgramDataMicrosoftWindowsStart MenuProgramsStartup" >> %LOGFILE%
echo. >> %LOGFILE%
echo [OTOMATIK SERVISLER] >> %LOGFILE%
sc query type= all state= running >> %LOGFILE%
echo Denetim tamamlandi: %LOGFILE%
Bu script çıktısını güvenli bir konuma kopyalayın ve normal baseline ile karşılaştırın. Farklılıklar olayın kapsamını anlamanıza yardımcı olur.
PowerShell ile Hibrit Yaklaşım
CMD’nin sınırlarına takıldığınızda PowerShell’i CMD script’lerinize entegre edebilirsiniz. Modern Windows Server yönetiminde saf CMD yerine bu hibrit yaklaşım çok daha güçlüdür.
Tüm başlangıç programlarını filtreli görme:
powershell -Command "Get-CimInstance Win32_StartupCommand | Select-Object Name, Command, Location, User | Format-List"
Belirli bir kullanıcıya ait başlangıç programlarını görme:
powershell -Command "Get-CimInstance Win32_StartupCommand | Where-Object {$_.User -eq 'DOMAINkullanici'} | Format-List"
Yaygın Hatalar ve Dikkat Edilmesi Gerekenler
Yol boşlukları sorunu: Program yolu boşluk içeriyorsa tırnak işaretleri şart. Registry’e eklerken dışarıdaki tırnaklara ek olarak iç tırnaklar da gerekebilir:
reg add "HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun" /v "MyApp" /t REG_SZ /d ""C:Program FilesMyAppmyapp.exe" --start" /f
Yetki sorunları: HKLM’ye yazma işlemi için yönetici yetkisi gerekir. Script’inizi her zaman “Yönetici olarak çalıştır” ile başlatın veya başında yetki kontrolü ekleyin:
net session >nul 2>&1
if %errorlevel% neq 0 (
echo Bu script yonetici yetkisi gerektiriyor!
exit /b 1
)
RunOnce tuzağı: RunOnce kayıtları sistem bir sonraki açılışta silindikten sonra çalışır. Kalıcı başlangıç için RunOnce yerine Run anahtarını kullanın.
WOW6432Node gözden kaçırma: 64 bit sistemlerde 32 bit uygulamalar kendi registry alanına yazar. Denetim yaparken bu anahtarı atlamak eksik bilgiye yol açar.
Servis bağımlılıkları: Bir servisi devre dışı bırakmadan önce başka servislerin buna bağımlı olup olmadığını kontrol edin:
sc enumdepend "W3SVC" 1000
Değişiklikleri Doğrulama
Her değişiklikten sonra doğrulama yapmak profesyonel yaklaşımın gereğidir. Bir şeyi eklediğinizi veya sildiğinizi varsaymak yerine mutlaka teyit edin:
:: Registry girisi dogrulama
reg query "HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun" /v "MonitoringAgent"
if %errorlevel% == 0 (echo Kayit mevcut) else (echo Kayit bulunamadi)
:: Servis durumu dogrulama
sc query "W3SVC" | find "STATE"
Sonuç
CMD ile başlangıç programlarını yönetmek, ilk bakışta basit görünen ama derinleştikçe nüansları ortaya çıkan bir konu. Registry’deki Run anahtarları, başlangıç klasörleri, Windows servisleri ve bunların birbirleriyle olan ilişkileri hakkında net bir tablo oluşturmadan yapılan değişiklikler beklenmedik sonuçlar doğurabilir.
Günlük iş akışınıza entegre edebileceğiniz birkaç temel alışkanlık edinin: Değişiklik yapmadan önce mevcut durumu bir log dosyasına kaydedin, her değişikliği doğrulayın ve script’lerinize hata kontrolü ekleyin. Güvenlik olaylarında ise standart registry konumlarına ek olarak WOW6432Node ve RunOnce gibi daha az bilinen noktaları da unutmayın.
Komut satırı üzerinde başlangıç programlarını yönetme becerisi, özellikle GUI erişiminin olmadığı uzak sunucu senaryolarında veya toplu dağıtım işlemlerinde sizi her zaman bir adım öne taşır. Bu komutları sadece teorik olarak değil, bir test ortamında deneyerek öğrenmek en kalıcı yöntem olacaktır.