【问题标题】:Use WMI to retrieve IPv4 address from computer running IPv6使用 WMI 从运行 IPv6 的计算机中检索 IPv4 地址
【发布时间】:2013-10-16 23:27:18
【问题描述】:

我正在使用 VBScript 通过 Win32_PingStatus 检索远程计算机的地址,如下所示:

dnsServer = "myComputerName"
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
colIpQuery = "Select * from Win32_PingStatus where Address='" + dnsServer + "' AND ResolveAddressNames=TRUE"
Set colIPAddrs = objWMIService.ExecQuery(colIpQuery)
For Each colIPAddr In colIPAddrs
    If CStr(colIpAddr.StatusCode) = 0 Then
        dnsServerIp = colIpAddr.ProtocolAddress
    End If
Next

这里的问题是,如果“myComputerName”正在运行 IPv6,colIpAddr.ProtocolAddress 将始终只返回 IPv6 地址,但我需要 IPv4 地址。我无法禁用 IPv6、跳过 IPv6 地址等。有没有其他方法可以在不使用外部方法(ping、powershell 等)的情况下检索 IPv4 地址?

【问题讨论】:

  • VBScript 在没有外部工具的情况下无法做到这一点。我建议切换到 PowerShell。
  • 那很不幸 :( 感谢您确认我认为可能的情况。

标签: vba vbscript wmi


【解决方案1】:
' RETURN IPv4 ONLY
' ################################################
    Function getIPAddress(passedInt)
            On Error Resume Next
            Dim hostIPAddress, SQLQuery, strComputer, objWMIService, colItems
            SQLQuery = "SELECT * FROM Win32_NetworkAdapterConfiguration WHERE     MACAddress > '' AND IPEnabled = 'True'"
            strComputer = "."
            Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
            Set colItems = objWMIService.ExecQuery(SQLQuery)
        For Each objItem In colItems
            If IsArray( objItem.IPAddress ) Then
                If UBound( objItem.IPAddress ) = 0 Then
                    hostIPAddress = objItem.IPAddress(0)
                Else
                    hostIPAddress = "" & Join( objItem.IPAddress, "," )
                End If
            End If
        Next
        temp = split(hostIPAddress, ",")
        getIPAddress = temp(passedInt) ' temp(0) returns IPv4 Only, temp(1) retunrs IPv6 Only
    End function

我看了多个论坛,似乎没有人提到以上内容

从 "Win32_NetworkAdapterConfiguration" 返回 "obj.IPAddress" 用逗号分隔值,因此您可以使用 Split(stringToSplit, ",") 函数和数组中的引用索引 0 来返回 IPv4

'usage:
Dim temp, temp2
temp = getIPAddress(0)    ' temp = IPv4 address
temp2 = getIPAddress(1)   ' temp2 = IPv6 address

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多