Herkese merhabalar,

Daha önce C# dilinde yaptığımız yazılımı bir arkadaşımız "python üzerinden yapamaz mıyız?", diye sormuştu. Ben de yapılabileceğini bunun sadece netsh kodu göndermekle alakalı olduğunu bu kodları python dilinde gönderirsek de aynı karşılığı python ile alabileceğimizi söylemiştim.

Hocam bu uygulamayı yapması zor oldu mu süreç nasıl işledi anlatabilir misiniz bende yapay zeka tarafında Python öğrenmeye çalışıyorum bunun aynısı Python da yapılabilir miydi?

Şimdi kodlara bakacağız.

C# dilinde kodlanmış haline ulaşmak için:

Uygulamayı doğrudan indirmek için :

Virüstotal sonuçları :

Uygulama python dilinde olduğundan öncelikle python'u indirip kurun :

Öncelikle uygulama yine kullanıcı arayüzü ile oluşturuldu ki terminal ile uğraşmasınlar.

1717270192096.webp


Eğer uygulamayı kullanmak için gerekli kütüphaneler bilgisayarınızda yoksa şu şekilde indirin :
[CODE lang="bash" title="python gerekli kütüphaneler"]pip install subprocess, tkinter, psutil, socket, elevate[/CODE]

Aşağıda kaynak kodlar üzerine açıklamaları vereceğim isteyen arkadaşlarımız python diliyle başka projeler gerçekleştirmek istediklerinde kodları kullanabilir.

[CODE lang="python" title="kolay dns değiştirici"]import subprocess #sistem komutları için gerekli kütüphane
import tkinter as tk #grafik arayüzüne bu kütüphane ile ulaşıyoruz.
from tkinter import messagebox #bu da gui arayüzünde mesaj kutuları oluşturmak için gerekli.
import psutil #ağ arayüzünde aktif ağları almak ve işlem yapmak için bilgi almak istediğimizde kullandığımız kütüphane genellikle tüm sistem bilgilerini içerir.
import socket #ip üzerinde işlem yapmak istediğimiz bize gerekli olan kütüphane
from elevate import elevate #programı yönetici olarak çalıştırmak için bu kütüphane gerekli çünkü dns değiştirmek yönetici izni gerektiren bir işlem.

class DNSChanger(tk.Tk):
def init(self):
super().init()
self.title("DNS Değiştirici") #gui araüyüzünde başlık oluşturduk

self.geometry("300x250") #gui pencere boyutu ayarlardık.
self.resizable(False, False) #ekran boyutunun kullanıcı tarafından değiştirilmesini engelledik.

self.radio_var = tk.IntVar() #radio buton tanımlamalarını gui arayüzüne ekliyoruz.

radio_texts = [ #button üzerindeki yazıları radiobutton1, 2, 3 olarak dizi olarak tanımlıyoruz.
("1.1.1.1 / 1.0.0.1", 1),
("8.8.8.8 / 8.8.4.4", 2),
("208.67.222.222 / 208.67.220.220", 3),
("9.9.9.9 / 149.112.112.11", 4),
("95.85.95.85 / 2.56.220.2", 5),
("8.26.56.26 / 8.20.247.20", 6),
("DNS Temizle", 7)
]

for text, value in radio_texts: #daha sonra radiobuttonlara gelecek yazıları, değerleri ve tıklanınca gidecek komutları ayarlıyoruz.
tk.Radiobutton(self, text=text, variable=self.radio_var, value=value, command=self.radio_button_changed).pack(anchor=tk.W)

def get_active_network_interface(self): #anlık olarak kullanılan ağ adaptörünün adını alıyoruz ki netsh komutu yazarken bize hangi ağ adaptörü üzerinde işlem yapacağını sorduğunda geçersiz bir adaptör ismin nedeniyle hata almayalım.
for interface, addrs in psutil.net_if_addrs().items():
if_addrs = psutil.net_if_stats().get(interface)
if if_addrs and if_addrs.isup and any(addr.family == socket.AF_INET for addr in addrs):
return interface
return None

def change_dns(self, primary_dns, secondary_dns): #burada network_interface kısmıyla birazdan göndereceğimiz netsh komutu için varsayılan ağ adını alıyoruz yoksa hata veriyoruz.
network_interface = self.get_active_network_interface()
if network_interface is None:
messagebox.showerror("Hata", "Aktif ağ bağlantısı bulunamadı.")
return

elevate() #komutları çalıştırmadan önce yönetici iznine geçiyoruz. Netsh komutları yönetici izni gerektirir demiştim.

subprocess.run(["netsh", "interface", "ip", "set", "dns", network_interface, "static", primary_dns], shell=True)#1.dns adresini ayarlıyoruz.
subprocess.run(["netsh", "interface", "ip", "add", "dns", network_interface, secondary_dns, "index=2"], shell=True)#2.dns adresini ayarlıyoruz.

def clear_dns(self):#dns temizleme butonu için temizleme yapıyoruz. Önce aktif ağ var mı yine onu kontrol ediyoruz tabii.
network_interface = self.get_active_network_interface()
if network_interface is None:
messagebox.showerror("Hata", "Aktif ağ bağlantısı bulunamadı.")
return

elevate() #yönetici izni aldık.

subprocess.run(["netsh", "interface", "ip", "set", "dns", network_interface, "dhcp"], shell=True) # asıl kodumuz burası netsh ile dns değiştiriyoruz.

def radio_button_changed(self): #burada da bir radio butonu seçildiğinde seçilenin numarasına göre kayıtlı dns adresleri dns değiştirme satırını tetikliyor.
selection = self.radio_var.get()
if selection == 1:
self.change_dns("1.1.1.1", "1.0.0.1")
elif selection == 2:
self.change_dns("8.8.8.8", "8.8.4.4")
elif selection == 3:
self.change_dns("208.67.222.222", "208.67.220.220")
elif selection == 4:
self.change_dns("9.9.9.9", "149.112.112.11")
elif selection == 5:
self.change_dns("95.85.95.85", "2.56.220.2")
elif selection == 6:
self.change_dns("8.26.56.26", "8.20.247.20")
elif selection == 7:
self.clear_dns()

if name == "main":
app = DNSChanger() #bu da uygulama döngüsüne girecek olan kodların DNSCanger adı altında olduğunu gösterir.
app.mainloop() #gui arayüzünde arayüz açık olduğu sürece kodların çalışması için kullanılır. Çünkü terminalin aksine gui arayüzünde kullanıcı sürekli komut al-ver yapar.
[/CODE]

Kodların anlaşılamadığı yerlere sorabilirsiniz, geliştirmek istediğiniz kısımlarda takıldığınızda da yardımcı olmaya çalışırım.

Herkese esenlikler dilerim.