2015-06-04 131 views
0

我在写一个脚本来设置静态IP给计算机。它读取一个具有mac addr - ip addr对的文件。基于计算机的mac地址,它从文件中获取其ip地址。我有问题设置。我从来没有做过任何一种.net编程。我写了一个适用于linux的bash脚本,但对于windows我没有任何经验。我在vb.net写了这个程序。到目前为止,程序可以从文件中获取数据,现在我必须根据MAC地址和主机名来设置静态IP。有几个不同的职位1,2,但他们都在C#中,并有问题转换为VB.Net。如果有人能够提供关于如何为本地计算机上的特定NIC设置静态IP地址的指针,那将会很棒。设置静态IP地址VB.net

Imports System 
Imports System.Text.RegularExpressions 
Imports System.Net.NetworkInformation 
Imports System.IO 
Imports System.Management 


Module Module1 

Const FAILURE = 1 
Const SUCCESS = 0 
Dim phyAddr As String = getMAC() 


Sub Main() 

    Dim arguments(3) As String 
    Dim fileName As String = "" 


    If Environment.GetCommandLineArgs.Count = 3 Then 

     arguments = Environment.GetCommandLineArgs 
     fileName = arguments(2) 

    Else 

     Console.WriteLine("Wrong Syntax!") 
     help() 
     Console.Read() 
     close(FAILURE) 

    End If 

    If validName(fileName) Then 

     If fileExists(fileName) Then 

      'search file for ip 
      Dim confData As String = searchFile(phyAddr, fileName) 

      If Not String.IsNullOrEmpty(confData) Then 

       Dim netConf() As String = splitLine(confData) 

       Dim hostName As String = netConf(1) 
       Dim ipAddr As String = netConf(2) 
       Dim netMask As String = netConf(3) 
       Dim gateway As String = netConf(4) 
       Dim dns1 As String = netConf(5) 
       Dim dns2 As String = netConf(6) 




      Else 
       Console.WriteLine("Couldn't find MAC {0} in file {1}", phyAddr, fileName) 
       Console.Read() 
       close(FAILURE) 
      End If 


     Else 

      Console.WriteLine("File {0} doesn't exist", fileName) 
      Console.WriteLine("Please provide an absolute path to file") 
      Console.Read() 
      close(FAILURE) 
     End If 

    Else 
     Console.WriteLine("File name {0} not recognized", fileName) 
     Console.Read() 
     close(FAILURE) 
    End If 


End Sub 

Private Sub help() 
    Console.WriteLine("Please call program as: ") 
    Console.WriteLine("networkconfiguration -f datafile") 
End Sub 

Private Sub close(exitCode As Integer) 
    Environment.Exit(exitCode) 
End Sub 

Private Function validName(name As String) As Boolean 
    Static fileNameExpression As New Regex("^[\\:_a-zA-Z0-9.]+") 
    Return fileNameExpression.IsMatch(name) 
End Function 

Private Function fileExists(name As String) As Boolean 
    Return My.Computer.FileSystem.FileExists(name) 

End Function 

Private Function getMAC() As String 

    Dim nic As NetworkInterface 
    Dim result As String = String.Empty 

    For Each nic In NetworkInterface.GetAllNetworkInterfaces() 
     If nic.Name.Contains("Ethernet0") Then 
      result = nic.GetPhysicalAddress.ToString 
      Exit For 
     End If 
    Next 

    Return result 
End Function 


Private Function searchFile(keyword As String, fileName As String) As String 

    'store result 
    Dim result As String = String.Empty 

    'search for keyword in returned data 
    Using reader As New StreamReader(fileName) 
     While Not reader.EndOfStream 
      Dim line As String = reader.ReadLine 
      If line.Contains(keyword) Then 
       result = line 
       Exit While 
      End If 
     End While 
    End Using 

    Return result 

End Function 

Private Function splitLine(line As String) As String() 
    Dim separator As Char = ";" 
    Return line.Split(separator) 
End Function 


Private Function setupNetwork(ipAddr As String, netmask As String, gateway As String, dns1 As String, dns2 As String) As Boolean 

    Dim mc As New ManagementClass("Win32_NetworkAdapterConfiguration") 
    Dim moc As New ManagementObjectCollection 
    Dim mo As ManagementObject 

    moc = mc.GetInstances() 
    For Each mo In moc 
     'make sure this is ipenabled device 
     'not something like memory card or VMWare 

    Next 






End Function 

End Module 

回答

0

好的解决了它。我会在这里发布我的答案,这样其他人可能会受益。

' set the network configuration of a computer 
Function setupNetwork(phyAddr As String, ipAddr As String, netmask As String, gateway As String, dns1 As String, dns2 As String) As Boolean 
    Dim result As Boolean = False 

    ' concatenate two dns addresses into one 
    Dim dnsSearchOrder As String = dns1 + "," + dns2 

    Dim objMC As ManagementClass = New ManagementClass("Win32_NetworkAdapterConfiguration") 
    Dim objMOC As ManagementObjectCollection = objMC.GetInstances() 

    For Each objMO As ManagementObject In objMOC 

     If (CBool(objMO("IPEnabled"))) Then 

      ' remove colons from mac address so that it could match the 
      ' provided mac address 
      Dim origMAC As String = objMO("MacAddress").ToString() 
      Dim pattern As String = ":" 
      Dim replacement As String = "" 
      Dim rgx As New Regex(pattern) 
      ' the mac address with colons removed from it 
      Dim repMAC As String = rgx.Replace(origMAC, replacement) 

      If (String.Equals(phyAddr, repMAC)) Then 
       Try 
        Dim objNewIP As ManagementBaseObject = Nothing 
        Dim objNewGate As ManagementBaseObject = Nothing 
        Dim objNewDNS As ManagementBaseObject = Nothing 
        Dim objSetIP As ManagementBaseObject = Nothing 

        objNewIP = objMO.GetMethodParameters("EnableStatic") 
        objNewGate = objMO.GetMethodParameters("SetGateways") 
        objNewDNS = objMO.GetMethodParameters("SetDNSServerSearchOrder") 

        'set defaultgateway 
        objNewGate("DefaultIPGateway") = New String() {gateway} 
        objNewGate("GatewayCostMetric") = New Integer() {1} 

        'set ipaddress and subnetmask 
        objNewIP("IPAddress") = New String() {ipAddr} 
        objNewIP("SubnetMask") = New String() {netmask} 
        objNewDNS("DNSServerSearchOrder") = dnsSearchOrder.Split(",") 

        objSetIP = objMO.InvokeMethod("EnableStatic", objNewIP, Nothing) 
        objSetIP = objMO.InvokeMethod("SetGateways", objNewGate, Nothing) 
        objSetIP = objMO.InvokeMethod("SetDNSServerSearchOrder", objNewDNS, Nothing) 

        result = True 
        Exit For 

       Catch ex As Exception 
        Console.WriteLine("Couldn't Set IP Address!") 
        Console.Read() 
        close(FAILURE) 

       End Try 

      End If 

     End If 
    Next 



    Return result 

End Function 

'set computers host name 
Private Function setHostname(hostname As String) As Boolean 
    Dim result As Boolean = False 

    Dim path As New ManagementPath 

    path.Server = System.Net.Dns.GetHostName 
    path.NamespacePath = "root\CIMV2" 
    path.RelativePath = "Win32_Computersystem.Name='" & path.Server & "'" 

    Dim objMO As New ManagementObject(path) 
    Dim params() As Object = {hostname} 
    objMO.InvokeMethod("Rename", params) 
    result = True 

    Return result 
End Function