602 lines
13 KiB
Go
602 lines
13 KiB
Go
/*
|
|
Copyright 2022 AmidaWare LLC.
|
|
|
|
Licensed under the Tactical RMM License Version 1.0 (the “License”).
|
|
You may only use the Licensed Software in accordance with the License.
|
|
A copy of the License is available at:
|
|
|
|
https://license.tacticalrmm.com
|
|
|
|
*/
|
|
|
|
package agent
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
"github.com/StackExchange/wmi"
|
|
rmm "github.com/amidaware/rmmagent/shared"
|
|
)
|
|
|
|
func GetWin32_USBController() ([]interface{}, error) {
|
|
var dst []rmm.Win32_USBController
|
|
ret := make([]interface{}, 0)
|
|
|
|
q := wmi.CreateQuery(&dst, "")
|
|
err := wmi.Query(q, &dst)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
|
|
for _, val := range dst {
|
|
b, err := json.Marshal(val)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
// this creates an extra unneeded array but keeping for now
|
|
// for backwards compatibility with the python agent
|
|
tmp := make([]interface{}, 0)
|
|
var un map[string]interface{}
|
|
if err := json.Unmarshal(b, &un); err != nil {
|
|
return ret, err
|
|
}
|
|
tmp = append(tmp, un)
|
|
ret = append(ret, tmp)
|
|
}
|
|
return ret, nil
|
|
}
|
|
|
|
func GetWin32_Processor() ([]interface{}, error) {
|
|
var (
|
|
dstEX []rmm.Win32_ProcessorEX
|
|
dst []rmm.Win32_Processor
|
|
errEX error
|
|
errORIG error
|
|
fallback bool = false
|
|
)
|
|
ret := make([]interface{}, 0)
|
|
q := "SELECT * FROM Win32_Processor"
|
|
|
|
errEX = wmi.Query(q, &dstEX)
|
|
if errEX != nil {
|
|
errORIG = wmi.Query(q, &dst)
|
|
if errORIG != nil {
|
|
return ret, errORIG
|
|
}
|
|
}
|
|
|
|
if errEX == nil {
|
|
for _, val := range dstEX {
|
|
b, err := json.Marshal(val)
|
|
if err != nil {
|
|
fallback = true
|
|
break
|
|
}
|
|
// this creates an extra unneeded array but keeping for now
|
|
// for backwards compatibility with the python agent
|
|
tmp := make([]interface{}, 0)
|
|
var un map[string]interface{}
|
|
if err := json.Unmarshal(b, &un); err != nil {
|
|
return ret, err
|
|
}
|
|
tmp = append(tmp, un)
|
|
ret = append(ret, tmp)
|
|
}
|
|
if !fallback {
|
|
return ret, nil
|
|
}
|
|
}
|
|
|
|
if errORIG == nil {
|
|
for _, val := range dst {
|
|
b, err := json.Marshal(val)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
tmp := make([]interface{}, 0)
|
|
var un map[string]interface{}
|
|
if err := json.Unmarshal(b, &un); err != nil {
|
|
return ret, err
|
|
}
|
|
tmp = append(tmp, un)
|
|
ret = append(ret, tmp)
|
|
}
|
|
return ret, nil
|
|
}
|
|
return ret, nil
|
|
}
|
|
|
|
func GetWin32_DesktopMonitor() ([]interface{}, error) {
|
|
var dst []rmm.Win32_DesktopMonitor
|
|
ret := make([]interface{}, 0)
|
|
|
|
q := wmi.CreateQuery(&dst, "")
|
|
err := wmi.Query(q, &dst)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
|
|
for _, val := range dst {
|
|
b, err := json.Marshal(val)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
// this creates an extra unneeded array but keeping for now
|
|
// for backwards compatibility with the python agent
|
|
tmp := make([]interface{}, 0)
|
|
var un map[string]interface{}
|
|
if err := json.Unmarshal(b, &un); err != nil {
|
|
return ret, err
|
|
}
|
|
tmp = append(tmp, un)
|
|
ret = append(ret, tmp)
|
|
|
|
}
|
|
return ret, nil
|
|
}
|
|
|
|
func GetWin32_NetworkAdapter() ([]interface{}, error) {
|
|
var dst []rmm.Win32_NetworkAdapter
|
|
ret := make([]interface{}, 0)
|
|
|
|
q := wmi.CreateQuery(&dst, "")
|
|
err := wmi.Query(q, &dst)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
|
|
for _, val := range dst {
|
|
b, err := json.Marshal(val)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
// this creates an extra unneeded array but keeping for now
|
|
// for backwards compatibility with the python agent
|
|
tmp := make([]interface{}, 0)
|
|
var un map[string]interface{}
|
|
if err := json.Unmarshal(b, &un); err != nil {
|
|
return ret, err
|
|
}
|
|
tmp = append(tmp, un)
|
|
ret = append(ret, tmp)
|
|
|
|
}
|
|
return ret, nil
|
|
}
|
|
|
|
func GetWin32_DiskDrive() ([]interface{}, error) {
|
|
var dst []rmm.Win32_DiskDrive
|
|
ret := make([]interface{}, 0)
|
|
|
|
q := wmi.CreateQuery(&dst, "")
|
|
err := wmi.Query(q, &dst)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
|
|
for _, val := range dst {
|
|
b, err := json.Marshal(val)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
// this creates an extra unneeded array but keeping for now
|
|
// for backwards compatibility with the python agent
|
|
tmp := make([]interface{}, 0)
|
|
var un map[string]interface{}
|
|
if err := json.Unmarshal(b, &un); err != nil {
|
|
return ret, err
|
|
}
|
|
tmp = append(tmp, un)
|
|
ret = append(ret, tmp)
|
|
|
|
}
|
|
return ret, nil
|
|
}
|
|
|
|
func GetWin32_ComputerSystemProduct() ([]interface{}, error) {
|
|
var dst []rmm.Win32_ComputerSystemProduct
|
|
ret := make([]interface{}, 0)
|
|
|
|
q := wmi.CreateQuery(&dst, "")
|
|
err := wmi.Query(q, &dst)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
|
|
for _, val := range dst {
|
|
b, err := json.Marshal(val)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
// this creates an extra unneeded array but keeping for now
|
|
// for backwards compatibility with the python agent
|
|
tmp := make([]interface{}, 0)
|
|
var un map[string]interface{}
|
|
if err := json.Unmarshal(b, &un); err != nil {
|
|
return ret, err
|
|
}
|
|
tmp = append(tmp, un)
|
|
ret = append(ret, tmp)
|
|
|
|
}
|
|
return ret, nil
|
|
}
|
|
|
|
func GetWin32_BIOS() ([]interface{}, error) {
|
|
var (
|
|
dstEX []rmm.Win32_BIOSEX
|
|
dst []rmm.Win32_BIOS
|
|
errEX error
|
|
errORIG error
|
|
fallback bool = false
|
|
)
|
|
ret := make([]interface{}, 0)
|
|
q := "SELECT * FROM Win32_BIOS"
|
|
|
|
errEX = wmi.Query(q, &dstEX)
|
|
if errEX != nil {
|
|
errORIG = wmi.Query(q, &dst)
|
|
if errORIG != nil {
|
|
return ret, errORIG
|
|
}
|
|
}
|
|
|
|
if errEX == nil {
|
|
for _, val := range dstEX {
|
|
b, err := json.Marshal(val)
|
|
if err != nil {
|
|
fallback = true
|
|
break
|
|
}
|
|
// this creates an extra unneeded array but keeping for now
|
|
// for backwards compatibility with the python agent
|
|
tmp := make([]interface{}, 0)
|
|
var un map[string]interface{}
|
|
if err := json.Unmarshal(b, &un); err != nil {
|
|
return ret, err
|
|
}
|
|
tmp = append(tmp, un)
|
|
ret = append(ret, tmp)
|
|
}
|
|
if !fallback {
|
|
return ret, nil
|
|
}
|
|
}
|
|
|
|
if errORIG == nil {
|
|
for _, val := range dst {
|
|
b, err := json.Marshal(val)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
tmp := make([]interface{}, 0)
|
|
var un map[string]interface{}
|
|
if err := json.Unmarshal(b, &un); err != nil {
|
|
return ret, err
|
|
}
|
|
tmp = append(tmp, un)
|
|
ret = append(ret, tmp)
|
|
}
|
|
return ret, nil
|
|
}
|
|
return ret, nil
|
|
}
|
|
|
|
func GetWin32_ComputerSystem() ([]interface{}, error) {
|
|
var (
|
|
dstEX []rmm.Win32_ComputerSystemEX
|
|
dst []rmm.Win32_ComputerSystem
|
|
errEX error
|
|
errORIG error
|
|
fallback bool = false
|
|
)
|
|
ret := make([]interface{}, 0)
|
|
q := "SELECT * FROM Win32_ComputerSystem"
|
|
|
|
errEX = wmi.Query(q, &dstEX)
|
|
if errEX != nil {
|
|
errORIG = wmi.Query(q, &dst)
|
|
if errORIG != nil {
|
|
return ret, errORIG
|
|
}
|
|
}
|
|
|
|
if errEX == nil {
|
|
for _, val := range dstEX {
|
|
b, err := json.Marshal(val)
|
|
if err != nil {
|
|
fallback = true
|
|
break
|
|
}
|
|
// this creates an extra unneeded array but keeping for now
|
|
// for backwards compatibility with the python agent
|
|
tmp := make([]interface{}, 0)
|
|
var un map[string]interface{}
|
|
if err := json.Unmarshal(b, &un); err != nil {
|
|
return ret, err
|
|
}
|
|
tmp = append(tmp, un)
|
|
ret = append(ret, tmp)
|
|
}
|
|
if !fallback {
|
|
return ret, nil
|
|
}
|
|
}
|
|
|
|
if errORIG == nil {
|
|
for _, val := range dst {
|
|
b, err := json.Marshal(val)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
tmp := make([]interface{}, 0)
|
|
var un map[string]interface{}
|
|
if err := json.Unmarshal(b, &un); err != nil {
|
|
return ret, err
|
|
}
|
|
tmp = append(tmp, un)
|
|
ret = append(ret, tmp)
|
|
}
|
|
return ret, nil
|
|
}
|
|
return ret, nil
|
|
}
|
|
|
|
func GetWin32_NetworkAdapterConfiguration() ([]interface{}, error) {
|
|
var dst []rmm.Win32_NetworkAdapterConfiguration
|
|
ret := make([]interface{}, 0)
|
|
|
|
q := wmi.CreateQuery(&dst, "")
|
|
err := wmi.Query(q, &dst)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
|
|
for _, val := range dst {
|
|
b, err := json.Marshal(val)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
// this creates an extra unneeded array but keeping for now
|
|
// for backwards compatibility with the python agent
|
|
tmp := make([]interface{}, 0)
|
|
var un map[string]interface{}
|
|
if err := json.Unmarshal(b, &un); err != nil {
|
|
return ret, err
|
|
}
|
|
tmp = append(tmp, un)
|
|
ret = append(ret, tmp)
|
|
|
|
}
|
|
return ret, nil
|
|
}
|
|
|
|
func GetWin32_PhysicalMemory() ([]interface{}, error) {
|
|
var (
|
|
dstEX []rmm.Win32_PhysicalMemoryEX
|
|
dst []rmm.Win32_PhysicalMemory
|
|
errEX error
|
|
errORIG error
|
|
fallback bool = false
|
|
)
|
|
ret := make([]interface{}, 0)
|
|
q := "SELECT * FROM Win32_PhysicalMemory"
|
|
|
|
errEX = wmi.Query(q, &dstEX)
|
|
if errEX != nil {
|
|
errORIG = wmi.Query(q, &dst)
|
|
if errORIG != nil {
|
|
return ret, errORIG
|
|
}
|
|
}
|
|
|
|
if errEX == nil {
|
|
for _, val := range dstEX {
|
|
b, err := json.Marshal(val)
|
|
if err != nil {
|
|
fallback = true
|
|
break
|
|
}
|
|
// this creates an extra unneeded array but keeping for now
|
|
// for backwards compatibility with the python agent
|
|
tmp := make([]interface{}, 0)
|
|
var un map[string]interface{}
|
|
if err := json.Unmarshal(b, &un); err != nil {
|
|
return ret, err
|
|
}
|
|
tmp = append(tmp, un)
|
|
ret = append(ret, tmp)
|
|
}
|
|
if !fallback {
|
|
return ret, nil
|
|
}
|
|
}
|
|
|
|
if errORIG == nil {
|
|
for _, val := range dst {
|
|
b, err := json.Marshal(val)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
tmp := make([]interface{}, 0)
|
|
var un map[string]interface{}
|
|
if err := json.Unmarshal(b, &un); err != nil {
|
|
return ret, err
|
|
}
|
|
tmp = append(tmp, un)
|
|
ret = append(ret, tmp)
|
|
}
|
|
return ret, nil
|
|
}
|
|
return ret, nil
|
|
}
|
|
|
|
func GetWin32_OperatingSystem() ([]interface{}, error) {
|
|
var dst []rmm.Win32_OperatingSystem
|
|
ret := make([]interface{}, 0)
|
|
|
|
q := wmi.CreateQuery(&dst, "")
|
|
err := wmi.Query(q, &dst)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
|
|
for _, val := range dst {
|
|
b, err := json.Marshal(val)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
// this creates an extra unneeded array but keeping for now
|
|
// for backwards compatibility with the python agent
|
|
tmp := make([]interface{}, 0)
|
|
var un map[string]interface{}
|
|
if err := json.Unmarshal(b, &un); err != nil {
|
|
return ret, err
|
|
}
|
|
tmp = append(tmp, un)
|
|
ret = append(ret, tmp)
|
|
}
|
|
return ret, nil
|
|
}
|
|
|
|
func GetWin32_BaseBoard() ([]interface{}, error) {
|
|
var dst []rmm.Win32_BaseBoard
|
|
ret := make([]interface{}, 0)
|
|
|
|
q := wmi.CreateQuery(&dst, "")
|
|
err := wmi.Query(q, &dst)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
|
|
for _, val := range dst {
|
|
b, err := json.Marshal(val)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
// this creates an extra unneeded array but keeping for now
|
|
// for backwards compatibility with the python agent
|
|
tmp := make([]interface{}, 0)
|
|
var un map[string]interface{}
|
|
if err := json.Unmarshal(b, &un); err != nil {
|
|
return ret, err
|
|
}
|
|
tmp = append(tmp, un)
|
|
ret = append(ret, tmp)
|
|
}
|
|
return ret, nil
|
|
}
|
|
|
|
func GetWin32_VideoController() ([]interface{}, error) {
|
|
var dst []rmm.Win32_VideoController
|
|
ret := make([]interface{}, 0)
|
|
|
|
q := wmi.CreateQuery(&dst, "")
|
|
err := wmi.Query(q, &dst)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
|
|
for _, val := range dst {
|
|
b, err := json.Marshal(val)
|
|
if err != nil {
|
|
return ret, err
|
|
}
|
|
// this creates an extra unneeded array but keeping for now
|
|
// for backwards compatibility with the python agent
|
|
tmp := make([]interface{}, 0)
|
|
var un map[string]interface{}
|
|
if err := json.Unmarshal(b, &un); err != nil {
|
|
return ret, err
|
|
}
|
|
tmp = append(tmp, un)
|
|
ret = append(ret, tmp)
|
|
}
|
|
return ret, nil
|
|
}
|
|
|
|
func (a *Agent) GetWMIInfo() map[string]interface{} {
|
|
wmiInfo := make(map[string]interface{})
|
|
|
|
compSysProd, err := GetWin32_ComputerSystemProduct()
|
|
if err != nil {
|
|
a.Logger.Debugln(err)
|
|
}
|
|
|
|
compSys, err := GetWin32_ComputerSystem()
|
|
if err != nil {
|
|
a.Logger.Debugln(err)
|
|
}
|
|
|
|
netAdaptConfig, err := GetWin32_NetworkAdapterConfiguration()
|
|
if err != nil {
|
|
a.Logger.Debugln(err)
|
|
}
|
|
|
|
physMem, err := GetWin32_PhysicalMemory()
|
|
if err != nil {
|
|
a.Logger.Debugln(err)
|
|
}
|
|
|
|
winOS, err := GetWin32_OperatingSystem()
|
|
if err != nil {
|
|
a.Logger.Debugln(err)
|
|
}
|
|
|
|
baseBoard, err := GetWin32_BaseBoard()
|
|
if err != nil {
|
|
a.Logger.Debugln(err)
|
|
}
|
|
|
|
bios, err := GetWin32_BIOS()
|
|
if err != nil {
|
|
a.Logger.Debugln(err)
|
|
}
|
|
|
|
disk, err := GetWin32_DiskDrive()
|
|
if err != nil {
|
|
a.Logger.Debugln(err)
|
|
}
|
|
|
|
netAdapt, err := GetWin32_NetworkAdapter()
|
|
if err != nil {
|
|
a.Logger.Debugln(err)
|
|
}
|
|
|
|
desktopMon, err := GetWin32_DesktopMonitor()
|
|
if err != nil {
|
|
a.Logger.Debugln(err)
|
|
}
|
|
|
|
cpu, err := GetWin32_Processor()
|
|
if err != nil {
|
|
a.Logger.Debugln(err)
|
|
}
|
|
|
|
usb, err := GetWin32_USBController()
|
|
if err != nil {
|
|
a.Logger.Debugln(err)
|
|
}
|
|
|
|
graphics, err := GetWin32_VideoController()
|
|
if err != nil {
|
|
a.Logger.Debugln(err)
|
|
}
|
|
|
|
wmiInfo["comp_sys_prod"] = compSysProd
|
|
wmiInfo["comp_sys"] = compSys
|
|
wmiInfo["network_config"] = netAdaptConfig
|
|
wmiInfo["mem"] = physMem
|
|
wmiInfo["os"] = winOS
|
|
wmiInfo["base_board"] = baseBoard
|
|
wmiInfo["bios"] = bios
|
|
wmiInfo["disk"] = disk
|
|
wmiInfo["network_adapter"] = netAdapt
|
|
wmiInfo["desktop_monitor"] = desktopMon
|
|
wmiInfo["cpu"] = cpu
|
|
wmiInfo["usb"] = usb
|
|
wmiInfo["graphics"] = graphics
|
|
|
|
return wmiInfo
|
|
}
|