VBS - ändra nätmask och gateway baserat på nuvarande IP

Permalänk
Medlem

VBS - ändra nätmask och gateway baserat på nuvarande IP

Hej,

Jag håller på med ett nätverksprojekt på jobbet som innebär att enheter ska byta nätmask och gateway.
Har bytt lite manuellt, men känner att det vore skönt att automatisera för att det ska gå lite smidigare och minska risken för fel.

Sedan tidigare så har jag ett script som sätter DNSer på enheterna, det ser ut såhär:

On Error Resume Next strComputer = "localhost" 'Next line contains the list of preferred DNS arrNewDNSServerSearchOrder = Array("1.1.1.1","2.2.2.2","3.3.3.3","4.4.4.4") Set WshShell = WScript.CreateObject("WScript.Shell") Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colNicConfigs = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True") strOutputMessage = "Trying to modify DNS server settings..." WScript.Echo strOutputMessage WshShell.LogEvent 4,strOutputMessage For Each objNicConfig In colNicConfigs If objNicConfig.DHCPEnabled = True Then strOutputMessage = "This computer is DHCP-enabled on the following adapter: " & objNicConfig.Caption & ". Skipping this adapter." WScript.Echo strOutputMessage WshShell.LogEvent 4,strOutputMessage Else intSetDNSServers = objNicConfig.SetDNSServerSearchOrder(arrNewDNSServerSearchOrder) If intSetDNSServers = 0 Then strOutputMessage = "DNS server search order set successfully on the following adapter: " & objNicConfig.Caption & " " & Err.Description WScript.Echo strOutputMessage WshShell.LogEvent 4,strOutputMessage Else strOutputMessage = "An error ocurred when setting DNS server search order on the following adapter: " & objNicConfig.Caption & " with the following error: " & intSetDNSServers & " " & Err.Description WScript.Echo strOutputMessage WshShell.LogEvent 4,strOutputMessage End If End If Next

Scriptet gör precis vad det ska och sätter DNSer på det aktiva kortet. Det här scriptet har jag hittat på nätet, så det är inget jag gjort själv.

Jag skulle vilja kombinera det med ett script som:

  1. Tar reda på nuvarande IP-adress

  2. Sätter gateway till x.y.z.126 där x.y.z är nuvarande nät från IP-adressen

  3. Sätter nätmasken till 255.255.255.0

  4. Sätter DNSer likt ovan

  5. Ger ett meddelande om att det är färdigt samt en omstart av maskinen.

Jag hittade ett script där jag får reda på nätet, precis som jag vill, men jag fattar fasen inte hur jag får dessa parametrar att sätta gateway.

dim NIC1, Nic, StrIP, arrIP Set NIC1 = GetObject("winmgmts:").InstancesOf("Win32_NetworkAdapterConfiguration") For Each Nic in NIC1 if Nic.IPEnabled then StrIP = Nic.IPAddress(i) arrIP = Split(strIP, ".") MsgBox "Net: " & arrIP(0) & "." & arrIP(1) & "." & arrIP(2),4160,"Test" wscript.quit End if Next

Är det någon som kan hjälpa mig i rätt riktning?
Jag är helt nybörjare på vbs, och programmering överlag. Har gjort endel batfiler, men inte såhär avancerat.

Tacksam för all hjälp jag kan få!

Permalänk
Medlem

Låter bakvänt, varför inte använda DHCP?

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av Garmzon:

Låter bakvänt, varför inte använda DHCP?

Skickades från m.sweclockers.com

Det hade ju givetvis varit det smidigaste.
Dock så är det maskiner som har sin givna plats på nätverket, allt är baserat på dess IP-adresser.
Därav kan vi inte använda oss av DHCP, inte heller genom att sätta MAC-adresser i DHCP-servern för det jobbet tar längre tid än att sätta IP-adresserna manuellt. Enheterna byts ibland dessutom.

Permalänk
Medlem

Det verkar finnas en metod för att sätta gateway som heter SetGateways.

Kör du en 'Get-WmiObject -Class win32_networkadapterconfiguration -Filter "IPenabled = 'true'" | Get-Member' i powershell så syns den tillsammans med de metoder du redan använder i ditt script. Kan tyvärr ingenting om VBS så hur det ska implementeras där låter jag vara osagt.

Hittade även följande länk som verkar handla om ett liknande problem.

Visa signatur

Primär: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |

Permalänk
Medlem
Skrivet av Daz:

Det verkar finnas en metod för att sätta gateway som heter SetGateways.

Kör du en 'Get-WmiObject -Class win32_networkadapterconfiguration -Filter "IPenabled = 'true'" | Get-Member' i powershell så syns den tillsammans med de metoder du redan använder i ditt script. Kan tyvärr ingenting om VBS så hur det ska implementeras där låter jag vara osagt.

Hittade även följande länk som verkar handla om ett liknande problem.

Tack för länken! Ska läsa noga. Hur jag nu kunde missa den i mitt googlande...

Som ett tillägg, maskinerna som ska köra koden kör antingen XP Embedded eller POS Ready 7, så det är inte kompletta operativsystem.
Kör jag "powershell" i kommandoprompt på XP-maskinerna så får jag felmeddelande om att powershell inte finns...

Permalänk
Medlem
Skrivet av tobberman:

Tack för länken! Ska läsa noga. Hur jag nu kunde missa den i mitt googlande...

Som ett tillägg, maskinerna som ska köra koden kör antingen XP Embedded eller POS Ready 7, så det är inte kompletta operativsystem.
Kör jag "powershell" i kommandoprompt på XP-maskinerna så får jag felmeddelande om att powershell inte finns...

Ouch, visste inte om att det var sådana OS inblandade. Tänkte rekommendera att du kan interagera med WMI object även genom cmd men wmic verkar inte vara tillgängligt för XP efter en snabb googling.

Hittade följande, som troligen även du hittat, om hur man sätter och hämtar information om gateway/subnet med VBS https://www.tek-tips.com/viewthread.cfm?qid=584142 men annars kan jag nog tyvärr inte vara till någon större hjälp.

Visa signatur

Primär: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |

Permalänk
Medlem

Möjligen kan netsh kommandot finnas även i de OS:en och man kan byta IP via netsh.

FÖr att läsa ut nuvarande kan man tex köra ipconfig/all och sen bearbeta utdatat tills man får det man vill ha

Visa signatur

Arbetsdator: HFX Mini. Ryzen 3600, GTX1650. Skärmar: Dell 2415

Permalänk
Medlem
Skrivet av Daz:

Ouch, visste inte om att det var sådana OS inblandade. Tänkte rekommendera att du kan interagera med WMI object även genom cmd men wmic verkar inte vara tillgängligt för XP efter en snabb googling.

Hittade följande, som troligen även du hittat, om hur man sätter och hämtar information om gateway/subnet med VBS https://www.tek-tips.com/viewthread.cfm?qid=584142 men annars kan jag nog tyvärr inte vara till någon större hjälp.

Nej, tyvärr blir man ju väldigt begränsad av att det är XP inblandat tyvärr.

Skrivet av mats42:

Möjligen kan netsh kommandot finnas även i de OS:en och man kan byta IP via netsh.

FÖr att läsa ut nuvarande kan man tex köra ipconfig/all och sen bearbeta utdatat tills man får det man vill ha

Jadå, netsh finnes.

I scripten som jag redan pysslat med så får jag fram nätet baserat på aktivt nätverkskort, det som jag nu behöver assistans med är hur jag sätter dessa som parametrar i scriptet och använder kommandot för att sätta IP-adressen.

Själva kommandona för att sätta och läsa har jag, jag har bara ingen aning om hur jag får ut värdet från läsningen till en parameter som kan användas för att sätta IP-adressen också.

Hoppas det finns någon kunnig som kan assistera. Det känns som att det jag behöver hjälp med är rätt enkelt, men jag är fasen för dum för att få till det. Därav hoppas jag på att nån smart kan rycka in och rädda dagen!

Permalänk
Medlem

lägg upp de script du har, det är en bra start

Visa signatur

Arbetsdator: HFX Mini. Ryzen 3600, GTX1650. Skärmar: Dell 2415

Permalänk
Medlem
Skrivet av mats42:

lägg upp de script du har, det är en bra start

Absolut, det är en bra idé!
Scripten finns dock i första inlägget.

Permalänk
Medlem

@tobberman: Oooops, ska man läsa hela tråden också

Som kompensation för det så tog jag en titt. Win32_NetworkAdapterConfiguration innehåller allt du behöver för att kunna sätta DNS, Subnät och gateway.

DNS hade du hittat sen tidgare.

Scriptet du hade hittat för att visa IPaddressen kan man slakta ned rätt hårt om man kombinerar det med DNS scriptet. Då finns ju redan ett objekt skapat för nätverkskortet och om vi går in efter

If objNicConfig.DHCPEnabled = True Then strOutputMessage = "This computer is DHCP-enabled on the following adapter: " & objNicConfig.Caption & ". Skipping this adapter." WScript.Echo strOutputMessage WshShell.LogEvent 4,strOutputMessage Else

Så behövs egentligen bara en enda rad för att ta fram ipaddresen

StrIP = objNicConfig.IPAddress(0)

För att sen ta fram nätet i ditt fall så kan man använda

arrIP = Split(strIP, ".") StrNet=arrIP(0) & "." & arrIP(1) & "." & arrIP(2)

Lägger man sen ihop nätet med den addressen du ville ha (.126) för gateway så kan man tex göra

StrGateSuffix =".126" StrGateway=(StrNet & StrGateSuffix)

Nu har vi alltså ipadressen för Gateway i StrGateway.
I Win32_NetworkAdapterConfiguration finns en SetGateways metod som man kan använda för att sätta gateway.
Dock vill den absolut ha datat formaterat som array så för att kunna nyttja en string så får vi konvertera den. Det kan vi göra på en gång när vi ropar på funktionen tex med

objNicConfig.SetGateways(array(StrGateway))

För att sätta subnätmasken behöver du använda EnableStatic metoden.
Den förväntar sig Ipaddress, och subnät som två arrayer.
Ett sätt att anropa den blir då

objNicConfig.EnableStatic(array(StrIP),array(StrSubnet))

Och StrIP hade vi ju redan fixat

Visa signatur

Arbetsdator: HFX Mini. Ryzen 3600, GTX1650. Skärmar: Dell 2415