2026-08-12

Powershell, ilginç bir kullanım

Kirk Munro'nun şu videosunda anlattığı birşey çok ilginç geldi. Powershell'in böyle bir kullanımı olduğunu bilmiyordum. Zaten videonun da amacı bu; bilmediğimiz kullanımları göstermek.

Örnek bir metin dosyamız olsun, D:\dosya.txt gibi. Düz virgülle ayrılmış veri. Ama başlığı yok.

İstanbul,34,Marmara
Ankara,06,İç Anadolu
İzmir,34,Ege
Bursa,16,Marmara

Bu verileri, elbette

$veri = Import-CSV D:\dosya.txt -Header "Sehir","Plaka","Bolge"

gibi bir yolla okuyabiliriz. Ama ilginç bir yöntem olarak

$veri = gc D:\dosya.txt | % {$sehir, $plaka, $bolge = $_ -split ","; [PSCustomObject]@{Sehir=$sehir;Plaka=$plaka;Bolge=$bolge}}

gibi bir ifade ile de okuyabiliriz. Elbette, düz virgülle ayrılmış dosyanın okunması için ilk yöntem çok daha yerinde ama ikinci yöntemde 

$sehir, $plaka, $bolge = $_ -split ","

gibi bir atama ve buradan elde edilen verilerin yapılandırılmış olarak

$veri = ... [PSCustomObject]@{
    Sehir=$sehir
    Plaka=$plaka
    Bolge=$bolge
}

atanması bana çok şık geldi.

2026-08-11

Bilgisayarın bir dönemde ne kadar açık kaldığını bulmak

Örneğin son 30 günde bilgisayar ne kadar açık kalmış bulmak istiyorum. Microsoft tarafında bilgisayarın ne zaman açılıp ne zaman kapandığı konusu biraz karışık.

Eskiden sistem olay günlüğünde evenglog kaynağının 6005 ve 6006 olayları vardı, eventlog hizmetinin durup başlamasını kaydeden. Ama bu hizmetin durumunu takip etmek süper güvenilir bir yöntem değil.

İkinci yöntem Kernel-General kaynağının 12 ve 13 olayları olabilir. Bunlar daha güvenilir.

Ancak son dönemde hayatımıza giren fast boot (hızlı başlat) sonucunda, bilgisayar kapatılırken ne 6006 ne de 13 olay kaydının tutulmaması konuyu zor bir noktaya taşıdı. Bilgisayar artık kapanmıyor, bir çeşit uyku durumuna giriyor. Bunun sonucunda da Power-Troubleshooter kaynağından 1 olayını uyanma, Kernel-Power kaynağından 42 olayını da uykuya geçiş olarak düşünebiliriz.

Bitti mi? Hayır. Beklenmeyen bir kapanma olduğunda (elektrik kesintisi, mavi ekran vs) bilgisayar (elbette kapanırken bir kayıt düşmediği için) bir sonraki açılışta yaklaşık kapanmanın gerçekleştiği saate dair bir eventlog kaynağından 6008 olayı düşülüyor. Bununla birlikte Kernel-Power kaynağından 41 olayı da düşülüyor.

Özetle

açılma olayları:
    Power-Troubleshooter    1
    Eventlog                6005
    Kernel-General           12
 
kapanma olayları:
    Kernel-General        13
    Eventlog                6006
    Eventlog             6008
    Kernel-Power        107
    Kernel-Power        42

Ayıklamayı tamamladıktan sonra bu olayların arasındaki zaman farkını hesaplayarak toplamı bulmak lazım. Ama konu, özellikle 6008 olayı gibi sebeplerle biraz karışık.

2026-08-10

eventlog 6008 olayındaki beklenmedik karakter

Sistem olay günlüğünde eventlog kaynağından 6008 olayında şöyle bir kayıt düşülüyor:

"17:59:44, ‎24.‎07.‎2026 tarihinde gerçekleşen önceki sistem kapanışı beklenmiyordu."

Bu olay,  bilgisayarın "17:59:44, ‎24.‎07.‎2026" tarihinde beklenmedik bir şekilde kapanmasının ardından bilgisayar ilk kez açıldığında (kim bilir ne zaman) düşüldüğü için bu olayın TimeCreated alanı ile açıklama içinde geçen saat ve tarih bilgisinin birbiri ile hiç ilgisi yok.

Olayın açıklamasında geçen alanlara, şöyle erişebilirim:

$ev1 = Get-WinEvent -Filterhashtable @{Logname="System";ProviderName="eventlog";Id=6008} -Max 1
$tarih = $ev1.Properties[1].Value
$saat = $ev1.Properties[0].Value

ve bunu bir tarih nesnesine çevirmek için

Get-Date -Date "$saat $tarih"

gibi bir yöntem kullanabilirdim. Ama kullanamıyorum. Çünkü, tarih verisinin önünde yazılmayan özel bir karakter var, 0x200e. Nasıl bulunabilir:

"{0:X}" -f [int][char]$tarih[0]
200E 

Bu karakter, görüntülemenin soldan sağa yapılmasını sağlıyor. Zaten bir soldan sağa görüntülüyoruz. Ama sağdan sola yazılan bir dilde tarih verisinin ters olarak görüntülenmemesi için sanıyorum böyle bir düzenleme yapmışlar. Bu alandan kurtulmak lazım.

$tarih =  $ev1.Properties[1].Value -replace([char]0x200e,'')
Get-Date -Date "$saat $tarih"

yeterli.

2026-08-04

Windows bilgisayarlar için kimlik numarası (GDID)

Kullandığınız işletim sisteminin her hareketinizi takip edebildiği, sizi girdiğiniz her web sitesinde takip ettiğini bilseydiniz hala o işletim sistemini kullanabilir miydiniz?

Şu videoda söylenene göre her Windows bilgisayarın benzersiz bir kimlik numarası (GDID) var ve Microsoft, bir suçluyu bu kimlik numarasını takip ederek bulabildi. Bilgisayarınızın kimlik numarasının bir kopyası her ne kadar kayıt defterinde saklanıyor olsa da bunu silmemizin birşey değiştirmeyece söylenmiş. Ama neymiş diye merak ederseniz:

(gp "HKCU:\Software\Microsoft\IdentityCRL\ExtendedProperties").LID

Bunun benzeri bir durum Android için de olmuştu. Mahkemeye yansıyan bir anlaşmazlık, Google'ın konum bilgilerini adli makamlara vermesi sonucunda çözülebilmişti.

GDID konusunu Linus da işlemiş ve konuyu şöyle özetlemiş; GDID işletim sisteminin yeniden kurulması sonrasında aynı kalmıyor. Ancak çevrim içi bir hesap ile sisteme girip yapılması durumunda bütün gizem (!) çözülüyor.

2026-08-03

Linux'ta zaman

Bilgisayarlar kapalıyken bile tarih ve saat kaydını tutabilir. Bunu anakartın üzerinde bu işten sorumlu bir zamanlayıcı çip ile yaparlar. Linux dünyası bunu RTC (real time clock) olarak adlandırır. Bu yazıda zamanı tutulması ile bu çipte tutulan zaman bilgisinden bahsedilecektir.

Varsayılan olarak Linux zamanı UTC olarak tutar. Sistem yerelleştirmesi (daha doğrusu zaman dilimi ayarlaması) nasıl ayarlanmışsa bu zamanın üzerine eklenir veya çıkartılır. Örneğin Türkiye +3 zaman diliminde olduğu için UTC olarak tutulan zaman 3 saat ilave edilir.

Ama bunun istisnası da var. Linux'a zamanı yerel saat diliminde tut diyebiliyoruz. Öncelikle mevcut durumu kontrol edelim.

timedatectl

komutunun çıktıları arasında "RTC in local TZ" geçen satıra bakmalıyız. Bende bu

RTC in local TZ: yes

olduğu için benim sistemim demek ki saati yerel saat dilimine göre saklıyor. Bunu değiştirmek için timedatectl komutu ile birlikte set-local-rtc kullanabiliriz. Örneğin UTC zaman dilminde saklayan varsayılan kurulumda durumu yerel saat dilimine çevirmek için

timedatectl set-local-rtc true

diyebiilir, ya da tekrar UTC'ye çevirmek için

timedatectl set-local-rtc false

diyebiliriz. Ya da Windows'da saat bilgisini UTC olarak tutmak için aşağıdaki kayıt defteri değişikliği yapılabilir.

"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation"
          RealTimeIsUniversal = DWORD(1) 

Durum kontrolü için

(gp  "HKLM:\SYSTEM\CurrentControlSet\Control\TimeZoneInformation" "RealTimeIsUniversal").RealTimeIsUniversal

Zamanı yerel saat diliminde saklayan sistemimde

journalctl -b

komutu ile ilk kaydedilen olayın saatini incelediğimde garip bir şekilde mevcut saat dilimimde değil, bundan da 3 saat ötesinde bir saat görüyorum. Örneğin 13:19'da açtığım bilgisayarım için jounralctl'in ilk satırlarında 13:19 değil, 16:19 görüyorum. Bunun sebebi, ilk açılışta sistemi başlatan initramfs sisteminin sistemin RTC (real time clock) ile tutulan sistem zamanına +3 (Türkiye Saati) ilave ederek başlaması. Ancak bu bir yerde düzeliyor. İlk satırlar, kernel modülünün kayıtları:

Ağu 02 16:19:00 fedora3 kernel: Linux version 7.1.5-101.fc43.x86_64 (mockbuild@3a3dadcda8bc47f1a8cfdc1237822e70) (gcc (GCC) 15.3.1 202607>

Bir süre sonra initramfs işlevi sonlanıyor ve root filesystem'e geçiş yapılıyor. Bu noktadan sonra zaman hızlı bir şekilde 13:19'a  geçiş yapıyor.

Ağu 02 16:19:03 fedora3 systemd[1]: Starting initrd-switch-root.service - Switch Root...
Ağu 02 16:19:03 fedora3 systemd[1]: Switching root.
Ağu 02 16:19:03 fedora3 systemd-journald[260]: Journal stopped
Ağu 02 13:19:04 fedora3 systemd-journald[260]: Received SIGTERM from PID 1 (systemd).

last reboot komutu ile bakılınca görülen saat beklenen, yerel Türkiye saati 13:19:

last reboot -n 1
reboot   system boot  7.1.5-101.fc43.* Sun Aug  2 13:19   still running 

Windows tarafında benzer bir zaman değişikliği olmuyor, en azından yerel zaman dilimi olarak.

2026-07-16

Bir Windows işletim sisteminin açılış kimliği (Boot Id)

Linux'ta

journalctl --list-boots

komutu ile her bir açılışa bir açılış numarası verilir. 0 numaraya sahip açılış mevcut açılıştır, -1 bir önceki, -2 numara iki önceki şeklinde gider.

Window'da da buna benzer bir açılış numaralarının olduğunu öğrendim. Ama Windows'daki açılış kimlikleri 0'dan başlayıp sürekli artan bir düzende gidiyor. Ama bu sayılara garip bir şekilde sadece Kernel-Boot olay kayıtlarından erişebildim.

Get-WinEvent -FilterHashtable @{LogName='System';ProviderName='Microsoft-Windows-Kernel-Boot';Id=20} |
    Select-Object TimeCreated,
        @{N='LastShutdownGood';E={$_.Properties[0].Value}},
        @{N='LastBootGood';E={$_.Properties[1].Value}},
        @{N='BootId';E={$_.Properties[2].Value}}

Bu sorguda BootId ile dönen değerler aradığımız açılış kimlikleri. Sadece ne sonuncu değeri sorgulayarak bilgisayarın, en son işletim sistemi yüklenmesinden sonra toplam kaç kez açıldığını bulabiliriz. Sistem olay günlüğünün doluluğu ve boyutuna göre belli bir tarihten önceki açılışlara ait bilgilere ulaşamıyor olabiliriz ama en azından sürekli artan bir yapıda olması, bilgisayarın toplam kaç kez açıldığına dair sayıyı bozmuyor.

Adından da anlaşılabileceği gibi LastShutdownGood ve LastBootGood  alanları sırasıyla en son kapanma ve en son açılma işlemlerinin eksiksiz gerçekleşip gerçekleşmediğini gösterir.

2026-07-14

Tarih verisi ve ayraçlar

Tarih nasıl yazılır, bu konuda bazı kafa karışıklıkları var. 12 Kasım 2025 tarihini ifade etmek için doğru ifade hangisi?

12.11.2025

12/11/2025

11/12/2025

2025-11-12

2025/11/12

Powershell'in Get-Date cmdlet'i yukarıdaki bütün ayraçları kabul ediyor. Ben de merak ettim, daha kaç farklı ayraç kabul edilebilir, hangi formatlar (en azından Powershell içinde) geçerlidir.

Tek tek denemek yerine olası ayraçların olduğu bir dizi oluşturdum. 

$ayraclar = ("",":",";",".",",","/","\","|","-","?","'","~","``","+","%","&","=","!")

Baz tarih değişkenimi de şöyle şekillendirdim:

$baz = "12A11A2025"

Burada sanal ayraç olarak "A" kullandım, çünkü sonrasında her seferinde A'ları ilgili ayraç karakteri ile değiştirmek istiyorum.

$ayraclar | % {try {$dongu=$baz.replace("A",$_);date $dongu -f d -ea stop;$sonuc="tamm";$renk="Green"} catch {$sonuc="hata";$renk="Red"} finally {Write-Host "$dongu - $_ - $sonuc" -for $renk}}

Daha okunabilir bir hali için

$ayraclar | ForEach-Object {
    try {
        $dongu=$baz.replace("A",$_);
        Get-Date $dongu -Format "d" -ErrorAction Stop;
        $sonuc="tamm";
        $renk="Green"
    }
    catch {
        $sonuc="hata";
        $renk="Red"
    }
    finally {
        Write-Host "$dongu - $_ - $sonuc" -ForegroundColor $renk
    }
}

Bunun sonucu şöyle oldu:

12112026 -  - hata
12:11:2026 - : - hata
12;11;2026 - ; - hata
12.11.2026
12.11.2026 - . - tamm
12.11.2026
12,11,2026 - , - tamm
12.11.2026
12/11/2026 - / - tamm
12\11\2026 - \ - hata
12|11|2026 - | - hata
12.11.2026
12-11-2026 - - - tamm
12?11?2026 - ? - hata
12'11'2026 - ' - hata
12~11~2026 - ~ - hata
12`11`2026 - ` - hata
12+11+2026 - + - hata
12%11%2026 - % - hata
12&11&2026 - & - hata
12=11=2026 - = - hata
12!11!2026 - ! - hata

Yeşil satırlar çalışan ayraçları gösteriyor: nokta (.), virgül (,), kesme (/) ve tire (-). Gri satırlar da Get-Date'in algıladığı tarihi (12.11.2025 yerine 11.12.2025 algılayıp algılamadığını) görmek için.