Hromadná změna DNS serveru pomocí powershellu:
Parametry pro sítový adaptér jsou v drtivé většině
případů získávány automaticky.Jenže není tomu tak vždy.Což je i můj případ,je
tu spousta serverů a dalších podpůrných PC(stanic) které mají jak IP tak DNS servery nastaveny natvrdo.A
protože přecházíme na nový DNS server...
Máme tu další důvod ke psaní powershell skriptu.Na druhou
stranu proč psát další skript když jich na internetu koluje více než dost.Ale
vždy je tu nějaké ALE.Například u mne byl problém s notebooky,kdy jejich
integrovaný modem znamená další síťový adaptér.Dále pak OpenVPN jenž si vytváří
svůj virtuální adaptér.Nemůžu měnit DNS i na těchto adaptérech.Musím vybrat jen
ty kterých se to týká.
Ať už adaptér dostane IP od DHCP nebo jí má natvrdo vždy
jsou ve stejném rozsahu,jasně jsou i výjimky ale vycházíme z toho že hledáme ve
stejném rozsahu IP(typicky doména) a to je podstata mého filtru který pro
změnu DNS serveru vybírá jen ty adaptéry které odpovídají danému rozsahu.
Skript je myšlen pro hromadnou změnu tedy klidně stovky
stanic,takže data (názvy stanic) si načítá z obyčejného txt souboru který
umístíme na disk C.Txt soubor má tuto podobu:co řádek to název jedné stanice
bez prázdných řádků a znaků.Soubor se musi jmenovat seznampc.txt
#budeme menit DNS na vice
stanicich takze promenna ktera bude obsahovat jmena PC musi byt
#..typu pole,takzetakto si
zinicializujeme promennou typu pole
$pc = @()
#do promenne si nacteme seznam
stanic z textoveho souboru ktery mame ulozen na c:
$pc = cat "c:\seznampc.txt"
#do promenne si nacteme dve
hodnoty(primarni a sekundarni DNS)
$newdns = "192.168.100.249" , "8.8.8.8"
#zalozime si textovy soubor do
ktereho budeme zapisovat podrobny log udalosti.Jako prvni
#...zapiseme aktualni datum a cas
kdy byl log vytvoren znamenko > rika ze zakladame novy
#...soubor.Pokud uz existoval
bude prepsan timto novym takze vzdy budeme mit aktualni log
Get-Date > "C:\dnsLog.txt"
#postupne si vyzvedneme vzdy
jednu stanici a te priradime promenou $stroj tu pak prozeneme
#...skriptem v zavorkach(cyklus
foreach)
foreach($stroj in $pc)
#zacatek hlavniho skriptu vse co
je mezi touto zavorkou a zavorkou dole probehne tolikrat
#...kolik jsme zaslali PC do
kolecka (vzdy jedno kolo pro jeden stroj)
{
#do promenne $connect si ulozime
test spojeni na testovane pc(muze byt true nebo false)
#..true=spojeni uspesne
false..spojeni neuspesne
$conect = Test-Path \\$stroj\c$
#otestujeme zda je PC nebo server
dostupny
if ($conect -eq "True")
#pokud je spojeni uspesne
zapiseme tuto skutecnost do logu
{"$stroj je dostupny" >> "C:\dnsLog.txt"
#promenne $dns priradime udaje o
sitovem adapteru konkretniho pc
#...(tedy pc ktere momentalne
proudi v roure)
$dns = Get-WmiObject win32_networkadapterconfiguration -computername $stroj
#...vybereme jen ty adaptery
ktere maji konkretni IP tedy jsou v domenovem rozsahu
$dnslive = $dns | where-object {$_.ipaddress -like "192.168.100.*" }
#provedeme zmenu DNS serveru na
server definovany na zacatku skriptu
$dnslive.setDNSServerSearchOrder($newdns)
#do promenne si nacteme aktualni
info o parametrech sitoveho pripojeni a
#...to jen pripojeni ktere ma
konkretni IP tedy rozsah domeny
$dnspote = Get-WmiObject win32_networkadapterconfiguration -computername $stroj |
where-object {$_.ipaddress -like "192.168.100.*" }
#promenne $jakedns priradime
momentalni hodnotu DNS
$jakedns = $dnspote.DNSServerSearchOrder
#pokud se DNS shoduje se vzorem
prvni hodnota je 192.168.100.249 a zaroven
#...druha hodnota je 8.8.8.8 pak
je splnena podminka a provede se vse v zavorkach
if (($jakedns -match "192.168.100.249") -and ($jakedns -match "8.8.8.8"))
#podminka vyse byla
splnena...zmena probehla v poradku..zapis uspech do logu
{ "Zmena dns na $stroj
probehla v poradku ......" >> "C:\dnsLog.txt"}
#zapis se nezdaril..zapis
neuspech do logu
else {"POZOR ...
zmena dns na $stroj selhala ......" >> "C:\dnsLog.txt"}
#prazdne radky do logu(ciste jen
graficka uprava vystupu)
" " >> "C:\dnsLog.txt"
" " >> "C:\dnsLog.txt"
#uzaviraci zavorka podminky(zda
je dostupny server nebo PC)
}
#podminka dostupnosti PC nebo
serveru nebyla splnena provede se ELSE
#..pokud spojeni selhalo zapiseme
informaci do logu
else {"nepodarilo se pripojit k
$stroj" >> "C:\dnsLog.txt"}
#uzavirajici zavorka bloku foreach
}