1 (изменено: JSmаn, 2020-07-03 14:23:29)

Тема: VBS скрипт для проверки и замены DNS адресов

VBS проверяет в настройках активного сетевого подключения поле  «Предпочитаемый и Альтернативный DNS-сервер» на локальном компьютере и если адрес не совпадает то меняет на заданные. Результат в лог в который запись добавляется, т.к. компьютеров не один или в созданный текст файл вида имя пользователя.имя компьютера.последний октет DNS адреса (ivan.pc1.101.100). Вариант лога с созданием текст файла вида ivan.pc1.101.100 предпочтительней.
Если адреса DNS совпадают с заданными, то ничего не делает, лог не нужен.
Нашел скрипт который меняет настройки DNS, но не знаю как прикрутить проверку и лог с созданием текст файла, скрипт будет добавлен с сценарий входа пользователя в систему. С VBS не работал.

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.101" , "192.168.1.100")
    objNetCard.SetDNSServerSearchOrder(arrDNSServers)
Next

2 (изменено: JSmаn, 2020-07-03 14:24:00)

Re: VBS скрипт для проверки и замены DNS адресов

Прошло 10 дней и никто не помог со скриптом, пришлось сделать самому, я не знаю правильно это или нет, но скрипт работает.

On Error Resume Next
Dim a
a = "192.168.1.100,192.168.1.101"

 strComputer = "."
 Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
 Set colItems = objWMIService.ExecQuery _
 ("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True")
 For Each objItem in colItems
  dns = Join(objItem.DNSServerSearchOrder, ",")
 Next

If a = dns Then
 Wscript.quit
Else
 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.101")
    objNetCard.SetDNSServerSearchOrder(arrDNSServers)
 Next
end If

'Выясняем имя юзера, компа, dns
set WshShell = WScript.CreateObject("WScript.Shell") 
User = WshShell.ExpandEnvironmentStrings("%USERNAME%") 
Comp = WshShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
strComputer = "."
 Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
 Set colItems = objWMIService.ExecQuery _
 ("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True")
 For Each objItem in colItems
  dns2 = Join(objItem.DNSServerSearchOrder, ",")
 Next 

Set objFSO = CreateObject("Scripting.FileSystemObject")
		ObjFSO.CreateTextFile "\\PC\script\" & User & "." & Comp & "." & dns2
 		    Wscript.quit

3

Re: VBS скрипт для проверки и замены DNS адресов

Лог получается такого формата: Admin.PC.192.168.1.100,192.168.1.101

4

Re: VBS скрипт для проверки и замены DNS адресов

sts, видел Ваше сообщение, но отреагировать было сложно, так был занят работой. Несколько раз перечитал Ваше сообщение, но так и не понял, что требуется. Про последний октет до сих пор не ясно. Если нужен только последний, то как я понимаю запись должна быть не ivan.pc1.101.100, а ivan.pc1.100 ? Или неверно понимаю ?

К тому же заметил несколько непонятных для меня моментов
1)


For Each objItem in colItems
  dns2 = Join(objItem.DNSServerSearchOrder, ",")
Next

Тут циклически идёт перезапись переменной dns2 (если есть несколько включенных адаптеров), но ниже по коду вы используете значение этой переменной только 1 раз. Получается, что лог создаётся только по последнему включенному адаптеру (с отличными от нужного DNS), у которого производим смену DNS. В своём коде я занёс формирование лога в цикл, чтобы лог формировался для всех активных адаптеров у которых сменили DNS

2) Не совсем понял почему у Вас в коде сначала производится смена DNS на нужные, а потом выдёргивание уже сменённых DNS для создания лога. В имя лога должны попасть DNS, которые были у адаптера до смены или же нет ?

3) Позволил себе немного перепахать Ваш код и пересобрал без лишних повторных созданий объектов и циклических преобразований массива в строку. Плюс добавил обработчик ошибок для метода SetDNSServerSearchOrder. Так как он "молчаливо" отрабатывает даже, если есть ошибка (Например не хватает прав на смену DNS и требуется запуск скрипта с правами Администратора).


'Включение директивы принудительного объявления переменных
Option Explicit
'Объявление переменных
Dim arrDestDNSServers, strDestDNSServers, strSrcDNSServers, objFSO, objWshNetwork, strUserName, strComputerName, objWMIService, colNetCards, objNetCard, intCode
Const strTitle = "DNS changer script"
'Массив DNS серверов, которые нужно проставить у сетевой карты
arrDestDNSServers = Array("192.168.1.100", "192.168.1.101")
'Преобразованное в строку значение массива arrDestDNSServers для ускорения процесса сравнения
strDestDNSServers = Join(arrDestDNSServers,",")
'Создание объекта для работы с файлами
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Получение текущих данных о ПК и пользователе
Set objWshNetwork = WScript.CreateObject("WScript.Network")
strComputerName = objWshNetwork.ComputerName 
strUserName = objWshNetwork.UserName
'Получение объектной модели WMI
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
'Получение списка адаптеров в системе
Set colNetCards = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
'Перебор активных сетевых карт
For Each objNetCard in colNetCards
	'Преобразование массива DNS сетевой карты в строку 
	strSrcDNSServers = Join(objNetCard.DNSServerSearchOrder,",")
    'Сравнение значений DNS у сетевой карты со строкой необходимых DNS
	If strSrcDNSServers <> strDestDNSServers Then
		'Если значения не совпали
		intCode = objNetCard.SetDNSServerSearchOrder(arrDestDNSServers)
		Select Case intCode
		Case 0 'Успешно, перезагрузка не требуется
			MsgBox GetErrorDescription(intCode), vbInformation, strTitle
		Case 1 'Успешно, но требуется перезагрузка
			MsgBox GetErrorDescription(intCode), vbExclamation, strTitle
		Case Else 'Ошибка
			MsgBox GetErrorDescription(intCode), vbCritical, strTitle
		End Select
		
		objFSO.CreateTextFile "\\PC\script\" & strUserName & "." & strComputerName & "." & strSrcDNSServers
	End if
Next
'Функция получения описания ошибки. Коды ошибок приведены тут https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/setdnsserversearchorder-method-in-class-win32-networkadapterconfiguration
Function GetErrorDescription(intCode)
	Dim strDesc
	Select Case intCode
	Case 0:strDesc="Successful completion, no reboot required"
	Case 1:strDesc="Successful completion, reboot required"
	Case 64:strDesc="Method not supported on this platform"
	Case 65:strDesc="Unknown failure"
	Case 66:strDesc="Invalid subnet mask"
	Case 67:strDesc="An error occurred while processing an Instance that was returned"
	Case 68:strDesc="Invalid input parameter"
	Case 69:strDesc="More than 5 gateways specified"
	Case 70:strDesc="Invalid IP address"
	Case 71:strDesc="Invalid gateway IP address"
	Case 72:strDesc="An error occurred while accessing the Registry for the requested information"
	Case 73:strDesc="Invalid domain name"
	Case 74:strDesc="Invalid host name"
	Case 75:strDesc="No primary/secondary WINS server defined"
	Case 76:strDesc="Invalid file"
	Case 77:strDesc="Invalid system path"
	Case 78:strDesc="File copy failed"
	Case 79:strDesc="Invalid security parameter"
	Case 80:strDesc="Unable to configure TCP/IP service"
	Case 81:strDesc="Unable to configure DHCP service"
	Case 82:strDesc="Unable to renew DHCP lease"
	Case 83:strDesc="Unable to release DHCP lease"
	Case 84:strDesc="IP not enabled on adapter"
	Case 85:strDesc="IPX not enabled on adapter"
	Case 86:strDesc="Frame/network number bounds error"
	Case 87:strDesc="Invalid frame type"
	Case 88:strDesc="Invalid network number"
	Case 89:strDesc="Duplicate network number"
	Case 90:strDesc="Parameter out of bounds"
	Case 91:strDesc="Access denied"
	Case 92:strDesc="Out of memory"
	Case 93:strDesc="Already exists"
	Case 94:strDesc="Path, file or object not found"
	Case 95:strDesc="Unable to notify service"
	Case 96:strDesc="Unable to notify DNS service"
	Case 97:strDesc="Interface not configurable"
	Case 98:strDesc="Not all DHCP leases could be released/renewed"
	Case 100:strDesc="DHCP not enabled on adapter"
	Case Else:strDesc="Other"
	End Select
	GetErrorDescription = strDesc
End Function
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !