microsoft / microsoft/wmi

[Bug?] serverName cannot be an IPv4 address

Open
#157 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Go
Stars
58
Forks
23
PR merge metrics
No merged PRs in 30d

Description

Hi there,

I happened to notice that the wmiSession's Connect() method does not seem to work when we specify as a ServerName an IPv4 address.

Indeed the following snippet:

package cim

import (
	"fmt"
	"log"
	"testing"

	"github.com/stretchr/testify/assert"
)

func Test_ConnectionIpV4(t *testing.T) {
	sm := NewWmiSessionManager()
	defer sm.Close()
	defer sm.Dispose()
	session, err := sm.GetSession("root\\cimv2", "127.0.0.1", "", "", "")
	if err != nil {
		log.Printf("Could not get session %v", err)
		return
	}

	_, err = session.Connect()
	assert.Nil(t, err, fmt.Sprintf("Err should be nil %v", err))

	if err != nil {
		log.Printf("Could not connect session %v", err)
		return
	}
	defer session.Close()
	defer session.Dispose()
}

Fails with the following error:

=== RUN   Test_ClassDoesNotExist
    c:\Users\mirko.bez\github\herrBez\wmi\pkg\wmiinstance\WmiSession_test.go:22:
                Error Trace:    WmiSession_test.go:22
                Error:          Expected nil, but got: &ole.OleError{hr:0x80020009, description:"The RPC server is unavailable. ", subError:ole.EXCEPINFO{wCode:0x0, wReserved:0x0, bstrSource:(*uint16)(nil), bstrDescription:(*uint16)(nil), bstrHelpFile:(*uint16)(nil), dwHelpContext:0x0, pvReserved:0x0, pfnDeferredFillIn:0x0, scode:0x800706ba, rendered:true, source:"SWbemLocator", description:"The RPC server is unavailable. ", helpFile:"<nil>"}}
                Test:           Test_ClassDoesNotExist
                Messages:       Err should be nil Exception occurred. (The RPC server is unavailable. )
2025/02/10 11:01:47 Could not connect session Exception occurred. (The RPC server is unavailable. )
--- FAIL: Test_ClassDoesNotExist (0.07s)
FAIL
FAIL    github.com/microsoft/wmi/pkg/wmiinstance        0.093s

This seems caused by the following line https://github.com/microsoft/wmi/blob/0671b0c1c57be7e248afdb57cecc3d12b8c96af9/pkg/wmiinstance/WmiSession.go#L83. In particular by the strings.Join([]string{c.ServerName, c.Domain}, ".").
Indeed, no matter if domain is the empty string or not, the method adds as a suffix a dot. While this work fine for hostnames (e.g., localhost. does work), it seems that with IPv4 addresses this is causing the error 0x800706ba https://support.microsoft.com/en-us/topic/fix-error-code-0x800706ba-may-be-generated-when-a-client-computer-makes-a-request-to-a-remote-com-object-f84b2895-4e72-653d-200e-6216c91ce4bb, clearly indicating that we are not reaching the intended server.

I confirmed that this is the case by using the WMI Explorer (127.0.0.1 works fine while 127.0.0.1. returns an error):

Image

Workaround

As a workaround to make use of IPv4 addresses, we can specify the domain as the last octet of the ipv4 address.

func Test_ConnectionIpV4(t *testing.T) {
	sm := NewWmiSessionManager()
	defer sm.Close()
	defer sm.Dispose()
	session, err := sm.GetSession("root\\cimv2", "127.0.0", "1", "", "")
	if err != nil {
		log.Printf("Could not get session %v", err)
		return
	}

	_, err = session.Connect()
	assert.Nil(t, err, fmt.Sprintf("Err should be nil %v", err))

	if err != nil {
		log.Printf("Could not connect session %v", err)
		return
	}
	defer session.Close()
	defer session.Dispose()
}

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start at pkg/wmiinstance/WmiSession.go line 83, where ServerName and Domain are joined, and review the Test_ConnectionIpV4 example in the issue. Reproduce the connection with 127.0.0.1 and verify that IPv4 ServerName values connect successfully while hostname behavior remains intact.

Written by the indexing model from the issue text.

Assessment

Tech stack
go
Domain
operating-systems
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.