CMD ile Yazıcı Yönetimi ve Sorun Giderme

Yazıcı sorunları sistem yöneticilerinin en sık karşılaştığı ve çoğu zaman en sinir bozucu problemlerin başında gelir. Kullanıcıdan “yazıcı çalışmıyor” şikayeti geldiğinde, GUI üzerinden tıkla-tıkla yöntemiyle sorun gidermeye çalışmak hem zaman kaybettirir hem de her seferinde aynı adımları tekrarlamak zorunda kalırsınız. CMD ve PowerShell komutlarını öğrendiğinizde ise aynı işlemleri saniyeler içinde yapabilir, uzak sistemlerde bile müdahale edebilirsiniz. Bu yazıda Windows ortamında CMD tabanlı yazıcı yönetimini, sorun giderme tekniklerini ve gerçek hayat senaryolarını ele alacağız.

Temel Yazıcı Komutlarına Giriş

Windows’ta komut satırından yazıcı yönetimi için birden fazla araç mevcut. Bunların başında net komutu, wmic, printui.dll ve PowerShell’in Get-Printer ailesi geliyor. Hangisini kullanacağınız büyük ölçüde Windows sürümüne ve senaryonuza göre değişiyor.

Önce sisteminizde tanımlı yazıcıları listeleyelim:

wmic printer get name, status, default

Bu komut size mevcut yazıcıların adını, durumunu ve hangisinin varsayılan olarak ayarlandığını gösterir. Çıktıda Status sütununda Unknown ya da Error görüyorsanız sorun gidermeye oradan başlayabilirsiniz.

PowerShell tarafında ise şu komutu kullanabilirsiniz:

Get-Printer | Select-Object Name, PrinterStatus, DriverName, PortName

Bu komut daha temiz ve okunabilir bir çıktı sunar. PrinterStatus değeri Normal dışında bir şey gösteriyorsa yazıcıda aktif bir sorun var demektir.

Yazıcı Kuyruğunu Yönetmek

Sysadmin hayatının vazgeçilmez anlarından biri: yazıcı kuyruğu kilitleniyor, işler bir türlü çıkmıyor, kullanıcılar çığlık atıyor. Bu durumda yapılacak ilk şey print spooler servisini yeniden başlatmak ve kuyruktaki işleri temizlemektir.

Önce Spooler servisini durdurun:

net stop spooler

Ardından kuyruk klasörünü temizleyin. Kuyruktaki bekleyen işler C:WindowsSystem32spoolPRINTERS klasöründe tutulur:

del /Q /F /S "%systemroot%System32spoolPRINTERS*.*"

Sonra Spooler servisini tekrar başlatın:

net start spooler

Bu üç adımı tek bir bat dosyasına koyup masaüstüne kısayol eklerseniz, “yazıcı kuyruğu kilitlendiyse ne yapacaksın?” sorusunun cevabı artık saniyeler içinde uygulanabilir hale gelir. Özellikle yoğun baskı yapan muhasebe departmanları için bu scripti hazır bulundurmak son derece işe yarar.

Belirli bir yazıcının kuyruğundaki işleri görmek için:

wmic printjob where "name like '%HP%'" get Document, Owner, Status, TimeSubmitted

Bu komut adında “HP” geçen yazıcıya ait tüm baskı işlerini listeler. Owner sütunuyla kimin iş gönderdiğini de görebilirsiniz, bu özellikle büyük ofislerde “kim kuyruğu tıkıyor” sorusunu yanıtlamada çok işe yarar.

Yazıcı Ekleme ve Kaldırma

Ağ Yazıcısı Ekleme

Bir kullanıcıya uzaktaki print server üzerindeki yazıcıyı bağlamak için:

rundll32 printui.dll,PrintUIEntry /in /n "\PRINTSERVER01Muhasebe-HP4015"

Bu komutu bir login script içine koyabilir ya da GPO aracılığıyla dağıtabilirsiniz. Kullanıcı oturum açtığında yazıcı otomatik olarak eklenir.

Yerel bir yazıcı eklemek için ise printui.dll biraz daha farklı çalışır:

rundll32 printui.dll,PrintUIEntry /if /b "HP LaserJet P2055" /f "%windir%infntprint.inf" /r "LPT1:" /m "HP LaserJet P2055 PCL6"

Buradaki parametreler şunlardır:

  • /if: Sürücü dosyasından kurulum yapar
  • /b: Yazıcı adını belirtir
  • /f: INF dosyasının yolunu belirtir
  • /r: Port adını belirtir
  • /m: Model adını belirtir

Yazıcı Kaldırma

Bir yazıcıyı komut satırından kaldırmak için:

rundll32 printui.dll,PrintUIEntry /dl /n "HP LaserJet P2055" /q

/q parametresi, onay penceresi çıkmadan sessiz modda silme yapar. Toplu temizlik scriptlerinde bu parametreyi mutlaka kullanın, aksi halde her yazıcı için ekrana onay penceresi gelir.

Bir yazıcıyı WMIC ile de kaldırabilirsiniz:

wmic printer where name="HP LaserJet P2055" call delete

Yazıcı Sürücüsü Yönetimi

Sürücü sorunları yazıcı problemlerinin ikinci büyük kaynağıdır. Yanlış sürücü, eski sürücü ya da bozulmuş sürücü pek çok beklenmedik davranışa yol açar.

Yüklü sürücüleri listelemek için:

wmic printerdriver get name, version, driverpath

Belirli bir sürücüyü kaldırmak için önce o sürücüyü kullanan yazıcıları kaldırmanız, ardından sürücüyü silmeniz gerekir:

rundll32 printui.dll,PrintUIEntry /dd /m "HP Universal Printing PCL6" /v "Type 3 - User Mode" /e

Parametreler:

  • /dd: Sürücüyü sil
  • /m: Model adı
  • /v: Sürücü versiyonu (ortam türü)
  • /e: Hata mesajlarını göster

Print server üzerinde uzaktan sürücü yönetimi yapmanız gerekiyorsa, printui.dll komutlarına /s \SUNUCU_ADI parametresini eklemeniz yeterli:

rundll32 printui.dll,PrintUIEntry /s /t2 /n "\PRINTSERVER01"

Bu komut uzaktaki print server’ın sürücü yönetim arayüzünü açar.

Port Yönetimi

Yazıcı portları da sık sık sorun çıkaran bileşenlerdir. Özellikle IP adresi değişen ağ yazıcılarında port ayarını güncellemek gerekir.

Mevcut portları listeleyin:

wmic printerport get name, type, hostaddress

Yeni bir TCP/IP port eklemek için:

cscript %WINDIR%System32Printing_Admin_Scriptsen-USprnport.vbs -a -r "IP_192.168.1.50" -h 192.168.1.50 -o raw -n 9100

Mevcut bir portun IP adresini güncellemek ise şu şekilde yapılır:

cscript %WINDIR%System32Printing_Admin_Scriptsen-USprnport.vbs -t -r "IP_192.168.1.50" -h 192.168.1.55

Bu senaryo özellikle şu durumda hayat kurtarır: Ağdaki yazıcının IP adresi değişti, onlarca bilgisayarda port ayarı güncellenmesi gerekiyor. Scripti bir döngüye alıp tüm makinelerde çalıştırdığınızda saatler sürecek işi dakikalara indirirsiniz.

Varsayılan Yazıcı Ayarlama

Varsayılan yazıcıyı komut satırından ayarlamak için WMIC kullanabilirsiniz:

wmic printer where name="HP LaserJet P2055" call setdefaultprinter

Ya da daha modern bir yöntem olan PowerShell ile:

(New-Object -ComObject WScript.Network).SetDefaultPrinter("\PRINTSERVER01Muhasebe-HP4015")

Bu komutu özellikle login scriptlerinde kullanıyorum. Kullanıcı hangi bilgisayara oturum açarsa açsın, departmanına göre doğru varsayılan yazıcı otomatik seçilmiş oluyor.

Gerçek Dünya Senaryoları

Senaryo 1: Toplu Yazıcı Kaldırma ve Yeniden Ekleme

Print server taşıma ya da yeniden adlandırma sırasında tüm istemcilerdeki eski yazıcı bağlantılarını kaldırıp yenilerini eklemek gerekir. Bunun için şöyle bir batch script işe yarar:

@echo off
:: Eski print server yazıcilarini kaldir
for /f "tokens=*" %%a in ('wmic printer where "portname like '\\ESKISERVER\%'" get name /format:list ^| findstr "Name="') do (
    set YAZICI=%%a
    set YAZICI=!YAZICI:Name=!
    rundll32 printui.dll,PrintUIEntry /dl /n "!YAZICI!" /q
)

:: Yeni yazicilari ekle
rundll32 printui.dll,PrintUIEntry /in /n "\YENISERVERMuhasebe-HP4015"
rundll32 printui.dll,PrintUIEntry /in /n "\YENISERVERIT-Kyocera"
rundll32 printui.dll,PrintUIEntry /in /n "\YENISERVERSatis-Canon"

echo Yazici guncelleme tamamlandi.
pause

Bu scripti GPO ile startup script olarak dağıtırsanız, sunucu taşıma işlemi kullanıcılar açısından tamamen şeffaf hale gelir.

Senaryo 2: Print Spooler Crash Döngüsü

Özellikle Windows Server 2012-2016 ortamlarında bazen Print Spooler servisi sürekli çöküyor ve kendiliğinden yeniden başlıyordu. Bu durumda önce servis crash loglarına bakın:

wevtutil qe System /q:"*[System[Provider[@Name='Service Control Manager'] and (EventID=7034 or EventID=7031) and TimeCreated[timediff(@SystemTime) <= 86400000]]]" /f:text /rd:true /c:20

Bu komut son 24 saat içinde servis crash olaylarını listeler. Çıktıda hangi servisin ne sıklıkla çöktüğünü görebilirsiniz.

Sonrasında sürücü bazlı bir crash mı yoksa spooler servisinin kendisindeki bir sorun mu olduğunu anlamak için Event Viewer’daki Application loglarını da kontrol edin:

wevtutil qe Application /q:"*[System[Provider[@Name='Application Error'] and TimeCreated[timediff(@SystemTime) <= 86400000]]]" /f:text /rd:true /c:10 | findstr /i "spoolsv"

Eğer belirli bir sürücü sürekli crash’e neden oluyorsa, o sürücüyü izole edip güncel versiyonla değiştirmek gerekir.

Senaryo 3: Yazıcı Erişim İzinleri

Bir kullanıcı veya grup belirli bir yazıcıya erişemiyor şikayeti geldiğinde, komut satırından mevcut izinleri sorgulamak oldukça zaman kazandırır:

(Get-Printer -Name "Muhasebe-HP4015").PermissionSDDL

Bu PowerShell komutu yazıcının SDDL formatındaki izin tanımını döndürür. SDDL okumak başlangıçta zor gelebilir ama zamanla alışılıyor.

Daha okunabilir bir format için:

$yazici = Get-Printer -Name "Muhasebe-HP4015"
$sd = $yazici.PermissionSDDL
$securit = New-Object System.Security.AccessControl.CommonSecurityDescriptor($false,$false,$sd)
$securit.DiscretionaryAcl | ForEach-Object { $_ }

Yazıcı Tanı Araçları

Printer Diagnostics ile Otomatik Sorun Giderme

Windows’un yerleşik tanılama aracını komut satırından başlatmak için:

msdt.exe /id PrinterDiagnostic

Bu araç özellikle kullanıcılara uzaktan yönlendirme yaparken işe yarar. Telefonda “Başlat menüsüne sağ tıkla, Çalıştır’a tıkla, şunu yaz…” diye anlatmak yerine tek komutla tanılama başlatılır.

Test Sayfası Yazdırma

Bir yazıcının gerçekten çalışıp çalışmadığını doğrulamak için komut satırından test sayfası gönderebilirsiniz:

rundll32 printui.dll,PrintUIEntry /k /n "HP LaserJet P2055"

Daha basit bir yöntem olarak notepad üzerinden de test edebilirsiniz:

echo Test Sayfasi - %date% %time% > %temp%testprint.txt
notepad /p %temp%testprint.txt

Bu yöntem özellikle notepad’in sistemde açık olmadığı sunucu ortamlarında bile çalışır.

Print Server Sağlık Kontrolü

Bir print server’ı yönetiyorsanız, düzenli sağlık kontrolü yapmak için şu komutları bir script haline getirmenizi öneririm:

@echo off
echo === PRINT SERVER SAGLIK KONTROLU ===
echo Tarih: %date% Saat: %time%
echo.

echo [1] Spooler Servisi Durumu:
sc query spooler | findstr "STATE"
echo.

echo [2] Aktif Yazici Sayisi:
wmic printer get name | find /c "HP"
echo.

echo [3] Bekleyen Is Sayisi:
wmic printjob get name | find /c /v ""
echo.

echo [4] Kuyruk Klasoru Boyutu:
dir "%systemroot%System32spoolPRINTERS" | findstr "bytes"
echo.

echo [5] Son 1 Saatteki Spooler Hatalari:
wevtutil qe System /q:"*[System[Provider[@Name='Print Spooler'] and TimeCreated[timediff(@SystemTime) <= 3600000]]]" /f:text /rd:true /c:5
echo.
echo === KONTROL TAMAMLANDI ===

Bu scripti Task Scheduler’a ekleyip günlük olarak çalıştırın ve çıktıyı bir log dosyasına yönlendirin. Böylece sorun yaşanmadan önce erken uyarı yakalayabilirsiniz.

Uzak Bilgisayarda Yazıcı Yönetimi

Bir kullanıcının bilgisayarında uzaktan yazıcı yönetimi yapmak için PowerShell’in Invoke-Command gücünden yararlanın:

Invoke-Command -ComputerName KULLANICI-PC01 -ScriptBlock {
    # Kuyrugu temizle
    Stop-Service spooler -Force
    Remove-Item "$env:SystemRootSystem32spoolPRINTERS*" -Force -ErrorAction SilentlyContinue
    Start-Service spooler
    Write-Output "Kuyruk temizlendi, spooler yeniden baslatildi"
}

WinRM aktif değilse ya da uzak PowerShell bağlantısı kuramıyorsanız, PsExec ile de aynı işlemi yapabilirsiniz:

psexec \KULLANICI-PC01 -s net stop spooler
psexec \KULLANICI-PC01 -s del /Q /F "C:WindowsSystem32spoolPRINTERS*.*"
psexec \KULLANICI-PC01 -s net start spooler

Yazıcı Ayarlarını Dışa ve İçe Aktarma

Print server migration sırasında ya da yedekleme amacıyla tüm yazıcı ayarlarını export etmek için:

rundll32 printui.dll,PrintUIEntry /Ss /n "HP LaserJet P2055" /a "C:Backuphp4015_settings.dat" d g p s 7

Bu komut yazıcının tüm ayarlarını, port bilgilerini ve tercihleri bir DAT dosyasına kaydeder.

İçe aktarma için:

rundll32 printui.dll,PrintUIEntry /Sr /n "HP LaserJet P2055" /a "C:Backuphp4015_settings.dat" d g p s 7

Bu yöntem özellikle şablondan kurulum yapılan ortamlarda hayat kurtarır. Yazıcıyı bir kez doğru şekilde yapılandırıp export alırsanız, aynı model yazıcıyı başka bir yere eklerken sıfırdan uğraşmanıza gerek kalmaz.

Sık Karşılaşılan Hatalar ve Çözümleri

“Access Denied” Hatası: Yazıcı komutlarını çalıştırırken bu hatayı alıyorsanız, CMD veya PowerShell’i “Yönetici olarak çalıştır” seçeneğiyle açmanız gerekir. Bazı durumlarda SYSTEM hesabıyla çalışmak da gerekebilir.

“Printer Driver Not Found” Hatası: Sürücü deposunda aranan sürücü yoktur. pnputil /add-driver komutuyla önce sürücüyü Windows sürücü deposuna ekleyin, ardından yazıcı kurulumunu tekrarlayın.

Spooler Sürekli Çöküyor: Genellikle bozuk bir sürücüden kaynaklanır. %WINDIR%System32spooldrivers klasörünü inceleyip son eklenen sürücüleri tespit edin ve kaldırın.

Yazıcı “Offline” Görünüyor: Önce port bağlantısını kontrol edin. TCP/IP yazıcısı için ping atın, cevap alıyorsanız sorun portun kendisindedir. Winsock sıfırlaması da bazen işe yarar: netsh winsock reset komutunu çalıştırıp sistemi yeniden başlatın.

Sonuç

CMD ve PowerShell ile yazıcı yönetimi ilk bakışta karmaşık görünse de birkaç temel komutu öğrendikten sonra bu işlemleri GUI’ye kıyasla çok daha hızlı yapabilirsiniz. Spooler servisini yönetmek, kuyrukları temizlemek, sürücü sorunlarını tespit etmek, uzak sistemlerde müdahale etmek, bunların hepsi komut satırında birkaç saniye içinde halledilebiliyor.

En önemli tavsiyem şu: Sık kullandığınız komutları bat veya ps1 dosyaları haline getirin ve bunları merkezi bir klasörde tutun. Hem siz hem de ekibinizdeki diğer sysadminler bu scriptlerden yararlanabilir. Ayrıca print server üzerinde düzenli otomatik sağlık kontrolü scriptleri çalıştırmak, sorunları kullanıcılar fark etmeden önce tespit etmenizi sağlar. Yazıcı yönetimi asla sıfır sorun anlamına gelmiyor ama doğru araçlarla sorunları hızlıca çözmek kesinlikle mümkün.

Yorum yapın