Files
windows_exporter/headers/netapi32/netapi32.go
retryW 048bff919e Converted most metrics to non-wmi
Signed-off-by: Ben Ridley <benridley29@gmail.com>
2021-03-18 16:18:47 -07:00

90 lines
2.8 KiB
Go

package netapi32
import (
"errors"
"unsafe"
"golang.org/x/sys/windows"
)
// WKSTAInfo102 is a wrapper of WKSTA_Info_102
//https://docs.microsoft.com/en-us/windows/win32/api/lmwksta/ns-lmwksta-wksta_info_102
type WKSTAInfo102 struct {
Wki102_platform_id uint32
wki102_computername *uint16
wki102_langroup *uint16
Wki102_ver_major uint32
Wki102_ver_minor uint32
wki102_lanroot *uint16
Wki102_logged_on_users uint32
}
var (
netapi32 = windows.NewLazySystemDLL("netapi32")
procNetWkstaGetInfo = netapi32.NewProc("NetWkstaGetInfo")
procNetApiBufferFree = netapi32.NewProc("NetApiBufferFree")
)
// NetApiStatus is a map of Network Management Error Codes.
// https://docs.microsoft.com/en-gb/windows/win32/netmgmt/network-management-error-codes?redirectedfrom=MSDN
var NetApiStatus = map[uint32]string{
// Success
0: "NERR_Success",
// This computer name is invalid.
2351: "NERR_InvalidComputer",
// This operation is only allowed on the primary domain controller of the domain.
2226: "NERR_NotPrimary",
/// This operation is not allowed on this special group.
2234: "NERR_SpeGroupOp",
/// This operation is not allowed on the last administrative account.
2452: "NERR_LastAdmin",
/// The password parameter is invalid.
2203: "NERR_BadPassword",
/// The password does not meet the password policy requirements.
/// Check the minimum password length, password complexity and password history requirements.
2245: "NERR_PasswordTooShort",
/// The user name could not be found.
2221: "NERR_UserNotFound",
// Errors
5: "ERROR_ACCESS_DENIED",
8: "ERROR_NOT_ENOUGH_MEMORY",
87: "ERROR_INVALID_PARAMETER",
123: "ERROR_INVALID_NAME",
124: "ERROR_INVALID_LEVEL",
234: "ERROR_MORE_DATA",
1219: "ERROR_SESSION_CREDENTIAL_CONFLICT",
}
// NetApiBufferFree frees the memory other network management functions use internally to return information.
// https://docs.microsoft.com/en-us/windows/win32/api/lmapibuf/nf-lmapibuf-netapibufferfree
func NetApiBufferFree(buffer *WKSTAInfo102) {
procNetApiBufferFree.Call(uintptr(unsafe.Pointer(buffer)))
}
// NetWkstaGetInfo returns information about the configuration of a workstation.
// https://docs.microsoft.com/en-us/windows/win32/api/lmwksta/nf-lmwksta-netwkstagetinfo
func NetWkstaGetInfo() (WKSTAInfo102, uint32, error) {
// Struct
var lpwi *WKSTAInfo102
pLpwi := uintptr(unsafe.Pointer(&lpwi))
// Null value
var nullptr = uintptr(0)
// Level
pLevel := uintptr(102)
// Func call
r1, _, _ := procNetWkstaGetInfo.Call(nullptr, pLevel, pLpwi)
if ret := *(*uint32)(unsafe.Pointer(&r1)); ret != 0 {
return WKSTAInfo102{}, ret, errors.New(NetApiStatus[ret])
}
// Derence the pointer and return the object so we can safely clear the buffer.
var deref WKSTAInfo102 = *lpwi
defer NetApiBufferFree(lpwi)
return deref, 0, nil
}