3.02.2026

İki klasörün içindeki tekrarlayan dosyaları bulmak

D:\dizin1 ve D:\dizin2 gibi iki klasörüm ve içinde bazı dosyalarım var. Acaba Dizin1'de olan dosyaların herhangi biri Dizin2'de de olabilir mi? Görmek için önce iki dizinin de dosyalarını birer array değişkene aktardım.

$ar1 = dir -path D:\dizin1 -File
$ar2 = dir -path D:\dizin2 -File

Sonra da dizin1'deki her dosyanın dizin2'de olup olmadığını görmek için bir döngü oluşturdum. 

$ar1 | % {if ($_ -in $ar2) {$_}}

Bu şekilde olmadı. Neden? Çünkü $ar1'in elemanlarından her birini temsil eden $_ nesnesi tam olarak $ar2'nin  elemanlarından biri ile tamamen aynı değildir. Çünkü içinde FullName gibi sadece dizin2'ye ait bazı alanlar da vardır ve tamamen aynı olamaz. Karşılaştırmayı nesnenin bütün özellikleri ile değil de sadece dosya adları (.Name) ile kısıtlayarak aşabilirim.

$ar1.Name | % {if ($_ -in $ar2.Name) { $_ }}

Elbette bu şekilde sadece D:\dizin1 ve D:\dizin2'nin doğrudan içindeki dosyaları karşılaştırabilirim. Eğer alt klasörlerini de dahil etmek istersem biraz daha işleme ihtiyacım var. Şimdilik fikir olarak bununla kalayım.

Bu yöntem D:\dizin1\resim1.jpg ile D:\dizin2\resim1.jpg dosyalarının aynı olduğunu, sadece dosya ismine bakarak teşhis eder. Dosyanın oluşturma tarihi, değiştirme tarihi, boyutu ve içeriğini kontrol etmez. Basit bir karşılaştırma.

Tüm içeriğe girmeden sadece dosya adı ve boyutu da hesaba katarak bir karşılaştırma yapmak da mümkün. Bunun için karşılaştırmayı Compare-Object ile yapmak gerekecek.

compare $ar1 $ar2 -Property Name, Length -IncludeEqual -ExcludeDifferent

Eğer son değiştirilme tarihleri birebir aynıysa -Property'den sonra LastWriteTime da eklenebilir.

2.02.2026

CSR dosyasının içeriğini görüntülemek

Sertifika talebinde bulunurken oluşan CSR dosyasını, Windows'da bulunan cerutil aracı ile görüntüleyebiliriz.

certutil -dump csr_file.txt

 

28.01.2026

Statik DNS kaydı ne zaman oluşturulmuş

Active Directory DNS sunucusu içinde bir statik kayıt acaba ne zaman oluşturulmuş diye merak ettim. Grafik arayüz gelişmiş seçeneklerle bile bunu göstermedi. Yaptığım bir aramada bu ve şu adreslere denk geldim.

RSAT yüklü olduğu (veya Powershell ActiveDirectory modülü olan) bir bilgisayar/sunucudan önce bu modülü import ederek (Bu modül, aslında Get-ADUser gibi bir komut kullanıldığında otomatik olarak import edilir. Ama modülü import etmeden Get-PSDrive cmdlet'i çalıştırılırsam aradığım şeyi görüntülemez) Get-PSDrive'ı çalıştırdığımda şunu gördüm:

Import-Module ActiveDirectory
Get-PSDrive
Name   Used (GB)   Free (GB) Provider      Root         CurrentLocation
----   ---------   --------- --------      ----         ---------------
AD                           ActiveDire... //RootDSE/

Evet, bir AD sürücüsü belirdi. Şu alt konteynere girdim:

Set-Location "AD:DC=bosb.lc,CN=MicrosoftDNS,DC=DomainDnsZones,DC=bosb,DC=lc"

Verdiğim bağlantılarda bu şekilde verildiği için ben de AD: şeklinde girdim ama aslında AD'nin bir sürücü olduğunu düşünürsek şu şekilde bir yol daha doğru:

"AD:\DC=bosb.lc,CN=MicrosoftDNS,DC=DomainDnsZones,DC=bosb,DC=lc"

Bu şekilde de cd yapılabilir. Bu adımdan sonra bulunduğum konumda bütün DNS kayıtları var. İstediğim DNS kaydının, örneğin cuma adındaki bir DNS kaydının oluşturulma ve değiştirilme tarihlerini görebilmek için yazmam gereken powershell komutları şöyle:

dir | ? Name -eq "cuma" | Get-ADObject -Properties Created,Modified | select Name, Created, Modified
Name  Created            Modified
----  -------            --------
metin 2.11.2020 09:13:44 19.12.2025 17:35:00

 

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.