8.08.2025

Sayfanın yüklenme zamanı

Şöyle bir amacım var: Web tarayıcım bir süredir açık. Mevcut sayfa kendini yenilememiş. Sayfada yükleme anında çekilmiş bazı veriler var ama ne zamana ait olduğuna dair bir veri yok. Bunu bulmanın bir yolu var mı?

Evet. F12 ile geliştirici araçlarına geçip konsola gelip oraya

performance.timing

yazınca navigationStart, redirectStart, fetchStart, domainLookupStart, connectStart, vs bir sürü zaman etiketi (timestamp) çıkıyor. Bu zaman etiketlerini milisaniye cinsinden. Bunları

(Get-Date "1970-01-01").AddMilliSeconds(1754546232722)

gibi bir komutla (Powershell) tarih ve zamana çevirebilirim. Ama bu UTC olacak. Yerel saate çevirmek için (Türkiye için +3 saat) AddHours(3) eklemeliyim.

(Get-Date "1970-01-01").AddMilliSeconds(1754546232722).AddHours(3)

Ya da geliştirici araçlarının konsoluna

new Date(performance.timing.navigationStart)

yazmam gerek.

7.08.2025

OSDATA dosyası ile BSoD

Şu X hesabından duyurulan ve ThioJoe kanalındaki video ile de işlenen konuya göre, basit bir dosya oluşturarak Windows'un kalıcı olarak mavi ekran vermesine sebep olabiliyoruz.

Yapılması gereken tek şey, %windir%\System32\config klasörünün altında OSDATA isimli bir dosya oluşturmak ve içine rastgele birkaç karakter yazmak. Dosya içeriği boş olunca aynı etkiyi yapmıyor, dosya içinde az da olsa veri olmalı (boş olan dosya işletim sistemi tarafından dolduruluyor).

Boş bir klasör oluşturmak da aynı etkiyi yapıyor. Bundan sonra bilgisayarı tekrar başlatınca bilgisayar sonsuz bir mavi ekran (BSoD) döngüsüne giriyor. Ancak rastgele içeriğe sahip bir dosya ile ulaşılan mavi ekranda hata kodu BAD SYSTEM CONFIG INFO olurken, boş bir klasör ile ulaşılan durumda hata kodu CONFIG LIST FAILED oluyor.

Kurtulmak için dosyayı silmek gerek; evet. Ama silmek için bilgisayarı önce kurtarma kipinde açmak gerek. 2 kere aynı hata ile düzgün başlayamayınca Windows hata düzeltme kipine girerek gelişmiş seçeneklerle açmayı öneriyor. Burada aşağıdaki ekranda

Advanced options (geçişmiş seçenekler) tıklandıktan sonra Troubleshoot > Advanced Options > Command Prompt seçilerek kurtarma kipine girilmeli. Burada ilk yapılması gereken normal şartlarda C: olarak kullanılan disk bölümünü bulmak. Burada bu çok belirgin olmayabiliyor. diskpart'a girip list volume komudunu kullanarak alışkın olduğumuz boyutlardaki sürücüyü bulup, sonrasında DOS komutları ile, örneğin E: sürücüsüne geçip, ilgili klasöre gelmek ve dosyayı (ya da klasörü) silmek gerek:

E:
cd \Windows\System32\config
del OSDATA

ya da klasör için

rmdir OSDATA


25.07.2025

Windows Update takibi

Yerel bilgisayarda Windows Update hizmeti hangi güncellemeleri yüklüyor bulmak kolay. Bunu uzaktaki bir bilgisayar için nasıl yapabiliriz? Windows Update session nesnesinin henüz indirmediği ve gizli olmayan güncellemeleri sorgulayarak olabilir:

Invoke-Command -ComputerName UZAKPC -ScriptBlock {
    $Session = New-Object -ComObject Microsoft.Update.Session
    $Searcher = $Session.CreateUpdateSearcher()
    $Searcher.Online = $true
    $Results = $Searcher.Search("IsInstalled=0 and IsHidden=0")

    $Results.Updates | ForEach-Object {
        [PSCustomObject]@{
            Title       = $_.Title
            Downloaded  = $_.IsDownloaded
            Installed   = $_.IsInstalled
            EULAAccepted= $_.EulaAccepted
        }
    }
} | Format-Table Title, Downloaded, Installed, EULAAccepted -AutoSize -Wrap

Ya da PSWindowsUpdate modülünü kurup, powershell'i yönetici olarak açtıktan sonra

Get-WUList -Computername UZAKPC

diyerek de yapabiliriz. Ama uzaktaki bir bilgisayar için her seferinde yönetici hakları ile yeni bir pencere açmamak için ilk yöntem daha iyi sanki. Sonrasında yeniden başlatmaya gerek olup olmadığını öğrenmek için şu yöntem kullanılabilir.


23.06.2025

SysineternalsSuite paketinin boyutu

Sysinternals'ın Microsoft'tan önce de var olduğunu hatırlayan ve geliştirdiği araçları kullanan biri olarak Process Explorer, Process Monitor ve benzeri (o zamanlar isimler farklıydı, birleşmemiş tekil araçlar vardı) araçların güncel sürümlerini takip ediyorum. Paketlerin tümüne ihtiyaç duyanlar için "Suite" adı verilen bir zip dosyası yayınlanıyor sitede (indirme bağlantıları hala https://www.sysinternals.com/ sistesine yönleniyor). Her aracın yeni sürümü ile birlikte Suite de güncelleniyor.

Bu sysinternals suite paketlerinin boyutları, her bir aracın yeni sürümlerinin çıkışıyla birlikte yavaş bir artış eğilimindeydi. Artışın hızı hakkında bir fikir vermek amacıyla boyut geçtiğimiz dönemde şöyle gerçekleşti:

TarihBoyut
22 Kasım 202351.803 KB
27 Ağustos 202451.656 KB
28 Şubat 202551.813 KB
20 Haziran 2025170.127 KB

Görüldüğü gibi son indirmede boyut 52 MB seviyesinden 170 MB seviyesine çıkmış. Ne tür yeni araçlar pakete eklenmiş ya da mevcut araçlara ne tür yeni özellikler kazandırılmış olabilir diye bakmak için hemen 170 MB'lık paketin zip dosyasını bir yere genişlettim ama ciddi farklar göremedim. Ayrıntılı olarak incelemek için bir önceki paket ile en yeni paketin içeriklerini karşılaştırmak istedim. Basit bir içerik taramasında gördüm ki 28 Şubat'taki sürüm ile 20 Haziran'daki sürüm arasında tek fark RDCMan.exe aracıyla ilgili. Dosyanın 2.93.1431 sürümli 1.858 KB boyutundaki eski sürümünün yerine 3.1.0 sürümlü 67.050 KB boyutundaki sürümünün gelmiş. Buna ilave olarak bir de x86 sistemler için aynı sürüm numarasına sahip 62.232 KB boyutundaki RDCMan-x86.exe pakete eklenmiş.

Bütün fark bundan.

19.06.2025

Powershell ile IIS günlük dosyalarını incelemek

Bazı rutin işleri otomatik hale getirmek, betiklerin içinde kullanmak vs gibi amaçlarla metin dosyalarını bir metin düzenleyici veya Excel gibi programlarla incelemek yerine, Linux'tan gelen bir adet olarak, komut satırı (ya da powershell) ile incelemek gibi bir alışkanlık edinmiştim.

IIS günlük dosyası üzerinden gidelim. Bu dosyaların başında (ya da hizmet yeniden başlatıldığında)

#Software: Microsoft Internet Information Services 10.0
#Version: 1.0
#Date: 2024-06-19 00:00:02
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken

gibi satırlar yer alır. Bu satırları görmezden gelerek altındaki verilere odaklanmak istiyorum. Bu dosyanın adı u_ex250619.log gibi u_ex ile başlayan, yıl (iki haneli), ay ve gün sırasıyla tarih verisi içeren ve log uzatılı bir şey olacak.

cat ./u_ex250619.log | sls "^(?!#)"

ikinci bölüm, # karakteri ile başlamayan satırları göster demek.

Alışkanlık olduğu üzere bu adımdan sonra ConvertFrom-String cmdlet'ini kullanarak bu log dosyasındaki verileri sütunlara ayırmaya çalıştım. Bu arada sütun isimleri olarak üstte verdiğim "#" ile başlayan satırların en altındaki Fields: kelimesinden sonra gelen alan adlarını kullanabilirim. Bu alan adlarından tire "-" karakterini çıkararak şöyle bir alan adları değişkeni oluşturdum:

$alan_adlari = @('date','time','sip','csmethod','csuristem','csuriquery','sport','csusername','cip','UserAgent','Referer','scstatus','scsubstatus','scwin32status','timetaken')

Şimdi bunları kullanarak, alan ayracı olarak da boşluk karakterini belirterek verileri alalım:

cat ./u_ex250619.log | sls "^(?!#)" | ConvertFrom-String -Delimiter " " -PropertyNames $alan_adlari

Bu işlem, benim örneğimde 100MB'lık bir IIS log dosyası için onlarca dakika sürdü. Nasıl hızlandırabilirim diye düşünürken ConvertFrom-String cmdlet'inden şüphelenerek yerine ConvertFrom-Csv'yi kullanmayı düşündüm. Sonuçta IIS günlük dosyaları da boşluk karakter ile ayrılmış değerlerden oluşuyor.

cat ./u_ex250619.log | sls "^(?!#)" | ConvertFrom-Csv -Delimiter " " -Header $alan_adlari

Bu cmdlet'in de -Delimiter parametresi var, ama -PropertyNames yerine -Header kullanmak gerekecek. 

Bu şekilde verileri okuyabilmek sadece 1 dakika sürdü.

Bu aşamadan sonra örneğin bu log dosyasında en çok istekte bulunan 5 IP adresini tespit etmek için aşağıdaki gibi bir yöntem kullanılabilir.

cat ./u_ex250619.log | sls "^(?!#)" | 
    ConvertFrom-Csv -Delimiter " " -Header $alan_adlari | select cip | 
         Group-Object -Property cip -NoElement |
            Sort-Object -Property Count -Desc | 
                select -First 5 

Burada cip, $alan_adlari değişkeninde belirttiğimiz client-ip'nin kısaltması. Sunucumuzda en çok talep gören sayfayı (csuristem) görmek, var olmayan sayfalara (scstatus -eq 404) kimin en çok erişmeye çalıştığını görmek için yukarıdaki betik özelleştirilebilir.

17.06.2025

MRT - malicious software removal tool

Windows sunuculara güncelleştirme gelmiş. Aralarında MRT güncellemesi de var.

Bu, gözüktüğü gibi 5.134 sürüme ait bir güncelleştirme. Peki mevcut sürümümüz kaç? Bunu görmek için farklı yöntemler var. Birincisi sysinternals aracı olan sigcheck ile mrt.exe dosyasının sürüm bilgisine bakmak.

sigcheck64 C:\Windows\system32\mrt.exe

Bunun sonucunda da mevcut sürümümün 5.132 olduğunu gördüm.

Buna alternatif Get-Item ile dosya sürümü sorgulanabilir.

(Get-Item C:\Windows\System32\mrt.exe).VersionInfo.ProductVersion

Daha farklı bir yöntem ile Windows\debug klasörü altındaki mrt.log dosyasına bakılabilir.

cat C:\Windows\debug\mrt.log | sls "Removal Tool v" -Context 0,1 | select -last 1 

Nihai yöntem de mrt.exe doyasını çalıştırarak pencere başlığındaki sürüm numarasına bakmak.

Bunu sadece İngilizce yerelleştirmesi olan sistemlerde mi yapabiliyoruz, yoksa sadece sunucularda mı bilemiyorum ama Windows 11 Türkçe yerelleştirmeye sahip bilgisayarımda bu şekilde sürüm numarası gelmedi.

Her türlü sürüm eski. Hemen güncelleştirmek lazım.

Windows güvenliği ile ilgili bir de Güvenlik Zekası Güncelleştirme (Security Intelligence) sürümü önemli. Onu sorgulamak için de

(Get-MpComputerStatus).AntivirusSignatureVersion

kullanılabilir. 

16.06.2025

Linux'ta find komutu

Dosya aramak. Bitmez tükenmez bir ihtiyaç. Bütün işlevlerin de yıllar önce tasarlanmış bir find komutunun yetenekleri ile hala yapılabiliyor olması ilginç.

En çok kullandığım işlev, en son değişiklik tarihine göre dosya aramak; muhtemelen kısmi dosya ismi ile birlikte. Son 1 gün içinde değişen dosyaları bulmak için

find . -type f -iname '*.txt' -mtime 1

Burada en sondaki rakamın yanında artı veya eksi olmadığından tam 1 gün önce (1 ile 2 arasındakileri; yani 24 saat ve 48 saat önce değişenleri) değişenleri bul demek. 1 günden önce değişenler demek için

find . -type f -iname '*.txt' -mtime +1

Bir günden daha önce (24 saatten daha kısa süre önce) değişenleri bul demek için ise

find . -type f -iname '*.txt' -mtime -1

demek gerek.

Son 10 dakika içinde değişen (oluşan) dosyaları görmek için

find . -type f -mmin -10

Son 10 dakika ile 30 dakika arasında değişen dosyaları görmek için

find . -type f -mmin +10 -mmin -30 

Daha net bir tarih ve saat bilgisi için -newermt parametresi kullanılabilir. Örneğin 1 Ocak 2024'ten sonra değişen txt uzantılı dosyalar için

find . -type f -newermt '2024-01-01'
find . -type f -newermt 'Jan 1 2024'
find . -type f -newermt '2024-01-01 01:25 PM'

gibi komutlar kullanılabilir. En sondaki örnek diğerleri ile eşdeğer değil, saat farkı ile farklı sonuçlar üretir, sadece ISO tarih biçimindeki saat bilgisini göstermek için verdim.

Bu parametre daha esnek kullanıma da sahip. Örneğin

find . -type f -newermt 'yesterday'
find . -type f -newermt '2 weeks ago'
find . -type f -newermt '6 hours ago'

Hatta belli bir tarih aralığı için ünlem "!" işareti aralık sonu belirlenebilir. Örneğin 1 Ocak 2024 ile 31 Nisan 2024 arasını belirtmek için

find . -type f -newermt "2024-01-01" ! -newermt "2024-04-31"

Bir dosyanın oluşturulmasından daha sonra oluşturulmuş (düzenlenmiş) dosyaları bulmak da mümkün. Örnek dosyamız /home/metin/referans_dosya olsun. 

find . -type f -newer /home/metin/referans_dosya

Tüm tarih verileri sistemin yerel saatine göre yapılıyor.

Başka bir kriter de dosya boyutu. Genelde ihtiyacım olan belli bir boyutun üzerinde olan dosyalar. 2 GB'tan büyük ISO dosyaları için

find . -type f -iname '*.iso' -size +2G

Tam tersi, 2 GB'tan küçük iso dosyaları için ise, tahmin edilebileceği gibi boyut belirten 2'nin yanındaki artı '+' işaretini eksiye '-' çevirerek

find . -type f -iname '*.iso' -size -2G

find komutu sonrasında dosyanın ls ile gösterilen ayrıntılarını görmek istiyorsak iki seçenek var. -exec kullanmak, ya da find'in kendi -ls parametresini kullanmak. İki örnek

find . -type f -newermt 'yesterday' -exec ls -l {} \;
find . -type f -newermt 'yesterday' -ls

İlk örneğin sonundaki \; işareti ls komutunu bulunan her dosya için ayrı ayrı çalıştır demek. Her birini toplayıp tek seferde ls çalıştırmak için bunun yerine \+ kullanmak gerek.

İkinci örnekteki -ls parametresi, normal ls komutunun çıktısına göre 2 fazla sütun veri üretir. İlk sütun bulunan dosyanın dosya sistemindeki inode numarası. İkinci sütun ise bu dosyanın dosya sisteminde kaç blok kapladığını gösterir (sistemimizde bir blok kaç byte diye bakmak istersek sudo tune2fs -l /dev/sda). Aslında ls -li komutu ile de bu sütunlara ulaşmak mümkün.

Sadece bulunduğumuz klasördeki dosyalarla ilgileniyorsak ve en son değiştirilenleri bulmak istiyorsak

ls -ltR

Bu şekilde değiştirilme zamanlarına (-t) göre sıralar. En son değiştirilenlerin en altta yer alması için (-R) kullanılır, yoksa en son değişenler en üstte yer alır. Sadece son değişen 10 tane ile ilgileniyorsak

ls -lt | head

kullanabiliriz. Dosya boyutuna göre sıralamak için -S kullanılabilir. Bu da varsayılan olarak büyükten küçüğe sıralar. En büyük 5 dosyayı listelemek için

ls -lS | head -5

---

https://www.cyberciti.biz/faq/linux-unix-osxfind-files-by-date/