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
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !