3.11.2022

Powershell muhtelif konular

woshub.com sitesinde bulduğum birkaç güzel powershell bilgisini paylaşmak istedim.

SMB paylaşımları

Birincisi SMB sunucu ve istemcilerle uğraşmak için.

Örneğin bir dosya sunucumuz var. Bu sunucunun yapılandırma bilgilerini görmek için

PS> Get-SmbServerConfiguration

komutunu kullanabiliriz. Burada yazan parametreleri değiştirmek için, örneğin SMBv1'i kapatmak için

PS> Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force

kullanabiliriz. Paylaşılan klasörleri görmek için

PS> Get-SMBShare

paylaşımlardan birini kaldırmak için

PS> Remove-SMBShare paylasim

ve hatta paylaşımda olan açık dosyaları görmek için

PS> Get-SmbOpenFile

kullanabiliriz. Bir istemcide bağlanılmış ağ sürücüleri var mı diye bakmak için

PS> Get-SmbMapping

Yeni bir ağ sürücüsü oluşturmak için, örneğin SUNUCU üzerinde paylaşılan DOSYALAR paylaşımını Z: sürücüsü olarak bir istemciye bağlamak için

PS> New-SmbMapping -Localpath Z: -RemotePath \\SUNUCU\DOSYALAR -Username <kullanici.adi> -Password ***** -Persistent $true -SaveCredential

kullanabiliriz.

Güvenlik Duvarı

Güvenlik duvarını powershell ile yönetmek için de güzel bilgiler var. Örneğin önce hangi ağ profilinde olduğumuzu, ve bu profile göre firewall durumumuzu inceleyelim:

PS> Get-NetConnectionProfile

Burada bilgisayarımızdaki tüm ağ cihazları için (kablolu/kablosuz vs) bilgiler görüntülenir. Bunların içinden bizim hedefimiz olan ağ arayüzüne bakıp "name" alanını kaydedelim. Benim bilgisayarımda Public çıktı. Bundan sonra da firewall'da Public profiline bakalım:

PS> Get-NetFirewallProfile -Name Public

Enabled olarak True görüyorsak bu profilde güvenlik duvarımız etkindir. Değilse etkinleştirmek için

PS> Set-NetFirewallProfile -All -Enabled True

ile bütün profilleri etkinleştirebiliriz.

Varsayılan öyledir ama bir sebeple değişmişse bilgisayarımdaki gelen trafik için herhangi bir kurala uymayan paketleri engellemeyi yaplandıralım:

PS> Set-NetFirewallProfile –Name Public –DefaultInboundAction Block

Uzak masaüstü bağlantısını etkinleştirebilmek için ilgili kural grubunu etkinleştirelim:

PS> Enable-NetFirewallRule -DisplayGroup "Uzak Masaüstü"

Bu kural grubuna dahil olan kuralları görüntülemek için

PS> Get-NetFirewallRule -DisplayGroup "Uzak Masaüstü" | select Name

yazdığımda benim makinemde 3 kural geldi.

Name
----
RemoteDesktop-UserMode-In-TCP
RemoteDesktop-UserMode-In-UDP
RemoteDesktop-Shadow-In-TCP

Grubu etkinleştirdiğimizde 3'ünü de etkinleştirmiş olduk. Bu kuralların eylemleri "İzin ver". Yani bu kurallar gelen trafiğe izin vermek için yaratılıyorlar. Var olmalarının sebebi engellemek değil, izin vermek.

Varsayılan olarak güvenlik duvarı log tutmaz. Engellenen bağlantılar için log tutmayı etkinleştirmek için

PS> Set-NetFireWallProfile -Profile Domain -LogBlocked True -LogMaxSize 20000
        -LogFileName ‘%systemroot%\system32\LogFiles\Firewall\pfirewall.log’

yapabilir, yeni bir kural yaratmak için ise

PS> New-NetFirewallRule -DisplayName 'HTTP-Inbound' -Profile @('Domain', 'Private')
        -Direction Inbound -Action Allow -Protocol TCP -LocalPort @('80', '443')

gibi bir yazım kullanabiliriz.

Var olan bir kuralı değiştirmek için ise Set-NetFirewallRule kullanabiliriz. Örneğin RemoteDesktop-UserMode-In-UDP kuralını devre dışı bırakmak için

PS> Set-NetFirewallRule -Name RemoteDesktop-UserMode-In-UDP -Enabled False

yapmak yeterli. Protokole veya port numarasına göre kural aramak için Get-NetFirewallPortFilter kullanılabilir. Örneğin

PS> Get-NetFirewallPortFilter | where {$_.LocalPort -eq 3389} | ft -Autosize

İle yerel port numarasında 3389 yazan (hem TCP hem UDP) tanımlar gelir. Ama bunlar kural mı, hayır. Kurallarla ilişkisi ne? InstanceID paramteresi ile. Get-NetFirewallPortFilter'ın döndüğü InstanceID parametresini kullanarak kurallar içinde arama yapabiliriz.

PS> Get-NetFirewallRule | where {$_.InstanceID -eq "RemoteDesktop-UserMode-In-UDP"}

Benzer şekilde 

Get-NetFirewallAddressFilter

Get-NetFirewallServiceFilter

Get-NetFirewallApplicationFilter

gibi cmdlet'ler de var.

Tekrarlanan dosyaları bulmak

Her duruma karşılaşılabilecek bir konu da tekrarlanan dosyalar. Bunları bulmak ve temizlemek için bir sürü başka program var elbet, ama powershell ile yapmak başka bir güzel. Bir hedef klasörümüz olsun; örneğin D:\dosyalar gibi. Bu klasörün altındaki diğer alt klasörlerdeki tekrarlanan dosyaları bulmaya çalışalım. Bir dosyanın başka bir dosya ile birebir aynı olduğunu anlamak için dosya özeti (file hash) hesaplamasını kullanabiliriz. Daha sonra da aynı özete sahip dosyaları süzerek sonuçları görebiliriz. Bu işin adımlarını inceleyelim. Önce D:\dosyalar klasörünün altındaki bütün dosyaları listeleyelim:

PS> Get-ChildItem -Path D:\dosyalar -Recursive

Daha sonra bütün dosyaların özetlerini hesaplayalım.

PS> Get-ChildItem -Path D:\dosyalar -Recursive | Get-FileHash

Benzersiz kopyaları değil, sadece tekrarlanan dosyaları listeleyelim. Bunun için Group-Object ile aynı özete sahip hesaplamaları gruplayıp sadece grupta 1'den fazla olan kayıtları görüntüleyelim.

PS> Get-ChildItem -Path D:\dosyalar -Recursive | Get-FileHash | Group-Object -Property hash | Where-Object {$_.count -gt 1} | Foreach-Object {$_.group | Select-Object Path, Hash}

Bu şekilde sadece tekrarlanan dosyaları listeyeleyebildik. Eğer D:\dosyalar klasöründa boyutu 50 MB'tan büyük çok sayıda dosya varsa bu yöntem uzun sürebilir, zira varsayılan SHA256 özetini hesaplamak için yoğun işlem gücü gerek. Bu konu bir iyileştirme önce dosya boyutunu karşılaştırıp sadece aynı boyuta sahip dosyalar için dosya özeti hesaplamaya giderek yapılabilir:

PS> Get-ChildItem -Path D:\dosyalar -Recursive | Group-Object -Property Length | Where-Object {$_.Count -gt 1} | Select-Object -Expand Group | Get-FileHash | Group-Object -Property hash | Where-Object {$_.count -gt 1} | Foreach-Object {$_.group | Select-Object Path, Hash}

Bunun sonucunda çok sayıda tekrarlayan dosya dönüyorsa bunları listenin içinden seçip tam yolunu kopyalayıp silmek zor olabilir. Onun için bu komutun çıktısını Out-GridView'a yönlendirmek, orada çoklu seçimi etkinleştirerek, seçilenleri de silmek önerilmiş. Silme işlemi için -WhatIf kullanılmış, güvenlik gereği. Gerçekten silmek için onu kaldırmak gerek. Tekrar aynı şeyi yazmayayım; yukarıdaki komutun çıktısını $tekrarlanan değişkenine atadığımızı varsayalım.

PS>  $tekrarlanan | Out-Gridview -Title "Silinecek dosyalari secin" -OutputMode Multiple | Remove-Item -Verbose -WhatIf

Sayfada -OutputMode ile -PassThru aynı anda kullanılmış; bu hataya sebep olduğu için ben çıkardım.


Hiç yorum yok: