<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBS скрипт для проверки и замены DNS адресов]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=15444</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=15444&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBS скрипт для проверки и замены DNS адресов».]]></description>
		<lastBuildDate>Tue, 23 Jun 2020 19:30:05 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBS скрипт для проверки и замены DNS адресов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140270#p140270</link>
			<description><![CDATA[<p><strong>sts</strong>, видел Ваше сообщение, но отреагировать было сложно, так был занят работой. Несколько раз перечитал Ваше сообщение, но так и не понял, что требуется. Про последний октет до сих пор не ясно. Если нужен только последний, то как я понимаю запись должна быть не ivan.pc1.<strong>101.100</strong>, а ivan.pc1.<strong>100</strong> ? Или неверно понимаю ?</p><p>К тому же заметил несколько непонятных для меня моментов<br />1) </p><div class="codebox"><pre><code>
For Each objItem in colItems
  dns2 = Join(objItem.DNSServerSearchOrder, &quot;,&quot;)
Next
</code></pre></div><p>Тут циклически идёт перезапись переменной dns2 (если есть несколько включенных адаптеров), но ниже по коду вы используете значение этой переменной только 1 раз. Получается, что лог создаётся только по последнему включенному адаптеру (с отличными от нужного DNS), у которого производим смену DNS. В своём коде я занёс формирование лога в цикл, чтобы лог формировался для всех активных адаптеров у которых сменили DNS</p><p>2) Не совсем понял почему у Вас в коде сначала производится смена DNS на нужные, а потом выдёргивание уже сменённых DNS для создания лога. В имя лога должны попасть DNS, которые были у адаптера до смены или же нет ?</p><p>3) Позволил себе немного перепахать Ваш код и пересобрал без лишних повторных созданий объектов и циклических преобразований массива в строку. Плюс добавил обработчик ошибок для метода <strong>SetDNSServerSearchOrder</strong>. Так как он &quot;молчаливо&quot; отрабатывает даже, если есть ошибка (Например не хватает прав на смену DNS и требуется запуск скрипта с правами Администратора).</p><div class="codebox"><pre><code>
&#039;Включение директивы принудительного объявления переменных
Option Explicit
&#039;Объявление переменных
Dim arrDestDNSServers, strDestDNSServers, strSrcDNSServers, objFSO, objWshNetwork, strUserName, strComputerName, objWMIService, colNetCards, objNetCard, intCode
Const strTitle = &quot;DNS changer script&quot;
&#039;Массив DNS серверов, которые нужно проставить у сетевой карты
arrDestDNSServers = Array(&quot;192.168.1.100&quot;, &quot;192.168.1.101&quot;)
&#039;Преобразованное в строку значение массива arrDestDNSServers для ускорения процесса сравнения
strDestDNSServers = Join(arrDestDNSServers,&quot;,&quot;)
&#039;Создание объекта для работы с файлами
Set objFSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)
&#039;Получение текущих данных о ПК и пользователе
Set objWshNetwork = WScript.CreateObject(&quot;WScript.Network&quot;)
strComputerName = objWshNetwork.ComputerName 
strUserName = objWshNetwork.UserName
&#039;Получение объектной модели WMI
Set objWMIService = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2&quot;)
&#039;Получение списка адаптеров в системе
Set colNetCards = objWMIService.ExecQuery(&quot;SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True&quot;)
&#039;Перебор активных сетевых карт
For Each objNetCard in colNetCards
	&#039;Преобразование массива DNS сетевой карты в строку 
	strSrcDNSServers = Join(objNetCard.DNSServerSearchOrder,&quot;,&quot;)
    &#039;Сравнение значений DNS у сетевой карты со строкой необходимых DNS
	If strSrcDNSServers &lt;&gt; strDestDNSServers Then
		&#039;Если значения не совпали
		intCode = objNetCard.SetDNSServerSearchOrder(arrDestDNSServers)
		Select Case intCode
		Case 0 &#039;Успешно, перезагрузка не требуется
			MsgBox GetErrorDescription(intCode), vbInformation, strTitle
		Case 1 &#039;Успешно, но требуется перезагрузка
			MsgBox GetErrorDescription(intCode), vbExclamation, strTitle
		Case Else &#039;Ошибка
			MsgBox GetErrorDescription(intCode), vbCritical, strTitle
		End Select
		
		objFSO.CreateTextFile &quot;\\PC\script\&quot; &amp; strUserName &amp; &quot;.&quot; &amp; strComputerName &amp; &quot;.&quot; &amp; strSrcDNSServers
	End if
Next
&#039;Функция получения описания ошибки. Коды ошибок приведены тут 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=&quot;Successful completion, no reboot required&quot;
	Case 1:strDesc=&quot;Successful completion, reboot required&quot;
	Case 64:strDesc=&quot;Method not supported on this platform&quot;
	Case 65:strDesc=&quot;Unknown failure&quot;
	Case 66:strDesc=&quot;Invalid subnet mask&quot;
	Case 67:strDesc=&quot;An error occurred while processing an Instance that was returned&quot;
	Case 68:strDesc=&quot;Invalid input parameter&quot;
	Case 69:strDesc=&quot;More than 5 gateways specified&quot;
	Case 70:strDesc=&quot;Invalid IP address&quot;
	Case 71:strDesc=&quot;Invalid gateway IP address&quot;
	Case 72:strDesc=&quot;An error occurred while accessing the Registry for the requested information&quot;
	Case 73:strDesc=&quot;Invalid domain name&quot;
	Case 74:strDesc=&quot;Invalid host name&quot;
	Case 75:strDesc=&quot;No primary/secondary WINS server defined&quot;
	Case 76:strDesc=&quot;Invalid file&quot;
	Case 77:strDesc=&quot;Invalid system path&quot;
	Case 78:strDesc=&quot;File copy failed&quot;
	Case 79:strDesc=&quot;Invalid security parameter&quot;
	Case 80:strDesc=&quot;Unable to configure TCP/IP service&quot;
	Case 81:strDesc=&quot;Unable to configure DHCP service&quot;
	Case 82:strDesc=&quot;Unable to renew DHCP lease&quot;
	Case 83:strDesc=&quot;Unable to release DHCP lease&quot;
	Case 84:strDesc=&quot;IP not enabled on adapter&quot;
	Case 85:strDesc=&quot;IPX not enabled on adapter&quot;
	Case 86:strDesc=&quot;Frame/network number bounds error&quot;
	Case 87:strDesc=&quot;Invalid frame type&quot;
	Case 88:strDesc=&quot;Invalid network number&quot;
	Case 89:strDesc=&quot;Duplicate network number&quot;
	Case 90:strDesc=&quot;Parameter out of bounds&quot;
	Case 91:strDesc=&quot;Access denied&quot;
	Case 92:strDesc=&quot;Out of memory&quot;
	Case 93:strDesc=&quot;Already exists&quot;
	Case 94:strDesc=&quot;Path, file or object not found&quot;
	Case 95:strDesc=&quot;Unable to notify service&quot;
	Case 96:strDesc=&quot;Unable to notify DNS service&quot;
	Case 97:strDesc=&quot;Interface not configurable&quot;
	Case 98:strDesc=&quot;Not all DHCP leases could be released/renewed&quot;
	Case 100:strDesc=&quot;DHCP not enabled on adapter&quot;
	Case Else:strDesc=&quot;Other&quot;
	End Select
	GetErrorDescription = strDesc
End Function
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Tue, 23 Jun 2020 19:30:05 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140270#p140270</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS скрипт для проверки и замены DNS адресов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140233#p140233</link>
			<description><![CDATA[<p>Лог получается такого формата: Admin.PC.192.168.1.100,192.168.1.101</p>]]></description>
			<author><![CDATA[null@example.com (sts)]]></author>
			<pubDate>Mon, 22 Jun 2020 18:07:56 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140233#p140233</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS скрипт для проверки и замены DNS адресов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140232#p140232</link>
			<description><![CDATA[<p>Прошло 10 дней и никто не помог со скриптом, пришлось сделать самому, я не знаю правильно это или нет, но скрипт работает.</p><div class="codebox"><pre><code>On Error Resume Next
Dim a
a = &quot;192.168.1.100,192.168.1.101&quot;

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

If a = dns Then
 Wscript.quit
Else
 strComputer = &quot;.&quot;
 Set objWMIService = GetObject(&quot;winmgmts:&quot; _
    &amp; &quot;{impersonationLevel=impersonate}!\\&quot; &amp; strComputer &amp; &quot;\root\cimv2&quot;)

 Set colNetCards = objWMIService.ExecQuery _
    (&quot;Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True&quot;)

 For Each objNetCard in colNetCards
    arrDNSServers = Array(&quot;192.168.1.100&quot; , &quot;192.168.1.101&quot;)
    objNetCard.SetDNSServerSearchOrder(arrDNSServers)
 Next
end If

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

Set objFSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)
		ObjFSO.CreateTextFile &quot;\\PC\script\&quot; &amp; User &amp; &quot;.&quot; &amp; Comp &amp; &quot;.&quot; &amp; dns2
 		    Wscript.quit</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (sts)]]></author>
			<pubDate>Mon, 22 Jun 2020 18:06:16 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140232#p140232</guid>
		</item>
		<item>
			<title><![CDATA[VBS скрипт для проверки и замены DNS адресов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140131#p140131</link>
			<description><![CDATA[<p>VBS проверяет в настройках активного сетевого подключения поле&nbsp; «Предпочитаемый и Альтернативный DNS-сервер» на локальном компьютере и если адрес не совпадает то меняет на заданные. Результат в лог в который запись добавляется, т.к. компьютеров не один или в созданный текст файл вида имя пользователя.имя компьютера.последний октет DNS адреса (ivan.pc1.101.100). Вариант лога с созданием текст файла вида ivan.pc1.101.100 предпочтительней.<br />Если адреса DNS совпадают с заданными, то ничего не делает, лог не нужен.<br />Нашел скрипт который меняет настройки DNS, но не знаю как прикрутить проверку и лог с созданием текст файла, скрипт будет добавлен с сценарий входа пользователя в систему. С VBS не работал.</p><div class="codebox"><pre><code>strComputer = &quot;.&quot;
Set objWMIService = GetObject(&quot;winmgmts:&quot; _
    &amp; &quot;{impersonationLevel=impersonate}!\\&quot; &amp; strComputer &amp; &quot;\root\cimv2&quot;)

Set colNetCards = objWMIService.ExecQuery _
    (&quot;Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True&quot;)

For Each objNetCard in colNetCards
    arrDNSServers = Array(&quot;192.168.1.101&quot; , &quot;192.168.1.100&quot;)
    objNetCard.SetDNSServerSearchOrder(arrDNSServers)
Next</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (sts)]]></author>
			<pubDate>Sat, 13 Jun 2020 07:47:07 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140131#p140131</guid>
		</item>
	</channel>
</rss>
