26.04.2023

Powershell'de çıkışa satır numarası eklemek

Domain'de bir grubun üyelerini listelemek için şöyle bir komut kullanıyorum:

PS> Get-ADGroupMember -Identity "Grup Adi"

Bunun sonucunda kullanıcı nesneleri listelenir. Nesne ile bütün verilere ihtiyacım yok, sadece isimler yeterli. Bu durumda select-object ile sadece Name alanı süzülebilir:

PS> Get-ADGroupMember -Identity "Grup Adi" | select name

Gelen listeye bir de kullanıcıların grup bilgisini eklemek istiyorum. Benim durumumda bu bilgi Organizational Unit adında var.

PS> Get-ADGroupMember -Identity "Grup Adi" | select Name,@{N="Bolum";E={$_.DistinguishedName.split(",")[1].Split("=")[1]}}

Nihayet, bir de bu listeyi 1'den başlayıp her satırda artan şekilde satır numaralarıyla görüntülemek istiyorum. Bunun için bir $satir değişkeni yaratıp şu şekilde sürece ilave ettim:

PS> $satir=0;  Get-ADGroupMember -Identity "Grup Adi" | select Name,@{N="Bolum";E={$_.DistinguishedName.split(",")[1].Split("=")[1]}} | % {$satir++;"$satir `t$($_.Name)`t$($_.Bolum)}

Daha kolay bir örnek üzeriden satır numaraları konusunu tekrarlayayım. Bir metin dosyasına satır numaraları eklemek için

PS> $satir=0; gc dosya.txt | % {$satir++;"$satir`t$_"}


24.04.2023

Powershell ile ekran çözünürlüğünü değiştirmek

Maalesef Powershell ile varsayılan olarak çözüürlüğü değiştirecek bir cmdlet gelmiyor. Ama Powershell-Gallery'de güzel bir modül var. Kurmak için terminali yönetici yetkileriyle açtıktan sonra

PS> Install-Module DisplaySettings

kullanmak ve sonrasında kaynağa güvendiğimizi belirtmek gerek. Bu adımlardan sonra

PS> Set-DisplayResolution -Width 1440 -Height 900

ile çözünürlüğü ayarlamak mümkün. Var olan çözünürlüğü öğrenmek için ise

PS> Get-DisplayResolution

var. Modüldeki yegane iki cmdlet bunlar. Modül bugün itibarı ile 0.0.2 sürümde.

Server Core için böyle bir modül var ama PSGallery'deki modülün Microsoft ile bir ilişkisini göremedim.

10.04.2023

Powershell'de tür dönüşümü (casting)

Birçok programlama ortamında tür dönüşümü eşittir işaretinin sağında yapılır. Ama powershell'de bu iş eşittirin solunda da yapılıyor. Bunun sebebiyle ilgili bulduğum çok güzel bir açıklamayı[1] paylaşmak istiyorum.

Varsayalım bir xml dosyamız var, diskte kayıtlı (dosya.xml). Bu xml dosyamızı okuyup bir değişkene atmak istiyoruz. Ama değişkenimizin de xml tipinde bir değişken olmasını istiyoruz. Diğer programlama ortamlarından alışık olduğumuz durum şu olabilir:

PS> $x = [xml]Get-Content -Path dosya.xml

Bu yanlış bir ifade olurdu. [xml] tür dönüşümü yapmak istediğimiz veri, dosya.xml dosyası okunduktan sonra Get-Content cmdlet'inin döndüğü tüm veri olduğundan burada bir parantez kullanmalıyız. Yani;

PS> $x = [xml](Get-Content -Path dosya.xml)

Bu şekilde x değişkenine atanan verinin xml türünde olması sağlanabilir. Ama powershell'de bu iş şu şekilde yapılıyor:

PS> [xml]$x = Get-Content -Path dosya.xml

Bu şekilde x değişkenimizin türü xml olarak oluşturulmuş. Sonrasında bu değişkene yapılacak atamaların da otomatik xml'e dönüştürülmesi sağlanmış.

---

[1] https://stackoverflow.com/questions/11685265/casting-in-powershell-weird-syntax

7.04.2023

Olay günlüğü (eventlog) boyutlarını değiştirme

Get-WinEvent ile güvenlik olay kayıtlarını incelerken bazen hiç kayıt dönmüyor. Bunun sebebi de varsayılan olarak 20 MB olarak ayarlanan güvenlik olay günlüğünün bir süre sonra eski olayları siliyor olması. Yerel bilgisayarda mevcut durumu kontrol etmek için

PS> Get-Evenlog -List

kullanabiliriz. Güvenlik olay günlüğü (security) için bunu yönetici yetkileriyle açılmış bir pencereden çalıştırmamız gerek. Uygulama ve sistem için buna gerek yok. Bu komutun ürettiği çıktıda Max(K) sütununa bakarak istediğimiz olay günlüğünün azami boyutunu öğrenebiliriz. Bunu Get-WinEvent ile de yapabiliriz. Örneğin uzak bir bilgisayarın uygulama, sistem ve güvenlik olay kayıtlarını (yetkilerimiz dahilinde) incelemek için

PS> Get-WinEvent -Computername uzakpc -Listlog Application, System, Security

Yerel bilgisayarda olay herhangi bir günlüğüne ayrılmış alanı değiştirmek için

PS> Limit-Eventlog -LogName Security -MaximumSize 128MB

kullanabiliriz. Yeni boyutun 64KB'ın katları olması gerektiği söylenmiş. Bunu sağlamak için en iyi yöntem MB birimlerini kullanarak 1MB'ın katlarını belirtmek olabilir.

Limit-Eventlog cmdlet'inin -Computer parametresi ile ya da Invoke-Command kullanarak bu işlemi uzak bilgisayarlarda da uygulayabiliriz.

Sadece yerel bilgisayarda çalışan Get-LogProperties cmdlet'ini uzak bilgisayarda kullanmak için Invoke-Command ile birlikte çalıştırabiliriz. Hatta alias'larla birlikte şöyle bir çıktı üretir:

PS> icm -cn uzakpc {Get-LogProperties Security}

PSComputerName : uzakpc
RunspaceId     : <...>
Name           : Security
Enabled        : True
Type           : Admin
Retention      : False
AutoBackup     : False
MaxLogSize     : 524288000

2023-11-24 Ek: Bu harika yöntem, Application and Services Logs (Uygulama ve Hizmet Günlükleri) altındaki günlüklerin boyutlarını değiştiremiyor. Örneğin

PS> Get-WinEvent -LogName "Microsoft-Windows-TaskScheduler/Operational"

ile "Microsoft-Windows-TaskScheduler/Operational" günlüğünü bulmasına rağmen

PS> Limit-Eventlog "Microsoft-Windows-TaskScheduler/Operational" -MaximumSize 512MB

hata dönüyor. İki yöntem buldum. Birincisi Get-WinEvent kullanmak:

PS> $log1 = Get-WinEvent -ListLog "Microsoft-Windows-TaskScheduler/Operational"
PS> $log1.MaximumSizeInBytes = 128MB
PS> $log1.SaveChanges()

İkinci yöntem ise Kayıt defteri düzenleyicisini kullanmak. Regedit.exe ile açtıktan sonra HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\Microsoft-Windows-TaskScheduler/Operational yoluna giderek buradaki MaxSize byte cinsinden değerini değiştirebiliriz. 128MB için bu 0x8000000 veya 134217728 olabilir.