W jaki sposób można skonfigurować komputer tak, by używał dynamicznego serwera DNS?
Skrypciarze odpowiadają na Wasze pytania
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