func NewWindowsCollector()

in internal/guestcollector/guestcollector_win.go [62:179]


func NewWindowsCollector(host, username, password any, usageMetricLogger agentstatus.AgentStatus) *WindowsCollector {
	c := WindowsCollector{
		host:                     host,
		username:                 username,
		password:                 password,
		guestRuleWMIMap:          map[string]wmiExecutor{},
		logicalToPhysicalDiskMap: map[string]string{},
		physicalDiskToTypeMap:    map[string]string{},
		usageMetricLogger:        usageMetricLogger,
	}
	c.guestRuleWMIMap[internal.PowerProfileSettingRule] = wmiExecutor{
		namespace: `root\cimv2\power`,
		query:     `SELECT elementname FROM win32_powerplan WHERE isactive = true`,
		isRule:    true,
		runWMIQuery: func(connArgs wmiConnectionArgs) (string, error) {
			var result []struct {
				ElementName string
			}
			// https://learn.microsoft.com/en-us/windows/win32/wmisdk/swbemlocator-connectserver
			if err := wmi.Query(connArgs.query, &result, connArgs.host, connArgs.namespace, connArgs.username, connArgs.password); err != nil {
				return "", err
			}
			return result[0].ElementName, nil
		},
	}
	c.guestRuleWMIMap[internal.LogicalDiskToPartition] = wmiExecutor{
		namespace: `root\cimv2`,
		query:     `SELECT antecedent, dependent FROM win32_logicaldisktopartition`,
		runWMIQuery: func(connArgs wmiConnectionArgs) (string, error) {
			var result []struct {
				Antecedent string
				Dependent  string
			}
			if err := wmi.Query(connArgs.query, &result, connArgs.host, connArgs.namespace, connArgs.username, connArgs.password); err != nil {
				return "", err
			}
			// example output:
			// Antecedent: \\[HOSTNAME]\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #1"
			// Dependent: \\[HOSTNAME]\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
			for _, v := range result {
				if re := regexp.MustCompile(`\.*\\root\\cimv2:Win32_DiskPartition\.DeviceID=\"Disk #(.*), Partition #.*\"`); re.MatchString(v.Antecedent) {
					disk := re.FindStringSubmatch(v.Antecedent)[1]
					if re = regexp.MustCompile(`\.*\\root\\cimv2:Win32_LogicalDisk\.DeviceID=\"(.*)\"`); re.MatchString(v.Dependent) {
						logicalDisk := re.FindStringSubmatch(v.Dependent)[1]
						c.logicalToPhysicalDiskMap[logicalDisk] = disk
					}
				}
			}
			return "", nil
		},
	}
	c.guestRuleWMIMap[internal.PhysicalDiskToType] = wmiExecutor{
		namespace: `root\microsoft\windows\storage`,
		query:     `SELECT deviceid, friendlyname, size, mediatype FROM msft_physicaldisk`,
		runWMIQuery: func(connArgs wmiConnectionArgs) (string, error) {
			var result []struct {
				DeviceID     string
				FriendlyName string
				Size         int64
				MediaType    int16
			}
			if err := wmi.Query(connArgs.query, &result, connArgs.host, connArgs.namespace, connArgs.username, connArgs.password); err != nil {
				return "", err
			}
			for _, v := range result {
				c.physicalDiskToTypeMap[v.DeviceID] = FriendlyNameToDiskType(v.FriendlyName, v.Size, v.MediaType)
			}
			return "", nil
		},
	}
	c.guestRuleWMIMap[internal.DataDiskAllocationUnitsRule] = wmiExecutor{
		namespace: `root\cimv2`,
		isRule:    true,
		query:     `SELECT caption, blocksize FROM win32_volume`,
		runWMIQuery: func(connArgs wmiConnectionArgs) (string, error) {
			var result []struct {
				BlockSize int64
				Caption   string
			}
			if err := wmi.Query(connArgs.query, &result, connArgs.host, connArgs.namespace, connArgs.username, connArgs.password); err != nil {
				return "", err
			}
			re := regexp.MustCompile(`.*Volume{.*}.*`)
			var r []struct {
				BlockSize int64
				Caption   string
			}
			for _, v := range result {
				if !re.MatchString(v.Caption) {
					r = append(r, v)
				}
			}
			res, err := json.Marshal(r)
			if err != nil {
				return "", err
			}
			return string(res), nil
		},
	}
	c.guestRuleWMIMap[internal.GCBDRAgentRunning] = wmiExecutor{
		namespace: `root\cimv2`,
		isRule:    true,
		query:     `SELECT caption FROM Win32_Process WHERE Name="udsagent.exe"`,
		runWMIQuery: func(connArgs wmiConnectionArgs) (string, error) {
			var result []struct {
				Caption string
			}
			if err := wmi.Query(connArgs.query, &result, connArgs.host, connArgs.namespace, connArgs.username, connArgs.password); err != nil {
				return "", err
			}
			if len(result) == 0 {
				return "false", nil
			}
			return "true", nil
		},
	}
	return &c
}