Я пытаюсь использовать сценарий netsh для изменения IP-адреса на безголовом ящике. Это нормально работает, если нет конфликта IP-адресов. Когда возникает конфликт IP-адресов, я вижу диалоговое окно, в котором говорится: «Статический IP-адрес, который был только что настроен, уже используется в сети. Измените конфигурацию другого IP-адреса». В этом случае netsh просто зависает, ожидая, пока кто-нибудь подтвердит появление диалогового окна.
Я не буду использовать скрипт, и пользователи, которые это делают, определенно иногда вызывают конфликт IP-адресов. Есть ли способ заставить netsh вместо этого просто возвращать код ошибки? Все было бы лучше, чем просто повесить.
Я подозреваю, что диалог отображается не в netsh, а в операционной системе, когда она обнаруживает конфликт IP-адресов.
Вы можете попробовать выполнить эхо-запрос по желаемому IP-адресу, и если ответа не будет, предположите, что адрес свободен, и установите его с помощью netsh. Следующий vbscript предоставляет пример:
Set oShell = CreateObject("WScript.Shell")
Set oExec = oShell.Exec("ping -n 2 -w 2000 192.168.2.3")
sResult = LCase(oExec.StdOut.ReadAll)
If InStr(sResult, "reply from") Then
WScript.Echo "IP address is in use"
Else
oShell.Run "netsh interface ip set address name=" _
& Chr(34) & "Local Area Connection" _
& Chr(34) & " static 192.168.2.3 255.255.255.0 192.168.2.1 1", 1, 1
End If
Сценарий отправляет 2 пакета ping с интервалом в 2 секунды и проверяет ответ, включающий «ответ от». Вы даже можете настроить сценарий для увеличения IP-адреса и повторять попытку, пока не будет найден неиспользуемый адрес.
Вы также можете попробовать что-то подобное с помощью nslookup, так как ping будет работать только в том случае, если компьютер с конфликтующим IP-адресом в настоящее время включен.
Я нашел лучший способ сделать это - подождать определенное время, а затем убить процесс netsh, если он не завершился. Я сделал это, создав отдельный процесс для netsh из C #.