Centrum skryptów - Systemy operacyjne

W jaki sposób można skonfigurować komputer tak, by używał dynamicznego serwera DNS? Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

W jaki sposób można skonfigurować komputer tak, by używał dynamicznego serwera DNS?

Cześć, Skrypciarzu! Co mogę zrobić, aby skonfigurować komputer tak, by używał dynamicznego serwera DNS?

-- Mariusz

Cześć, Mariuszu. Ech, to pytanie wywołuje wspomnienia. Przed kilkoma laty stanęliśmy wobec identycznego problemu, a rozwiązanie znaleźliśmy zupełnie przypadkowo; prawdę mówiąc, gdyby Greg posiadł umiejętność wstukania na klawiaturze pięciu znaków bez literówki, z pewnością nigdy nie udałoby się nam nic wymyślić. No cóż, jednak dzięki pomyłce Grega mamy dla Ciebie odpowiedź.

Dla użytkowników, którzy nie bardzo wiedzą, o czym mówimy: prosimy spojrzeć na właściwości protokołu połączenia sieciowego TCP/IP. Jak widać, poniższa karta sieciowa została skonfigurowana tak, by automatycznie pobierać zarówno adres IP, jak i adres serwera DNS:

Tak naprawdę interesuje nas druga część, czyli automatyczne uzyskiwanie adresu serwera DNS. Dlaczego nie obchodzi nas uzyskiwanie adresu IP? Dlatego, że takie skonfigurowanie karty sieciowej, by pobierała adres IP z serwera DHCP jest łatwe; mamy nawet tutaj skrypt, który się tym zajmie:

strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



Set colNetAdapters = objWMIService.ExecQuery _

    ("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")

 

For Each objNetAdapter In colNetAdapters

    errEnable = objNetAdapter.EnableDHCP()

Next

Równie łatwo jest przypisać sieci określone serwery DNS. Oto skrypt przypisujący dwa serwery DNS (o adresach 192.168.1.100 i 192.168.1.200) wszystkim kartom sieciowym z włączonym protokołem IP na danym komputerze:

strComputer = "."



Set objWMIService = GetObject("winmgmts:" _

    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")



Set colNetCards = objWMIService.ExecQuery _

    ("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True")



For Each objNetCard in colNetCards

    arrDNSServers = Array("192.168.1.100", "192.168.1.200")

    objNetCard.SetDNSServerSearchOrder(arrDNSServers)

Next

Jak jednak wyłączyć przypisanie adresu DNS? To znaczy, w jaki sposób można skonfigurować kartę sieciową tak, by automatycznie uzyskiwała adresy serwerów DNS? Ustawienie wartości SetDNSServerSearchOrder na zero nie zadziała; przypisanie jej pustego ciągu znaków też nie; ani przypisanie jej tablicy pustych ciągów. Czy zatem serwery DNS są jak rzepy i nigdy się ich nie można pozbyć?

Na szczęście nie. Jak napisaliśmy wcześniej, Greg, próbując rozwiązać ten problem, przypadkiem pomylił się wstukując kod: zapomniał podać wartości tablicy (serwery DNS muszą być przypisane w postaci tablicy, nawet jeśli chodzi tylko o jeden serwer). I – uwaga – zadziałało! Oto owoc jego, hmm, trudu:

strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



Set colNetCards = objWMIService.ExecQuery _

    ("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True")



For Each objNetCard in colNetCards

    arrDNSServers = Array()

    objNetCard.SetDNSServerSearchOrder(arrDNSServers)

Next

Najpierw łączymy się z usługą WMI, następnie pobieramy zbiór wszystkich wystąpień klasy Win32_NetworkAdapterConfiguration, w których właściwość IPEnabled ma wartość prawdy. Dzięki temu możemy namierzyć „prawdziwe” karty sieciowe, eliminując karty wirtualne i inne połączenia z wyłączonym protokołem IP.

Kiedy uzyskaliśmy listę kart sieciowych z włączonym protokołem IP, dalsza akcja przebiegać będzie w obrębie pętli For Each przechodzącej przez wszystkie elementy tej listy. Najpierw przypisujemy zmiennej arrDNSServers całkowicie pustą tablicę (w ogóle bez elementów); dzieje się to tu:

arrDNSServers = Array()

Następnie przekazujemy tę pustą tablicę jako jedyny parametr metody SetDNSServerSearchOrder:

objNetCard.SetDNSServerSearchOrder(arrDNSServers)

I to już wszystko; teraz wszystkie karty sieciowe z włączonym protokołem IP będą automatycznie uzyskiwały adresy swoich serwerów DNS.

Jak mawia Greg: geniusz bywa przeceniany. Znaczy, zwykle mówi „gieniusz”, ale nie będziemy się czepiać...

 Do początku strony Do początku strony


Centrum skryptów - Systemy operacyjne