26.11.2022

fedora-repos-archive

Bilgisayarımda bir sorun var. dnf update ile yaptığım güncellemelerin bazılarında işlem yarıda kalıyor, oturum kapanıyor ve kaldığı yerden devam ettiremiyorum. dnf history undo ve dnf history rollback kullanmayı denedim ama DNF NEVRA bulunamadı... gibi bir hata verdi.

Şu adreste buldum ki fedora-repos-archive deposunu etkinleştirince bu hatalardan kurtulabiliyorum.

Önce fedora-repos-archive'i kuralım:

# sudo dnf install fedora-repos-archive

arkasından

# sudo dnf history undo 17 

gibi bir işlemle 17. işlemi geri alabilir, ya da 

# sudo dnf history rollback 16

gibi bir işlemle sorunlu işlem olan 17'den önceki duruma dönebiliriz. Ama --allowerasing veya --skip-broken anahtarlarını kullanmak da gerekebilir.

İşimiz bittikten sonra /etc/yum.repos.d/fedora-updates-archive.repo dosyasındaki

enabled=1

satırını

enabled=0

olarak değiştirmek, her dnf update işlemlerini hızlandıracaktır.

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.


18.10.2022

Powershel ile ağ ayarlarını değiştirme

Ağ adresi yapılandırmasını powershell ile yapmaya alışamadım. Çok komut var, hangisi ne iş yapıyor bir türlü kafamda oturtamadım. Grafik arayüze ihtiyaç duymadan IP adresini powershell ile girme yolundaki çabalarımından birini daha paylaşıyorum.

Öncelikle bilgisayarımızda hangi ağ kartları var, bir bakalım.

PS> Get-NetAdapter

Name      InterfaceDescription                       ifIndex Status MacAddress        LinkSpeed
----      --------------------                       ------- ------ ----------        ---------
Ethernet0 Intel(R) 82574L Gigabit Network Connection      10 Up     xx-xx-xx-xx-xx-xx    1 Gbps

Buradan aklımızda kalması gereken, hedef ağ arayüzümüzün endeksi 10. Bunun yerine Get-NetIPInterface'i de kullanabiliriz.

DOS komutu ipconfig'e benzeyen bir komut ise Get-NetIPConfiguration. Bu cmdlet'i -Detailed parametresi ile de kullanmak isteyebiliriz. Bu durumda şöyle bir ayrıntılı çıktı üretir:

ComputerName                          : DESKTOP-6HMFMLR
InterfaceAlias                        : Ethernet0
InterfaceIndex                        : 10
InterfaceDescription                  : Intel(R) 82574L Gigabit Network Connection
NetCompartment.CompartmentId          : 1
NetCompartment.CompartmentDescription : Default Compartment
NetAdapter.LinkLayerAddress           : XX-XX-XX-
XX-XX-XX
NetAdapter.Status                     : Up
NetProfile.Name                       : Ağ
NetProfile.NetworkCategory            : Public
NetProfile.IPv6Connectivity           : NoTraffic
NetProfile.IPv4Connectivity           : Internet
IPv6LinkLocalAddress                  : fe80::458e:8efe:1c9c:c32f%10
IPv4Address                           : 192.168.239.134
IPv6DefaultGateway                    :
IPv4DefaultGateway                    : 192.168.239.2
NetIPv6Interface.NlMTU                : 1500
NetIPv4Interface.NlMTU                : 1500
NetIPv6Interface.DHCP                 : Enabled
NetIPv4Interface.DHCP                 : Enabled
DNSServer                             : 192.168.239.2

Burada büyük bir eksik var: DHCP adresi. Bazen bu çok gerekli olabiliyor. Bunu öğrenmek için WMI/CIM sorgularına ihtiyacımız var:

PS> Get-CimInstance Win32_NetworkAdapterConfiguration -Filter "DHCPEnabled=$true" | Select DHCPServer

Get-NetIPAddress ile TCP ayarlarımızı görüntüleyebiliyoruz. Bilgisayarımızda birden fazla ağ arayüzü (kablolu, kablosuz vs) varsa ve birden fazla IP sürümü (IPv4 ve IPv6)  varsa ve hatta birden fazla IP ataması yapılmışsa liste modunda uzun bir liste çıkar karşımıza. Liste değil de tablo şeklinde yazmak, biraz da alan kısıtlaması yapmak için

PS> Get-NetIPAddress | ft ifIndex, IPAddress, InterfaceAlias, PrefixLength, PrefixOrigin

kullanabiliriz.

Bu adımdan önce bilgisayarımızdaki ağ arayüzlerinin listesini görmek için Get-NetAdapter kullanabiliriz.

Birince senaryomuzda ağ kartımızda DHCP seçili olsun. Yani IP adresimizi bir çeşit sunucudan alıyoruz. Bu durumda yukarıdaki komut şuna benzer bir çıktı üretir:

ifIndex ifAlias IPAddress                    PrefixLength PrefixOrigin
------- ------- ---------                    ------------ ------------
     10         fe80::458e:8efe:1c9c:c32f%10           64    WellKnown
      1         ::1                                   128    WellKnown
     10         192.168.239.134                        24         Dhcp
      1         127.0.0.1                               8    WellKnown

İlk satır, ethernet kartımızın IPv6 kaydı. Altındaki IPv6 için looopback adresi. Üçüncü satır ağımızdaki DHCP sistemi tarafından bize ataması yapılan C sınıfı ağ adresini kullanan ethernet kartımıza ait kayıt. En sondaki de IPv4 loopback kaydımız. Prefix length altağ maskesi (subnet mask). CIDR notasyonu; burada prefix'in 24 olması, altağ maskesinin 255.255.255.0 demek. En son sütunda görüldüğü gibi bu adresi ağımızdaki DHCP bize vermiş.

Ağ kartımızı DHCP'den vazgeçip elle IP adresi ataması yapmaya karar verirsek Set ile başlayan bir cmdlet kullanmadan önce New-NetIPAddress kullanmalıyız:

PS> New-NetIPAddress -ifIndex -10 -IPAddress 192.168.77.7 -PrefixLength 24 -DefaultGateway 192.168.77.2

Burada IP adresimiz, prefix uzunluğumuzu (altağ maskesi) ve varsayılan ağ geçicimizi (default gateway) belirttik. DNS sunucu bilgisi kaldı. Onu da Set-DNSClientServerAddress ile yapacağız.

PS> Set-DNSClientServerAddress -Server 192.168.7.2, 192.168.7.3 -InterfaceIndex 10

Eğer amacımız varolan bir DNS sunucu girişini silmek olsaydı

PS> Set-DNSClientServerAddress -InterfaceIndex 10 -ResetServerAddress

kullanabilirdik. Bu da ikinci senaryomuz; IP adresi ataması yapılmış bir ağ arayüzünün yapılandırmasını görmek için tekrar Get-NetIPAddress cmdlet'ini çalıştıralım:

Get-NetIPAddress | ft ifIndex, IPAddress, InterfaceAlias, PrefixLength, PrefixOrigin

ifIndex IPAddress                    InterfaceAlias              PrefixLength PrefixOrigin
------- ---------                    --------------              ------------ ------------
     10 fe80::458e:8efe:1c9c:c32f%10 Ethernet0                             64    WellKnown
      1 ::1                          Loopback Pseudo-Interface 1          128    WellKnown
     10 192.168.77.7                 Ethernet0                             24       Manual
      1 127.0.0.1                    Loopback Pseudo-Interface 1            8    WellKnown

Görüldüğü gibi elle atadığımız IP adresinin yanında artık "Dhcp" değil, "Manual" yazıyor.

Bu aşamadan sonra eğer varolan atamayla ilgili bir değişiklik yapacaksak Set-NetIPAddress cmdlet'ini kullanabiliriz. Örneğin PrefixLength'i değiştirmek için

PS> Set-NetIPAddress -ifIndex 10 -IPAddress 192.168.77.7 -PrefixLength 16

yapabiliriz. Ama varolan IP adresini değiştirmek mümkün değil. Bunun için varolan atamayı Remove-NetIPAddress kullanarak silmek, daha sonra yine Net-NetIPAddress kullanarak yeniden bir atama yapmak gerek. Var olan IP atamasını silmek için

PS> Remove-NetIPAddress -IPAddress 192.168.77.7

Şu şekilde de olabilirdi:

PS> Get-NetIPAddress -IPAddress 192.168.77.7 | Remove-NetIPAddress

Şu ağ arayüzümüzün üzerindeki IP adresi ataması silindi, ama varsayılan ağ geçidi bilgisi hala duruyor. Onu da silmek için:

PS> Get-NetIPAddress -ifIndex 10 | Remove-NetRoute

Bu durumdan sonra ağ kartımızın 169.254.0.0/16 aralığında bir APIPA adresi ataması olacak:

PS> Get-NetIPConfiguration

InterfaceAlias       : Ethernet0
InterfaceIndex       : 10
InterfaceDescription : Intel(R) 82574L Gigabit Network Connection
NetProfile.Name      : Tanımlanmayan ağ
IPv4Address          : 169.254.195.47
IPv6DefaultGateway   :
IPv4DefaultGateway   :
DNSServer            : 8.8.8.8
                       8.8.4.4

Get-NetIPAddress ile baktığımızda ise

Get-NetIPAddress | ft ifIndex, IPAddress, InterfaceAlias, PrefixLength, PrefixOrigin

ifIndex IPAddress                    InterfaceAlias              PrefixLength PrefixOrigin
------- ---------                    --------------              ------------ ------------
     10 fe80::458e:8efe:1c9c:c32f%10 Ethernet0                             11    WellKnown
      1 ::1                          Loopback Pseudo-Interface 1          128    WellKnown
     10 169.254.195.47               Ethernet0                             16    WellKnown
      1 127.0.0.1                    Loopback Pseudo-Interface 1            8    WellKnown

Vurgulamak istediğim, PrefixOrigin sütunundaki Wellknown alanıydı.

Son durumda bu ağ kartını tekrar DHCP'den IP adresi alacak şekilde ayarlamak kaldı. Bunu yapmanın ön koşuşu tüm IP adresi atamasını temizlemek. Ondan sonra ise

PS> Get-NetAdapter | Set-NetIPInterface -Dhcp Enabled

Bu komutu verdikten hemen sonra ağ kartımı kontrol ettiğimde DHCP'den bir IP adresi ataması almadığını gördüm. Şu sitede son aşamada bir kez daha Remove-NetRoute'ı çalıştırmak önerilmiş. Bu oldu; ama benim tercihim ağ kartını disable edip tekrar etkinleştirmek (Restart-NetAdapter ?) oldu:

PS> Get-NetAdapter | Disable-NetAdapter

PS> Get-NetAdapter | Enable-NetAdapter

Tamamen Powershell dünyasında kalma amacımıza hizmet edecek başka iki cmdlet daha DNS önbelleğini görüntüleme ve/veya silme için aşağıdakiler olabilir

PS> Get-DNSClientCache

PS> Clear-DNSClientCache


Windows 11 için uzaktan sunucu yönetim araçlarını yükleme

Uzaktan sunucu yönetim araçları (Remote Server Administration Tools, RSAT) Windows iş istasyonlarından sunucuları yönetmek için kullanılan araçlar. Eskiden bunları yüklemek için Microsoft'un sitesinden indirilen bir paketi kurardık. Artık farklı.

İki kurulum yöntemi var, birincisi grafik arayüzden. Başlat menüsündeki aramaya "İsteğe Bağlı Özellikler" (Optional Features) yazalım. Açılan pencerede üstteki "Özellikleri görüntüle" düğmesine basalım. Tüm özelliklerin içinde RSAT ile ilgili olanları süzmek için ise üstteki arama kutusuna da RSAT yazalım. Benim sistemimde 21 bileşen listelendi. Bunların yanındaki kutuları işaretleyerek istenenlerl kurabiliriz. Hepsi için 21 kutunun işaretlenmesi gerek.

İkinci yol, Powershell. Yönetici yetkileriyle açılmış bir powershell penceresinden aşağıdaki gibi bir komutla isteğe bağlı özelliklerin arasında isminde RSAT geçenleri listeleyebiliriz:

PS> Get-WindowsCapability -Name RSAT* -Online

Evet, Powershell'de Optional Features yerine Windows Capability terimi kullanılmış.

Bunların tümünü kurmak için yukarıdaki komutun çıktısını Add-WindowsCapability cmdlet'ine göndermemiz gerek.

PS>  Get-WindowsCapability -Name RSAT* -Online | Add-WindowsCapability -Online

Hem Get-WindowsCapability hem de Add-WindowsCapability cmdlet'inde kullanılan -Online parametresi, çalışan işletim sistemi üzerinde işlem yapılmasından dolayı.

Powershell çözümü 21 ayrı pakete tıkalmak zorunda kalmamak için daha mı pratik?

11.10.2022

Powershell ve yazıcılar

Bir bilgisayardaki yazıcıları listelemek için

PS> Get-Printer

kullanılabilir. Listelenen yazıcılardan birini paylaştırmak için ise

PS> Set-Printer -Name "HP Laserjet 1300" -Shared $True -ShareName "HPLJ1300"

gibi bir komut iş görür.

Paylaşılan bir yazıcıyı da (başka bir bilgisayara) eklemek için

$yazici = "\\sunucu\HPLJ1300"

Invoke-Command -ComputerName UZAKBILGISAYAR -ScriptBlock {
(New-Object -Com Wscript.Network).AddWindowsPrinterConnection($Using:$yazici)
}

yeterli.

Powershell'de yerel betik veya değişkenleri uzak betiklerde kullanmak

Diyelim yerel bilgisayarda bir değişkenimiz var:

$yol = "D:\logs"

Normal şartlar altında yerel bilgisayarda tanımlanan değişkenlerin kapsamları yerel bilgisayardaki betik ortamında kalır. Uzaktaki bilgisayarda çalıştırılan aşağıdaki gibi bir kod hata vermese de beklenen çıktıyı üretmez:

$ Invoke-Command -Computername UZAKPC -ScriptBlock { Get-ChildItem -Path $yol }

Yerel değikenin kapsamıını uzaktaki bilgisayarı da içine alacak şekilde genişletmek için şu iki yöntemden birini kullanabiliriz:

$ Invoke-Command -Computername UZAKPC -ScriptBlock { Get-ChildItem -Path $Using:yol } 

$ Invoke-Command -Computername UZAKPC -ScriptBlock { Get-ChildItem -Path $yol } -ArgumentList $yol

Değişkene ilave olarak yerel bilgisayarda oluşturduğumuz yerelfonksiyon() gibi bir fonksiyon varsa ve bunu uzak bilgisayarda çalıştırmak istiyorsak bu durumda da aşağıdaki gibi yol izleyebiliriz:

$ Invoke-Command -Computername UZAKPC -ScriptBlock { $Function:yerelfonksiyon } 

Alternatif yöntem olarak ArgumentList parametresini de kullanabiliriz:

$ Invoke-Command -Computername UZAKPC -ScriptBlock { yerelfonksiyon } -ArgumentList -${function:yerelfonksiyon}

Benzer şekilde bu fonksiyona parametre olarak yine yerel bilgisayarda tanımlanmış değişkenler göndereceksek

$ Invoke-Command -Computername UZAKPC -ScriptBlock { yerelfonksiyon $deger1 $deger2} -ArgumentList ${function:yerelfonksiyon},$deger1,$deger2

---

https://stackoverflow.com/questions/30304366/powershell-passing-function-to-remote-command

5.09.2022

Powershell ile dosyaların sahibini değiştirme

Grafik arayüz bir yöntem; ama biz Powershell ile yapmak istiyoruz.

Hedefimiz $hedef değişkeninde olsun. Dosyamızın yeni sahibi de BILGISAYAR\kullanıcı hesabı olsun.

Önce bir acl değişkeni oluşturalım:

PS> $acl = Get-Acl -Path $hedef

Daha sonra da bir hesap nesnesi oluşturalım.

PS>  $hesap = New-Object-TypeName System.Security.Principal.NTAccount -ArgumentList "BILGISAYAR\kullanici"

Daha sonra $acl nesnesinin içinde yer alan Owner'ı değiştirelim.

PS> $acl.SetOwner($hesap)

Daha sonra da bunu Set-Acl ile dosya sistemine yansıtalım.

PS> Set-Acl -Path $hedef -AclObject $acl

Güzel.

---

[1] https://stackoverflow.com/questions/22988384/powershell-change-owner-of-files-and-folders

[2] https://learn-powershell.net/2014/06/24/changing-ownership-of-file-or-folder-using-powershell/