30 Ocak 2016 Cumartesi

batch dosyası (.bat) ile DNS değiştirme

senaryo şu: dns yazmayı ya da değiştirmeyi bilmeyen son kullanıcı bat dosyasını çalıştırarak birden fazla dns adresini işletim sistemine yazmış oluyor. senaryonun zor olan tarafı bütün ağ kartlarına dns yazmamak ve wifi veya ethernet olmasına bakmaksızın varsa her iki kart için de dns adreslerini devreye almak.
Biraz araştırınca windows işletim sisteminin dns adreslerini virgül ile ayırarak registry de tuttuğunu görüyorum; aşağıdaki gibi


bu NameServer ayarları birden fazla kart için geçerli ki biz hepsini değiştirirsek işletim sisemi vpn yada taşınabilir 3g ayarlarını bozmuş olur, o yüzden registry de bulunan aşağıdaki anahtarları tek tek iterate etmek gerekiyor, gezmeliyiz yani; Belki 3 interface var belki de benim işletim sistemimde olduğu gibi 13 tane, bu anahtarlar registry de system altında bulunuyor.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces



asıl amaca geri dönersek bat dosyası yazmalı ve bu bat dosyası ile bütün anahtarları gezmeli, eğer değiştirmemiz gereken bir interface ise değiştirmeliyiz.
aşağıda kodu paylaşıyorum, zorluk çıkaran noktalar bat file içinde loop yaparken değişken atama yöntemi set item=%%a ifadesine izin vermiyor. bunu yapabilmek için SET "item=%item%" yazmak gerekiyor. ben interface leri gezerken DhcpServer anahtarıını hedef aldım yani DhcpServer anahtarında benim beklediğim bir değer varsa o anahtarın üstündeki registry dalını referans olarak sub prosedüre yönlendirip registry value sunu değiştiriyorum. exit /b ifadesi olmadan loop u tamamlamıyor ve anahtarı aşağıdaki örnekte birden fazla değğiştiriyor ama gayet sağlıklı çalışıyor.
batch yazmanın bazı zorlukları var ki burada onlardan bazılarına rastlanıyor: klasik yazılım geliştirme kavramları tam olarak uymuyor ama bat dosyalar olmasa windows işletim sisteminde ciddi sıkıntılar da yaşardık.

@echo off
Setlocal EnableDelayedExpansion
setlocal EnableExtensions
TITLE NAME SERVER DEGISTIRME
COLOR F0
ECHO.
ECHO DNS GUNCELLEME

set regVar=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
set /P P="ISLEM YAPMAK ICIN TUSA BASINIZ"

REM regVar anahtarındaki interfaceleri gezerek dbhcpserver degiskenindeki degeri bulduğu anahtardaki
REM bulunan NameServer değerini güncelliyor.
REM değiştirilmesi gereken dns host isimleri virgülle aşağıdaki dnshostnames değişkenine atanmalı
set dhcpserver=192.168.1.1
set dnshostnames="208.67.220.220,208.67.222.222"

FOR /f "tokens=*" %%a in ('REG QUERY %regVar% ') DO (
        SET "item=%%a"
        CALL :CHECK %%a
    )
GOTO END


:CHECK
SET "item=%item%"
REM ECHO %item%
FOR /f "tokens=1-3" %%a in ('REG QUERY %item% ') DO (
   
    IF %%c equ %dhcpserver% CALL :OKFOUND %%a
)
exit /b


:OKFOUND
REM echo %1
reg add %item% /f /v NameServer /d %dnshostnames%
exit /b

:END
TIMEOUT /T 10 /NOBREAK
ECHO.
ping -n 11 127.0.0.1 > nul
EXIT