12.11.2024

Güç durumunda değişiklikleri takip etmek

Dizüstü bilgisayarlardaki güç durumu değişikliklerini takip etmek istiyroum. Bilgisayar ne zaman bataryaya geçmiş, ne zaman şarj adaptörü takılmış. Bu geçişleri izlemek için System olay günlüğü kayıtlarını incelemek gerek. 105 numaralı olay güç durumundaki değişiklikleri takip eder. Örneğin son 12 saatteki geçişleri görmek için:

Get-WinEvent -FilterhashTable @{Logname="System";Id=105;StartTime=(Get-Date).AddHours(-12)} | 
Format-Table TimeCreated,
@{N="AC";E={$_.Properties[0].Value}},
@{N="Şarj";E={[int](100*[int]($_.Properties[1].Value)/[int]($_.Properties[2].Value))}}

Ya da düşük güç kipine giriş ve bu durumdan çıkışlar. Bu geçişleri takip etmek için System olay günlüğündeki 506 (düşük güç kipine giriş) ve 507 (düşük güç kipinden çıkış) olaylarını aramak gerek. Örnek olarak yine son 12 saatteki olay kayıtlarına bakmak için

Get-WinEvent -FilterHashtable @{LogName="System";Id=506,507;StartTime=(Get-Date).AddHours(-12)} -ea Silently |
Format-Table TimeCreated, @{N="ModernBekleme";E={if ($_.Id -eq 506) {"Giriş"} else {"Çıkış"}}}

506 olayı sırasında şarj seviyesini görmek için $_.Properties[4] / $_.Properties[5] oranını,

507 olayı sırasında ise $_.Properties[24] / $_.Properties[25] oranını kullanabiliriz. Elbette bunu uygun forma dönüştürmek için örneğin şunun gibi bir ifade gerekir:

[int](100*([float]$_.properties[24].value)/[float]($_.properties[25].value))

11.11.2024

Çoklu masaüstünü yönetmek

Windows'da çoklu masaüstü ortamı kısayolları:

Alt + Tab: Mevcut masaüstünde açık pencereler arasında geçiş yapmak

Win + Tab: Mevcut masaüstündeki pencerelerin yanı sıra diğer açık masaüstlerini de gösteren bir görünüm. Buna "Görev Görünümü" deniyor, hatta görev çubuğunda bu görünüme ait bir öğe (buton/düğme ya da her ne dersek) var. Buradan diğer masaüstlerine geçiş yapabilir, yeni masaüstü açabilir veya açık olanları kapatabilir, hatta pencereleri masaüstleri arasında taşıyabiliriz. Masaüstlerini isimlendirebilir, arka planlarını da değiştirebiliriz.

Win + Ctrl + D: Yeni masaüstü oluşturmak

Win + Ctrl + < / > (sağ ve sol ok tuşları): Bir önceki/sonraki masaüstüne geçiş.

Win + Alt + < / > : Seçili pencereyi dikey olarak 3 bölüme ayrılmış bölümler arasında taşı.

Win + Alt + v / ^ (alt ve üst ok tuşları): Seçili pencereyi yatay olarak 2 bölüme ayrılmış bölümler arasında taşı.

Ve KDE'deki kısayollar:

Ctrl + F10: Bütün masaüstlerindeki bütün pencereleri küçük resimler halinde listele.

Ctrl + F9: Mevcut masaüstündeki pencereleri küçük resimler halinde listele.

Ctrl + F7: Mevcut uygulamaya ait bütün pencereleri küçük resimler halinde listele.

Ctrl + F12: Masaüstünü göster (bütün pencereleri küçült).

Win + Q: Etkinlikleri yönet

Ctrl + F1: İlk masaüstüne git

Ctrl + F2: İkinci masaüstüne git

Win + W: Genel görünüm

Win + G: Izgara görünümü

23.10.2024

PSreadline hatası

Windows Server 2019 veya Windows 10 gibi önceki nesil işletim sistemlerinde Powershell ile çalışırken

Oops, something went wrong. Please report this bug with the details below.
Report on Github: https://github.com/lzybkr/PSReadLine/issue/new
Last 1 Keys:
"|"
Exception:
System.ArgumentOutOfRangeException: The value must be greater than or equal to zero and less tha the console's buffer size in that dimension.

gibi bir hatayla karşılaştım. Altında uzun uzun başka şeyler de yazıyordu ama önemli olan konunun aslında PSReadline ile ilgili olması. Güncellenmesi gerek.

Get-module -Name PSReadline

ile baktığımda kurulu modülün sürümü 2.0.0 gözüküyor.

Find-Module -Name PSReadline

ile baktığımda (ki aslında bunu yapabilmek için bile Nuget'in 2.8.5.201 sürümüe ihtiyacımın olduğunu belirterek güncelleme istedi, kabul ettim) 2.3.6'nın depolarda olduğunu gördüm. Aslında 

Update-Module -Name PSReadline

gibi bir seçenek var gibi gözükse de makinemde kurulu gelen psreadline Install-Module ile yüklenmediği için Update-Module ile de güncellenemedi. Onun yerine

Install-Module -Name PSReadline -Force -Scope AllUsers

ile diğerinin yanına kurdum (kurarken de güvensiz bir depodan kurulum yaptığıma dair bir mesaj çıktı ama daha güvenli bir depo yok, direk bu durumu kabul ettim.). Sorunsuz çalışyor, ikisi birlikte ama eskisini yine de kaldırmak istedim. (Bir) ama (daha)

Remote-Item -Path 'C:\Program Files\WindowsPowershell\Modules\PSReadline\2.0.0' -Force

gibi bir yöntem fayda etmedi, çünkü mevcut powershell penceresi bu klasördeki dosyaları kullanıyordu. Onun için silme işlemini Windows Gezgini'nden yapmam gerekti. Sonrası herşey normal.

21.10.2024

Windows Recall

Bir Microsoft başağrısından kurtulma kılavuzu. 22631'de yok. 26100'de var. Bakmak için

winver

ya da

gcim win32_operatingsystem | select Version

Mevcut image'da ne özellikler var bakmak istersek

dism /online /Get-Features

Recall'u kontrol etmek istersek

dism /online /Get-FeatureInfo /FeatureName:Recall

Recall'dan kurtulmak için

dism /online /Disable-Feature /FeatureName:Recall

Hani olurda birgün biri etkinleştirmek isterse

dism /online /Enable-Feature /FeatureName:Recall

16.10.2024

WSL ile bash veya python betiklerini çalıştırmak

WSL (Windows Subsystem for Linux) kurulu olduğunu varsayıyorum. Windows'un içinde aslında bash hatta python betikleri çalıştırmak mümkün. WSL tarafında bir linux'umuz varsa ve orada /home/metin gibi bir klasör yapısının altında betik1.sh gibi bash betik dosyamızın olduğunu varsayalım. Bu dosyanın çalıştırma yetkilerinin de olması gerek. Yani

chmod +x betik.sh

gibi. Bunu WSL Linux'a girmeden, Windows terminalden nasıl çalıştırırız?

C:\Windows\System32\wsl.exe /home/metin/betik1.sh

yeterli. Peki bir python betiğimiz varsa nasıl olur? Bunun da yine çalıştırma yetkilerinin olduğunu varsayarsak

C:\Windows\System32\wsl.exe "python3" "/home/metin/betik2.py"

şeklinde çalıştırabiliriz. Alternatif olarak hashbang (shebang) yöntemi olarak python betiklerinin ilk satırına

#!/usr/bin/env python

ve aynı şekilde bash betiklerinin ilk satırı olarak da

#!/usr/bin/sh

eklemek mümkün.

WSL'in linux ortamına ait sanal disk dosyasının konumu da

C:\Users\metin\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState

gibi bir yerde, ext4.vhdx gibi bir dosyada.

15.10.2024

Sysinternals handle

Birçok Sysinternals aracının içinde en az kullandığım olabilir, handle. Çünkü daha çok process explorer içinden aynı işi yapıyordum. Son zamanlarda daha fazla handle kullanmaya başladım.

İşletim sistemleri, uygulamaların dosya sistemi, portlar vs gibi kaynaklar üzerinde kullandıkları kaynakları bir kimlik numarası (buna handle denir, sanıyorum Türkçe'ye tutamaç/kulp gibi çevrilebilecek ama teknik olarak işleç olarak ifade edilen bir terim) ile takip eder. Bir dosya bir uygulama tarafından açıldığında, aynı anda bu dosyaya ihtiyaç duyabilecek başka programlarında dosyaya yazıp bozmaması için bu dosyayı kilitler ve ikinci gelene "bu dosya abc programı tarafından kullanılıyor" diye bir mesaj görüntüler. Çoğu zaman çok faydalı olan bu işleyiş bazen sorunlara yol açabilir. Dosyayı normal yollardan açan uygulama beklenmedik bir şekilde sonlanırsa ona ayrılan erişim yetkisi hiç sonlanmamış olabilir ve diğer uygulamaların (hatta tekrar başlatılan uygulamanın kendisinin) o dosyaya erişimi engellenebilir.

Böyle durumlarda bir "aracı"nın müdahale etmesi gerekebilir. İşte handle, bu amaçla açık kalan erişimleri sorgulamaya ve sonlandırmaya yarayan küçük ama faydalı bir uygulamadır. handle ve handle64 olarak 2 farklı mimari için sürümleri mevcuttur. 2024'ün sonlarına doğru artık 32-bitlik sistemler görmek pek mümkün değil, ama 32-bitlik sürüm olan handle.exe'yi, bütün 32-bitlik uygulamalar gibi 64-bitlik bir Windows'da çalıştırmak mümkün. Lakin bazı dezavantajları olur; sadece 32-bitlik süreçlerin açtığı dosyaları sorgulayabilmek, sadece 32-bitlik süreçlerin erişebileceği 4 GB bellek adres alanına erişebilmesi gibi. Bu sebeple sadece 64-bitlik sürümü kullanıyorum.

Genellikle yükseltilmiş ayrıcalıklar ile çalışmayı sever, bu arkadaş. Bu sebeple açtığım terminal penceresinin yükseltilmiş ayrıcalıklara sahip olduğunu varsayıyorum. Tek başına çalıştırınca her süreç için açık kaynakların işleçlerini tek tek listeler. Bu çoğu zaman yapmamamız gereken bir şey. Onun yerine hedefimiz hakkında biraz daha bilgi vermek gerek. Örneğin, işleci (handle) oluşturan uygulamanın adı, süreç numarası veya erişimde sorun yaşadığımız dosyanın adı veya yolu olabilir.

handle64 winword
handle64 -p 11483
handle64 C:\Users\metin\Documents\Liste.docx

Bunların sonucunda bir veya birkaç tane işleç listelenir. Bu işleçlerin bir veya daha fazlasını kapatmak için ise hem işleç numarasını (-c ile) hem de süreç numarasını (-p ile) kullanmak gerekir.

handle64 -c 22AC -p 11483

Bu gibi araçlar eski günlerde daha çok USB belleklerin "çıkarılamaması" gibi sorunların çözümü için işe yarardı.

Tabi henüz geçerliliğini kaybetmemiş bir sürece ait işlev(ler)i zorla kapatmak en azından sürecin artık ilgili kaynağa erişememesine, bazen veri kaybına hatta sistem süreçlerine ait işleçlerin kapatılması durumunda sistem kararsızlığına (mavi ekranlar, beklenmedik sonlanmalar vs) sebep olabilir.

7.10.2024

DHCP sunucu ve Powershell

Çalışan bir DHCP sunucuya rezervasyon (ayırma) ve policy (ilke) eklemek istiyorum. Etkin bir havuz var ve kiralamalar da düzgün çalışıyor. Bununla birlikte DHCP'den yapılacak rezervasyonlarla ilgili elimde CSV dosyasından alınmış şöyle bir liste var:

$rsv = Import-Csv -Path .\reservations.csv
$rsv
MAC HOST IPAd
--- ---- ----
xx-xx-xx-yy-yy-yy bilgisayar01 192.168.22.150
xx-xx-xx-yy-yy-yy bilgisayar02 192.168.22.151
... 

Öncelikle bu MAC-IP ilişkisi için birer rezervasyon oluşturalım.

$rsv | % { Add-DhcpServerv4Reservation -ComputerName dhcpserver 
    -ScopeId "192.168.22.0" -IPAddress $_.IPAd -ClientId $_.MAC 
    -Name $_.HOST -Description -$_.HOST -Type Dhcp }

Daha sonra da aynı $rsv dizisini kullanarak bir politika oluşturalım.

Add-DhcpServerv4Policy -ComputerName dhcpserver -Name "WifiPolicy" -ScopeId "192.168.22.0" 
    -Condition OR -MacAddress EQ,xx-xx-xx-yy-yy-yy,...

Buraya bütün MAC adreslerini en sona tek seferde ekleyebilir, ya da WifiPolicy altına birden fazla koşul girebiliriz. Bu komut sonunda ilke etkin olarak oluşturulur. Oluşturduktan sonra devre dışı kalmasını istersek -Enabled $false ile bunu belirtmeliyiz.

DhcpServer modülü ile gelen 100'den fazla cmdlet var. DHCP sunucuyu sadece powershell'den yönetmek ve izlemek bile mümkün. Tüm komut listesi için

Get-Command -Module DhcpServer

Sonrasında DHCP olaylarını incelemek istersek

Get-WinEvent -Computername DhcpServer 
    -FilterhashTable @{Logname="Microsoft-Windows-Dhcp-Server/Operational";StartTime=(Get-Date).AddHours(-8)}

Bir filter'ımız varsa izin verilmeyen istemciler ile ilgili olay kayıtları "Microsoft-Windows-Dhcp-Server/FilterNotifications" günlüğüne düşer. Görmek için

Get-WinEvent -Computername DhcpServer
    -FilterHashtable @{Logname="Microsoft-Windows-Dhcp-Server/FilterNotifications";StartTime=(Get-Date).AddHours(-8)}