Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Удаленная смена IP (http://forum.oszone.net/showthread.php?t=148254)

Dvizhnyak 18-08-2009 09:39 1196390

Удаленная смена IP
 
Здравствуйте. Есть сеть на 80 компов winXP. Компы в домене под win2003. Подняты DHCP и DNS . На компах IP адрес, маска, шлюз, днс выставлены вручную. Подскажите пожалуйста как удаленно(скриптом), через политики, сделать так что бы IP адреса, маска, шлюз, днс выдавались автоматом.

vitaliyboch 18-08-2009 10:20 1196417

Через VBS скрипт делал. Только у меня обратная задача была из DHCP переделать в статический. Посмотрю в архиве скрипт, может найду тебе готовое решение.

Petya V4sechkin 18-08-2009 10:54 1196435

Dvizhnyak, можно батником:
Код:

WMIC Path Win32_NetworkAdapterConfiguration Where "IPEnabled = True" Call SetDNSServerSearchOrder
WMIC Path Win32_NetworkAdapterConfiguration Where "IPEnabled = True" Call EnableDHCP


vitaliyboch 18-08-2009 11:23 1196460

Вот нашел сценарий, который включает DHCP:

Код:

sComputer = "ip_адрес_или_имя_компьютера"

' подключение к компьютеру
Set oWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & sComputer & "\root\cimv2")

' получение конфигурации сетевого адаптера, где не включен DHCP
Set oNetAdapters = oWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
 
' включение DHCP
For Each oNetAdapter In oNetAdapters
    errEnable = oNetAdapter.EnableDHCP()
Next

' результат операции
msgbox "Error code: " & errEnable

А вот такой скрит заменяет один статический или динамический IP на другой статический IP.
Скрипт можно использовать для перехода с DHCP на статику, указав в исходных данных:
old_ip_address=new_ip_address=текщий IP компьютера, которому меняем конфигурацию

Код:

' Исходные данные
strComputer = "old_ip_address"
sSubnetMask = "old_subnet_mask"
sNewIPAddress = "new_ip_address"
sWinsSecondaryServer = "second_wins_server"

' Поиск компьютера в сети
set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
set colItems = objWMIService.ExecQuery ("Select * From Win32_NetworkAdapter " & "Where NetConnectionID = " & "'Local Area Connection'")

for each objItem in colItems
    strMACAddress = objItem.MACAddress
next

set colItems = objWMIService.ExecQuery ("Select * From Win32_NetworkAdapterConfiguration WHERE MACAddress = '" & strMACAddress & "'")

' получение текущих параметров сетевого адаптера
dim aDNSServer()
dim aDefaultIPGateway()
dim aGatewayMetric()

for each oItem in colItems
        for each IPAddress in oItem.IPAddress
                sIPAddress = IPAddress
        next
      if sSubnetMask = "" then
                for each IPSubnet in oItem.IPSubnet
                        sSubnetMask = IPSubnet
                next
        end if
        iCounter = 0
        redim aDNSServer(0)
        for each DNSServer in oItem.DNSServerSearchOrder
                redim preserve aDNSServer (iCounter)
                aDNSServer(iCounter) = DNSServer
                iCounter = iCounter + 1
        next
        sWINSPrimaryServer = oItem.WINSPrimaryServer
        iCounter = 0
        redim aDefaultIPGateway(0)
        redim aGatewayMetric(0)
        for each DefaultIPGateway in oItem.DefaultIPGateway
                redim preserve aDefaultIPGateway (iCounter)
                aDefaultIPGateway(iCounter) = DefaultIPGateway
                redim preserve aGatewayMetric(iCounter)
                aGatewayMetric(iCounter) = iCounter + 1
                iCounter = iCounter + 1
        next
        exit for
next

' Составление новых параметров сетевого адаптера
aNewIPAddress = Array(sNewIPAddress)
aSubnetMask = Array(sSubnetMask)
for each DNSServer in aDNSServer
        sDNSServer = sDNSServer & DNSServer & ", "
next
for each DefaultIPGateway in aDefaultIPGateway
        sDefaultIPGateway = DefaultIPGateway
next

' Вывод статистики по текущей и по будущей конфигурации сетевого адаптера
msgbox "Current IP address: " & sIPAddress & vbCrLf & "New IP address:" & sNewIPAddress & vbCrLf _
        & "Subnet mask is " & sSubnetMask & vbCrLf _
        & "Default Gateway: " & sDefaultIPGateway & vbCrLf _
        & "DNS servers: " & sDNSServer & vbCrLf _
        & "WINS Primary Server: " & sWINSPrimaryServer

' Установка нового IP адреса
if sNewIPAddress <> "" then
        on error resume next
        For Each oNetAdapter in colItems
                errWINS = oNetAdapter.SetWINSServer(sWINSPrimaryServer, sWinsSecondaryServer)
                errDNS = oNetAdapter.SetDNSServerSearchOrder(aDNSServer)
                errGateways = oNetAdapter.SetGateways(aDefaultIPGateway, aGatewayMetric)
                errEnable = oNetAdapter.EnableStatic(aNewIPAddress, aSubnetMask)
                exit for
        Next
end if

' результат операции
msgbox errWINS + errDNS + errGateways + errEnable & " errors"


verna 19-08-2009 13:02 1197406

в 2003 только логон скриптами.

если КД 2008 и клиенты под Vista можно доменными политиками

batyaPS 24-08-2009 14:11 1201899

vitaliyboch,
Цитата:

Цитата vitaliyboch
А вот такой скрит заменяет один статический или динамический IP на другой статический IP.
Скрипт можно использовать для перехода с DHCP на статику, указав в исходных данных:
old_ip_address=new_ip_address=текщий IP компьютера, которому меняем конфигурацию »

в моем случае подойдет ?пост

batyaPS 24-08-2009 15:46 1201981

Цитата:

Цитата vitaliyboch
А вот такой скрит заменяет один статический или динамический IP на другой статический IP.
Скрипт можно использовать для перехода с DHCP на статику, указав в исходных данных:
old_ip_address=new_ip_address=текщий IP компьютера, которому меняем конфигурацию »


выдает ошибку сценария
строка : 11
символ : 1
ошибка : 0x80041017
код : 80041017
источник (null)

Цитата:

Цитата vitaliyboch
Вот нашел сценарий, который включает DHCP: »

еррор коде : 0

verna 25-08-2009 13:25 1202728

это скрипты запускаемые локально. а ТСу нужно удаленно

batyaPS 25-08-2009 14:43 1202790

Цитата:

Цитата verna
это скрипты запускаемые локально. а ТСу нужно удаленно »

а если через логон скрипт ?

verna 25-08-2009 14:49 1202796

можно, причем для 2003 это единственный вариант
об этом выше писал

batyaPS 25-08-2009 15:45 1202853

Цитата:

Цитата verna
можно, причем для 2003 это единственный вариант
об этом выше писал »


помогите кто нибудь эти скрипты чуть изменить для логон скрипта .
по типу


если IP тачка получает по DHCP то меняем на статический
если имя компа тото то меняем IP на такой то и прописываем маску , днс , шлюз.

такой то IP
такой ТО iP
такоц то Ip

vitaliyboch 29-12-2009 14:22 1306936

batyaPS, так надо не просто скрипт скопровать, а заполнить параметры
' Исходные данные
strComputer = "old_ip_address" - текущий IP адрес
sSubnetMask = "old_subnet_mask" - текущая маска сети
sNewIPAddress = "new_ip_address" - новый IP адрес
sWinsSecondaryServer = "second_wins_server" - можно не запонять

Скрипт запускается с компьютера администратора и менят настойки сетевого интерфейса указанного компьютера.

Цитата:

Цитата batyaPS
еррор коде : 0 »

означает что ошибок нет!

Вот пример заполнения исходных данных
' Исходные данные
strComputer = "172.31.26.123"
sSubnetMask = "255.255.240.0"
sNewIPAddress = "172.31.26.123"
sWinsSecondaryServer = ""

В данном случае перевожу комп с динамики на статику, поэтому новый и старый адреса одинаковые

batyaPS 01-01-2010 21:39 1308824

Цитата:

Цитата vitaliyboch
Вот пример заполнения исходных данных
' Исходные данные
strComputer = "172.31.26.123"
sSubnetMask = "255.255.240.0"
sNewIPAddress = "172.31.26.123"
sWinsSecondaryServer = "" »

скрипт отрабатывает . ошибок нет , но в свойствах TCP/IP не чего не меняется .

еще , зависит ли работа скрипта от кол-ва сетевых карт ? и как он определяет на каком интерфейсе менять настройки . ?

fomin_ 02-01-2010 11:26 1309023

batyaPS,
еще , зависит ли работа скрипта от кол-ва сетевых карт ? и как он определяет на каком интерфейсе менять настройки . ?
Не зависит. Скрипт ищет интерфейс с именем 'Local Area Connection' . Все остальное игнорируется.
Чтобы скрипт определил все подключенные проводные ethernet соединения, нужно заменить в скрипте
set colItems = objWMIService.ExecQuery ("Select * From Win32_NetworkAdapter " & "Where NetConnectionID = " & "'Local Area Connection'")
на
set colItems = objWMIService.ExecQuery ("Select * from Win32_NetworkAdapter Where NetConnectionID Like 'Local%'")
Но это тоже не поможет, тк логика работы скрипта подразумевает, что выбирается макадрес только из последнего экземпляра коллекции colItems:
for each objItem in colItems
strMACAddress = objItem.MACAddress
next

Короче, автору надо подправить скрипт

vitaliyboch 08-01-2010 00:33 1313761

Цитата:

Цитата batyaPS
еще , зависит ли работа скрипта от кол-ва сетевых карт ? и как он определяет на каком интерфейсе менять настройки . ? »

Не зависит от количества сетевых карт - скрипт поменяет настроки у той карты, у которой совпадет IP с указнааым в исходных данных.
Цитата:

Цитата batyaPS
скрипт отрабатывает . ошибок нет , но в свойствах TCP/IP не чего не меняется .

скрипт обязательно должен что-то выдать - либо ошибку с ее кодом, либо ноль - "0". Если этого не произошло, то либо неверные исходные данные, либо Вам не хватает прав для смены настроек.

batyaPS 08-01-2010 14:16 1314128

Цитата:

Цитата vitaliyboch
либо ноль - "0" »

0 выдает после выполнения , но на самой тачке не чего не меняется .
Может нужна перезагрузка ?

fomin_ 08-01-2010 17:41 1314335

По поводу почему после отработки скрипта ничего не меняется.
Скорее всего Вы используете русскую WinXP.
А в ней проводной интерфейс по умолчанию называется "Подключение по локальной сети"
Теперь обратимся к wmi запросу из скрипта:
set colItems = objWMIService.ExecQuery ("Select * From Win32_NetworkAdapter " & "Where NetConnectionID = " & "'Local Area Connection'")
Очевидно, что интерфейса с именем Local Area Connection в русской XP нет, поэтому скрипт не находит интерфейса и завершается, так ничего не изменив.
Чтобы wmi-запрос мог работать и с англ. и с русской XP, поменяйте приведенную строку скрипта на
set colItems = objWMIService.ExecQuery ("Select * From Win32_NetworkAdapter Where NetConnectionID like '%локальной%' or NetConnectionID like 'Local%'")

ЗЫ:
Предполагаю, что исправив эту ошибку, через несколько строк Вы упретесь в следующую.
(Такой уж скрипт!)

vitaliyboch 23-06-2010 15:38 1440184

Вот модификация скрипта, но мне кажется, что будут проблемы при удаленной смене конфигурации адаптера, если задать разные значения IP адреса текущего и нового.
Код:

' Целевой компьютер
mComputer = "."
' Новые сетевые параметры задаются конкретными значениями
' Аналогичные параметры задаются значением "The same"
' Пустые парамеры задаются значением ""
mNewIPAddress = "The same"
mNewSubnetMask = "The same"
mNewDNSServer = "The same"
mNewDefaultIPGateway = "The same"
mNewWINSPrimaryServer = "The same"
mNewWINSSecondaryServer = "The same"
' Рабочие массивы
Dim mDNSServerList()
Dim mDefaultIPGatewayList()
Dim mGatewayMetricList()
Dim mNewDNSServerList()
Dim mNewDefaultIPGatewayList()
Dim mNewGatewayMetricList()
' Подключение к пространству имен целевого компьютера
Set mSWbemServices = GetObject("winmgmts:\\" & mComputer & "\Root\CIMv2")
' Получение коллекции адаптеров с указанным IP-адресом
Set mAdapterList = mSWbemServices.ExecQuery ("Select * From Win32_NetworkAdapter")
' Получение MAC-адреса адаптера локального адаптера
For Each mCurrentAdapter In mAdapterList
    If InStr(LCase(mCurrentAdapter.NetConnectionID), "локальн") > 0 _
      Or InStr(LCase(mCurrentAdapter.NetConnectionID), "local") > 0 Then
        mMACAddress = mCurrentAdapter.MACAddress
        mCaption = mCurrentAdapter.Caption
        Exit For
    End If
Next
' Получение коллекции параметров адаптера с указанным MAC-адресом
Set mAdapterConfigList = mSWbemServices.ExecQuery _
  ("Select * From Win32_NetworkAdapterConfiguration WHERE MACAddress = '" _
  & mMACAddress & "'")
' Получение текущих параметров сетевого адаптера с указанным MAC-адресом
For Each mCurrentAdapterConfig In mAdapterConfigList
        ' IP-адрес
        If IsNull(mCurrentAdapterConfig.IPAddress) = False Then
        For Each mCurrentIPAddress In mCurrentAdapterConfig.IPAddress
            mIPAddress = mCurrentIPAddress
            Exit For
        Next
    End If
        If mNewIPAddress = "The same" Then mNewIPAddress = mIPAddress
    mNewIPAddressList = Array(mNewIPAddress)
        ' Маска подсети
        If IsNull(mCurrentAdapterConfig.IPSubnet) = False Then
        For Each mCurrentIPSubnet In mCurrentAdapterConfig.IPSubnet
            mSubnetMask = mCurrentIPSubnet
            Exit For
        Next
    End If
    If mNewSubnetMask = "The same" Then mNewSubnetMask = mSubnetMask
    mNewSubnetMaskList = Array(mNewSubnetMask)
        ' DNS сервера
        If IsNull(mCurrentAdapterConfig.DNSServerSearchOrder) = False Then
        iCounter = 0
        For Each mCurrentDNSServer In mCurrentAdapterConfig.DNSServerSearchOrder
            Redim Preserve mDNSServerList(iCounter)
            mDNSServerList(iCounter) = mCurrentDNSServer
            iCounter = iCounter + 1
        Next
        End If
        If mNewDNSServer = "The same" Then
        For iCounter = 0 To UBound(mDNSServerList)
            Redim Preserve mNewDNSServerList(iCounter)
            mNewDNSServerList(iCounter) = mDNSServerList(iCounter)
        Next
        Else
        For iCounter = 0 To UBound(Split(mNewDNSServer,";"))
            Redim Preserve mNewDNSServerList(iCounter)
            mNewDNSServerList(iCounter) = Split(mNewDNSServer,";")(iCounter)
        Next
        End If
        ' Шлюзы
        If IsNull(mCurrentAdapterConfig.DefaultIPGateway) = False Then
        iCounter = 0
        For Each mCurrentDefaultIPGateway In mCurrentAdapterConfig.DefaultIPGateway
            Redim Preserve mDefaultIPGatewayList(iCounter)
            mDefaultIPGatewayList(iCounter) = mCurrentDefaultIPGateway
            Redim Preserve mGatewayMetricList(iCounter)
            mGatewayMetricList(iCounter) = iCounter + 1
            iCounter = iCounter + 1
        Next
        End If
        If mNewDefaultIPGateway = "The same" Then
        For iCounter = 0 To UBound(mDefaultIPGatewayList)
            Redim Preserve mNewDefaultIPGatewayList(iCounter)
            mNewDefaultIPGatewayList(iCounter) = mDefaultIPGatewayList(iCounter)
            Redim Preserve mNewGatewayMetricList(iCounter)
            mNewGatewayMetricList(iCounter) = iCounter + 1
        Next
        Else
        For iCounter = 0 To UBound(Split(mNewDefaultIPGateway,";"))
            Redim Preserve mNewDefaultIPGatewayList(iCounter)
            mNewDefaultIPGatewayList(iCounter) = Split(mNewDefaultIPGateway,";")(iCounter)
            Redim Preserve mNewGatewayMetricList(iCounter)
            mNewGatewayMetricList(iCounter) = iCounter + 1
        Next
        End If
        ' WINS сервера
        If IsNull(mCurrentAdapterConfig.WINSPrimaryServer) = False Then
        mWINSPrimaryServer = mCurrentAdapterConfig.WINSPrimaryServer
    End If
        If mNewWINSPrimaryServer = "The same" Then
        If IsNull(mCurrentAdapterConfig.WINSPrimaryServer) = True Then
            mNewWINSPrimaryServer = ""
        Else
            mNewWINSPrimaryServer = mWINSPrimaryServer
        End If
    End If
        If IsNull(mCurrentAdapterConfig.WINSSecondaryServer) = False Then
        mWinsSecondaryServer = mCurrentAdapterConfig.WINSSecondaryServer
        End If
        If mNewWinsSecondaryServer = "The same" Then
        If IsNull(mCurrentAdapterConfig.WINSSecondaryServer) = True Then
            mNewWinsSecondaryServer = ""
        Else
            mNewWinsSecondaryServer = mWINSSecondaryServer
        End If
    End If
        Exit For
Next
' Формирование сообщения по текущей и по будущей конфигурациям сетевого адаптера
mInfoMessage = "Network adapter: " & mCaption & vbCrLf _
  & "MAC address: " & mMACAddress & vbCrLf _
  & "Current configuration:" & vbCrLf _
  & vbTab & "IP address: " & mIPAddress & vbCrLf _
  & vbTab & "Subnet mask: " & mSubnetMask & vbCrLf _
  & vbTab & "Default Gateway: " & Join(mDefaultIPGatewayList,";") & vbCrLf _
  & vbTab & "DNS servers: " & Join(mDNSServerList,";") & vbCrLf _
  & vbTab & "WINS Primary Server: " & mWINSPrimaryServer & vbCrLf _
  & vbTab & "WINS Secondary Server: " & mWINSSecondaryServer & vbCrLf _
  & "New configuration:" & vbCrLf _
  & vbTab & "IP address: " & mNewIPAddress & vbCrLf _
  & vbTab & "Subnet mask: " & mNewSubnetMask & vbCrLf _
  & vbTab & "Default Gateway: " & Join(mNewDefaultIPGatewayList,";") & vbCrLf _
  & vbTab & "DNS servers: " & Join(mNewDNSServerList,";") & vbCrLf _
  & vbTab & "WINS Primary Server: " & mNewWINSPrimaryServer & vbCrLf _
  & vbTab & "WINS Secondary Server: " & mNewWINSSecondaryServer & vbCrLf _
  & vbCrLf & "Please confirm the changes" & mNewWINSSecondaryServer & vbCrLf
' Окно подтверждения изменения настроек сетевого параметра
mChangeFlag = MsgBox(mInfoMessage, vbOKCancel, "Network card settings change")
If mChangeFlag = vbOK Then
    ' Установка нового IP адреса
    For Each mCurrentAdapterConfig in mAdapterConfigList
        errEnable = mCurrentAdapterConfig.EnableStatic _
          (mNewIPAddressList, mNewSubnetMaskList)
        errGateways = mCurrentAdapterConfig.SetGateways _
          (mNewDefaultIPGatewayList, mNewGatewayMetricList)
        errWINS = mCurrentAdapterConfig.SetWINSServer _
          (mNewWINSPrimaryServer, mNewWinsSecondaryServer)
        errDNS = mCurrentAdapterConfig.SetDNSServerSearchOrder _
          (mNewDNSServerList)
        Exit For
    Next
    ' Pезультат операции
    mInfoMessage = "Operation result:" & vbCrLf _
      & "IP address error code: " & errEnable & vbCrLf _
      & "Gateway error code: " & errGateways & vbCrLf _
      & "DNS error code: " & errDNS & vbCrLf _
      & "WINS error code: " & errWINS & vbCrLf
Else
    mInfoMessage = "The operation is canceled"
End If
Wscript.Echo(mInfoMessage)


vitaliyboch 25-06-2010 10:41 1441379

Как я и предполагал, существует проблема при смене IP адреса на компьютере из другого филиала. Текущий скрипт сначала меняет IP, а потом прописывает остальные параметры, но компьютер становится уже недоступен - нет верных настроек шлюза. Если изменить порядок внесения параметров и менять IP только после смены DNS серверов и шлюза, то шлюз оказывается пустым для статических параметров! Он почему-то прописывается в динамические характеристики.
Кто знает как обойти эту проблему?
В этой части кода изменен порядок внесения параметров
Код:

------
        errGateways = mCurrentAdapterConfig.SetGateways _
          (mNewDefaultIPGatewayList, mNewGatewayMetricList)
        errWINS = mCurrentAdapterConfig.SetWINSServer _
          (mNewWINSPrimaryServer, mNewWinsSecondaryServer)
        errDNS = mCurrentAdapterConfig.SetDNSServerSearchOrder _
          (mNewDNSServerList)
        errEnable = mCurrentAdapterConfig.EnableStatic _
          (mNewIPAddressList, mNewSubnetMaskList)
-------



Время: 12:05.

Время: 12:05.
© OSzone.net 2001-