7.01.2026

PSWindowsUpdate SendReport parametresi

Bir süredir PSWindowsUpdate modülünü kullanıyordum, ama SendReport parametresini kullanmayı bilmiyordum. Şu adresteki açıklamalara göre:

Install-WindowsUpdate -ComputerName MG-PC -MicrosoftUpdate -AcceptAll -AutoReboot -SendReport
-PSWUSettings @{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";Port=25} -Verbose

gibi bir kullanım mümkün. SenReport parametresi ile birlikte bir de PSWUSettings parametresi sonrasında verilen bir değişkende eposta sunucu adı, port numarası, kimden ve kime bilgileri de verilmiş. Ya da alternatif olarak PSWindowsUpdate modülünün kurulu olduğu

C:\Program Files\WindowsPowershell\Modules\PSWindowsUpdate

klasörününn altında PSWUSettings.xml adında bir dosya oluşturularak içine XML formatında bu bilgilerin kaydedebileceği ve sonradan kullanılabileceği belirtilmiş.

$setpath = "C:\Program Files\WindowsPowerShell\Modules\PSWindowsUpdate\PSWUSettings.xml"
@{SmtpServer="your.smtp.server";From="sender@email.address";To="recipient@email.address";Port=25} |
Export-Clixml -Path $setpath
Install-WindowsUpdate -ComputerName MG-PC -MicrosoftUpdate -AcceptAll -AutoReboot -SendReport -Verbose


6.01.2026

Sysmon - ek bilgiler

Sysmon konusunda yeni bazı şeyler öğrendim. Eski bazı kullanımları tekrar vurgulayayım.

sysmon64 -i        # Sysmon64.exe dosyasını C:\Windows klasörünün altına taşı ve hizmet olarak kur
sysmon64 -c # Mevcut yapılandırmayı göster
sysmon64 -s # Yapılandırma şemasını göster
sysmon64 -u # Kurulumu kaldır

Varsayılan olarak bir xml dosyası gösterilmeksizin sadece -i ile (veya sonradan -c -- ile sıfırlanarak) yapılandırıldığında sysmon aşağıdaki gibi bir durumda oluyor.

Sysmon64 -c
Current configuration:
- Service name:      Sysmon
- Driver name:      SysmonDrv
- Config file:     
   C:\Users\administrator\Defaults

- HashingAlgorithms: SHA256
- Network connection: disabled
- Archive Directory: -
- Image loading:     disabled
- DNS lookup:     
    enabled
No rules installed

Yapılandırma şemasını (configuration schema) ekrana bastırınca <option> bölümü çıkıyor.

    <options>
      <!-- Command-line only options -->
      <option switch="i" name="Install" argument="optional" noconfig="true" exclusive="true" />
      <option switch="c" name="Configuration" argument="optional" noconfig="true" exclusive="true" />
      <option switch="u" name="UnInstall" argument="optional" noconfig="true" exclusive="true" />
      <option switch="m" name="Manifest" argument="none" noconfig="true" exclusive="true" />
      <option switch="z" name="ClipboardInstance" argument="required" noconfig="true" exclusive="true" />
      <option switch="t" name="DebugMode" argument="optional" noconfig="true" />
      <option switch="btf" name="BTF" argument="optional" noconfig="true" />
      <option switch="service" name="Service" argument="none" noconfig="true" />
      <option switch="s" name="PrintSchema" argument="optional" noconfig="true" exclusive="true" />
      <option switch="nologo" name="NoLogo" argument="none" noconfig="true" />
      <option switch="accepteula" name="AcceptEula" argument="none" noconfig="true" />
      <option switch="-" name="ConfigDefault" argument="none" noconfig="true" />
      <!-- Configuration file -->
      <option switch="a" name="ArchiveDirectory" argument="required" />
      <option name="CaptureClipboard" argument="none" />
      <option switch="d" name="DriverName" argument="required" />
      <option switch="dns" name="DnsQuery" argument="optional" rule="true" />
      <option switch="g" name="PipeMonitoring" argument="required" rule="true" forceconfig="true" />
      <option switch="h" name="HashAlgorithms" argument="required" />
      <option name="DnsLookup" argument="required" />
      <option switch="k" name="ProcessAccess" argument="required" rule="true" forceconfig="true" />
      <option switch="l" name="ImageLoad" argument="optional" rule="true" />
      <option switch="n" name="NetworkConnect" argument="optional" rule="true" />
      <option switch="r" name="CheckRevocation" argument="optional" />
      <option name="FieldSizes" argument="required" />
    </options>

Burada option bölümünün altındaki switch'leri kullanarak yapılandırmayı değiştirmek mümkün. Örneğin varsayılan SHA256 hash'i yerine tüm hash'leri hesaplatmak için -h switch'ini aşağıdaki gibi kullanmak mümkün.

Sysmon64 -c -h *

Bunun sonucunda yapılanmamız aşağıdaki gibi olur.

Sysmon64 -c
Current configuration:
- Service name:      Sysmon
- Driver name:      SysmonDrv
- Config file:     
   "C:\Windows\Sysmon64.exe" -c -h *

- HashingAlgorithms:
SHA1,MD5,SHA256,IMPHASH
- Network connection: disabled
- Archive Directory: -
- Image loading:     disabled
- DNS lookup:     
    enabled
No rules installed

Ya da notepad.exe tarafından yapılan tüm NetworkConnect işlemlerini kayıt altına almak için "n" switch'i kullanılabilir.

Sysmon -c -n notepad.exe

Bunun sonucundaki yapılandırmamız da şu şekilde olur.

Sysmon64 -c
Current configuration:
- Service name:      Sysmon
- Driver name:      SysmonDrv
- Config file:     
   "C:\Windows\Sysmon64.exe" -c -n notepad.exe

- HashingAlgorithms: SHA256
- Network connection:
enabled
- Archive Directory: -
- Image loading:     disabled
- DNS lookup:     
    enabled
No rules installed

Görüldüğü gibi HashingAlgorithms alanı tekrar sadece SHA256'ya döndü, ama config file bölümünü en son kullandığımız komut satırını gösteriyor. Yani bu şekilde yapılan değişiklikler önceki değişikliklerin üzerine yazar, ekleme yapmaz.

Sysmon'un bir de -m komut satırı anahtarı var. Bu, aslında sysmon'u bir hizmet olarak kurmaz ve çalıştırmaz. Ama başka bir makinede toplanan olay kayıtları varsa bunları gerektiği şekilde yerel makinede görebilmemiz için tanımlamaları oluşturur. Elbette böyle bir senaryoda sysmon makinede ilk kez çalıştırılıyor olabilir, bu sebeple -accepteula anahtarı ile birlikte kullanılması gerekebilir.

sysmon64 -m -accepteula

Kurulumlar sırasında Sysmon kendini %systemroot% klasörünün içine kopyalar ve bir hizmet oluşturarak bu kopyanın çalışmasını sağlar. Varsayılan değerlerde sysmon aşağıdaki olaylara ait kayıtlar oluşturur:

  • ProcessCreate
  • ProcessTerminate
  • DriverLoad
  • FileCreateTime
  • SHA256 hash hesaplaması

Bir sunucuda çalışan sysmon hizmeti çok kolay olarak tespit edilebilir. Bu hizmetin ismini değiştirebilsek güzel olmaz mıydı. Olur, onu da sysmon64.exe'yi yeniden adlandırarak yapabiliriz.

ren .\sysmon64.exe .\abc123.exe
.\abc123.exe -i -accepteula


5.01.2026

Powershell betiklerine komut satırından parametre göndermek

Powershell betiklerine komut satırından bir bilgi (parametre, argument) göndermenin varsayılan yöntemi şöyle:

.\betik.ps1 -file D:\dosya.txt -ComputerName pc1

Burada -File parametresi küçük/büyük harf duyarlı değil. İçerde de şu şekilde işlenebilir:

param(
[string]$File,
[string]$Computername
)

Eğer -file ve -computername değerlerini parametre isimlerini/etiketlerini kullanmadan şu şekilde göndermek istersek

.\betik.ps1 D:\dosya.txt pc1

bu durumda işlerken şu şekilde bir konum belirleme mekanizması kullanmalıyız.

param(
[Parameter(Position=0)]
[string]$File,
[Parameter(Position=1)]
[string]$Computername
)

Ama eski tip DOS komutları bazen tire "-" karakteri yerine bölü "/" karekteri ile parametre göndermeyi tercih ederler.

Ya C argument dizisi benzeri şu yöntem kullanılabilir:

foreach ($arg in $Args) {
Write-Host "arg : $arg"
}

Öyle birşey istiyorum ki, betiğe -file ile, isimsiz ve hatta /f gibi bir parametre ile bile göndersek dosya.txt betik tarafından alınabilsin.

param(
    [int]$File
)

if (-not $Input -and $args.Count -ge 1) {
    if ($args[0] -match '^/f$') {
        $Name = $args[1]
    }
}

 Çoklu parametrelere girmedim.

4.01.2026

localsearch-3

Fedora'yı 43'e yükselttikten sonra durup dururken localsearch hakkında bilgi sahibi oldum. Sürekli çalışan bir süreç, localsearch-extractor-3 adında.

journalctl --user -u localsearch-3

ile bakınca çok sayıda "extractor subprocess died unexpectedly" hataları vermiş.

Hepsi localsearch adındaki bir paketin bileşenleri. Eski adı tracker/mine gibi birşey. 43 sürüm sonrası localsearch olmuş. /home klasörü altındaki dosya içeriklerini endekslemeyi amaçlıyor. Ama ben böyle otomatik arka plan işlerini sevmiyorum.

Bu işi devre dışı bırakmak için

systemctl --user stop localsearch-3.service
systemctl --user mask localsearch-3.service

komutları gerek.

Gnome aracılığıyla kapatmaktan bahsedilmiş ama galiba sürüm 43 sonrası bu ayarlar artık yok. Bunun yerine

gsettings set org.gnome.desktop.search-providers disable-external true

gibi bir yöntem var, ama sadece hizmeti devre dışı bırakmakla yetindim. 

Tamamen kaldırmak için ise

sudo dnf remove localsearch localsearch-extractors

önerilmiş. Ama ilk başta durumu izlemek için kaldırmadım, zaten sistemimde localsearch-extractors paketi de kurulu değildi. 

25.12.2025

wlms

Sanal makinelerde Windows 11 sürümleri normal şartlar altında aktivasyonu yapılmadan da uzun süreler çalışıyorlar. Ama son dönemde farkettim ki bir sanal makinem 1 saat sonunda kapandı. Olay kayıtlarına baktığımda kapatan process ile ilgili aşağıdaki sonucu gördüm.

System olay günlüğünde User32 kaynağının 1074 numaralı olayı.

C:\Windows\System32\wlms\wlms.exe sistemi kapatmış ve sebebi de Windows'un lisans süresinin sona ermesi.

wlms.exe, hizmet olarak çalışan bir süreç. Normal şartlarla servis durdurlamıyor, devre dışı bırakılamıyor ve süreç de sonlandırılamıyor. Hizmetin adı "Windows Licensing Monitoring Service", ama "Windows License Manager Service" ile karıştırmamak lazım. Onun prosesi svchost ve LocalService hesabı altında çalışıyor.

Söz konusu işletim sistemi Windows 11'in IoT LTSC EVAL sürümü.

Bu hizmetten kurtulma yolları var, örneğin bu ve şu adreste  psexec aracılığıyla hizmeti devre dışı bırakmaktan/silmekten bahsedilmiş.

psexec64 -i -s cmd.exe
sc delete wlms

Evet, hizmeti sildim ama bir süre beklemek lazım, gerçekten silinimiş bir wlms hizmetinin sonucunda bu illetten kurtulup kurtulamayacağımı görebilmek için.

24.12.2025

Anaheim

Diskimde hangi dosyaların ne tür ADS'lerinin olduğunu kontrol ediyordum:

dir -File -Recurse | % { $a = (gi $_.Fullname -Stream *  | ? Stream -ne ':$DATA').Stream;if ($a) {[PSCustomObject]@{Path=$_.FullName;Stream=$a}}}

Bu tek satırlık powershell komutu bana iki sütun halinde dosya tam yollarını ve birincil akış haricindeki diğer akışları (ADS) listeliyordu. Zone.Identifier varsayılan olarak internetten indirilen dosyaların Mark-of-the-Web işaretini vurguluyor. Ama bir dosya için farklı olarak SmartScreen gördüm. İçeriğini görmek için aşağıdaki komutu çalıştırdım:

gc -path D:\dosya.exe:SmartScreen
Anaheim

Evet. SmartScreen ADS'sinin içeriği tek kelime ve o da Anaheim. Acaba nedir bu Anaheim diye gezinirken cevabı SuperUser.com'da buldum.

SmartScreen'in Windows'un aklı başında insanlar tarafından kullanılmaması gereken bir bileşeni olduğunu biliyordum ama Anaheim'in Chromium tabanlı Edge tarayıcısının kod adını olduğunu bu sayede öğrenmiş oldum.

Ne alaka? SmartScreen girdiğimiz her web sitesini ve çalıştırdığımız her exe uzantılı dosyayı "güvenli mi değil mi acaba" diye Microsoft bulut servislerine danışan bir güvenlik (!) önlemi. Bu sebeple indirilen bir dosyaya da Edge'in kod adı konmuş, yüksek olasılıkla "smartscreen hizmeti kullanılarak güvenliği sağlandı" anlamına gelecek şekilde.

23.12.2025

Dosya gezgininde önizlemesi yapılamayan dosyalar

Windows'un dosya gezgininin önizleme özelliğini yoğun olarak kullanan bir kullanıcı, bazı pdf dosyalarında önizlemenin yapılamadığını söyledi. Önizleme yapabilmek için dosya gezginin araç çubuğundaki "Görünüm" düğmesi ile açılan menüden önizleme bölmesini seçerek pencerenin sağ tarafında dosya içeriğini açmadan (!) da izleyebileceğimiz bir alan oluşturabiliyoruz. Açmadan konusu biraz ilginç, çünkü arka planda dosya açılıyor, disk işlemleri yapılıyor ve belleğe yükleniyor. Sadece bağımsız bir pencereye sahip olmuyor ve belki de çok sayıda dosyanın olduğu bir klasörde hızlı gezinme imkanı veriyor. Neyse, önizleme bölmesinde dosya yerine görüntülenen mesaj şöyle:

Önizlemek istediğiniz dosyalar bilgisayarınıza zarar verebilir. Dosyaya ve aldığınız kaynağa güveniyorsanız, içeriğini görmek için dosyayı açın.

İlk aklıma hangi önizleme bileşenini kullanıdığını kontrol etmek geldi.

"HKEY_CURRENT_USER\.pdf\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}"

altında Varsayılan değere baktığımda {3A84F9C2-6164-485C-A7D9-4B27F8AC009E} değerini gördüm. Bunun neye karşılık geldiğini görmek için

"HKEY_CURRENT_USER\CLSID\{3A84F9C2-6164-485C-A7D9-4B27F8AC009E}"

altındaki varsayılan değeri kontrol ettim ve

"C:\Program Files (x86)\Microsoft\Edge\Application\143.0.3650.96\PdfPreview\PdfPreviewHandler.dll"

buldum. Yani Edge'in bileşenini kullanıyor. İlk aklıma gelen bunu değiştirmekti. Adobe Acrobat'ın bileşenini ayarladım, fayda etmedi.

Sonradan farkettim bu görüntüleyememe olayı her dosya için olmuyor. Acaba hangi dosyalar için oluyor diye düşünürken son dönemde internetten indirilmiş dosyalar içinde oluğunu gördüm. Kontrol ettim,

Get-Item ".\dosya.pdf" -Stream Zone.Information

bir Zone.Identifier ADS akışı var. Normal şartlar altında grafik arayüzle şu şekilde dosyaların engeli kaldırılabilir. Ama bir klasör ve tüm alt klasörlerinde yer alan bütün dosyaların engelini kaldırmak için

dir -recurse | Unblock-File

ile tek seferde bütün dosyaların engelini kaldırmayı başardım.