func printWmiObjects()

in cli_tools/diagnostics/wmi_windows.go [47:111]


func printWmiObjects(class string, namespace string) (string, error) {
	ole.CoInitialize(0)
	defer ole.CoUninitialize()

	unknown, err := oleutil.CreateObject("WbemScripting.SWbemLocator")
	if err != nil {
		return "", err
	}
	defer unknown.Release()

	wmi, err := unknown.QueryInterface(ole.IID_IDispatch)
	if err != nil {
		return "", err
	}
	defer wmi.Release()

	if namespace == "" {
		namespace = `root\default`
	}
	serviceRaw, err := oleutil.CallMethod(wmi, "ConnectServer", nil, namespace)
	if err != nil {
		return "", err
	}
	service := serviceRaw.ToIDispatch()
	defer service.Release()

	query := fmt.Sprintf("SELECT * FROM %s", class)
	resultRaw, err := oleutil.CallMethod(service, "ExecQuery", query)
	if err != nil {
		return "", err
	}
	items := resultRaw.ToIDispatch()
	defer items.Release()

	// Format the items into a readable list
	var bfr bytes.Buffer
	var properties []string
	err = oleutil.ForEach(items, func(itemRaw *ole.VARIANT) error {
		item := itemRaw.ToIDispatch()
		defer item.Release()

		// Read a list of the class's properties from the first item
		if properties == nil {
			properties, err = getItemProperties(item)
			if err != nil {
				return err
			}
		}

		bfr.WriteString("\r\n\r\n")
		for _, property := range properties {
			itemProp, err := oleutil.GetProperty(item, property)
			if err != nil {
				return err
			}
			p := itemProp.Value()
			if p == nil {
				p = ""
			}
			bfr.WriteString(fmt.Sprintf("%s: %v\r\n", property, p))
		}
		return nil
	})
	return bfr.String(), err
}