适用场景:企业内有UPS给网络设备供电,笔记本连接墙插市电,检测笔记本是直流电还是交流电来知道市电中断,可以结合邮箱、企业微信、飞书相关接口实现市电告警

import time
import ctypes
from ctypes import wintypes


def getACstatue():
class SYSTEM_POWER_STATUS(ctypes.Structure):
_fields_ = [
('ACLineStatus', wintypes.BYTE),
]

SYSTEM_POWER_STATUS_P = ctypes.POINTER(SYSTEM_POWER_STATUS)
GetSystemPowerStatus = ctypes.windll.kernel32.GetSystemPowerStatus
GetSystemPowerStatus.argtypeS = [SYSTEM_POWER_STATUS_P]
GetSystemPowerStatus.restype = wintypes.BOOL

status = SYSTEM_POWER_STATUS()
if not GetSystemPowerStatus(ctypes.pointer(status)):
raise ctypes.WinError()
# 0为直流电市电断开、1为交流电市电无异常
print('ACLineStatus', status.ACLineStatus)
return ('ACLineStatus', status.ACLineStatus)

getACstatue()
3 thoughts on “检查Windows计算机是AC还是DC”
  1. 可以结合prometheus exporter推送告警,代码如下

    import time
    from prometheus_client import Gauge, start_http_server
    import ctypes
    from ctypes import wintypes

    # 定义和注册指标
    random_value = Gauge(‘PowerMonitor’, ‘直流电/交流电’)

    def getACstatue():
    class SYSTEM_POWER_STATUS(ctypes.Structure):
    _fields_ = [
    (‘ACLineStatus’, wintypes.BYTE),
    ]

    SYSTEM_POWER_STATUS_P = ctypes.POINTER(SYSTEM_POWER_STATUS)
    GetSystemPowerStatus = ctypes.windll.kernel32.GetSystemPowerStatus
    GetSystemPowerStatus.argtypeS = [SYSTEM_POWER_STATUS_P]
    GetSystemPowerStatus.restype = wintypes.BOOL

    status = SYSTEM_POWER_STATUS()
    if not GetSystemPowerStatus(ctypes.pointer(status)):
    raise ctypes.WinError()
    # print(‘ACLineStatus’, status.ACLineStatus)
    # 0为直流电市电断开、1为交流电市电无异常
    random_value.set(status.ACLineStatus)
    return (‘ACLineStatus’, status.ACLineStatus)

    # 启动 HTTP 服务器,暴露 metrics 接口
    start_http_server(8000)

    while True:
    getACstatue()
    # 等待 5 秒钟,再次进行收集
    time.sleep(5)

  2. go语言检测Windows电脑是直流供电还是交流供电代码
    package main

    import (
    “fmt”
    “syscall”
    “unsafe”
    )

    var (
    modkernel32 = syscall.NewLazyDLL(“kernel32.dll”)
    procGetSystemPowerStatus = modkernel32.NewProc(“GetSystemPowerStatus”)
    )

    // SYSTEM_POWER_STATUS 结构体用于存储电源状态信息
    type SYSTEM_POWER_STATUS struct {
    ACLineStatus byte // 电源状态,1表示AC电源,255表示直流电源
    BatteryFlag byte
    BatteryLifePercent byte
    Reserved1 byte
    }

    func main() {
    var ps SYSTEM_POWER_STATUS
    r, _, err := procGetSystemPowerStatus.Call(uintptr(unsafe.Pointer(&ps)))
    if r == 0 {
    fmt.Println(“调用GetSystemPowerStatus失败:”, err)
    return
    }

    //print(ps.ACLineStatus)

    switch ps.ACLineStatus {
    case 1:
    fmt.Println(“电脑正在使用交流电(AC)”)
    case 0:
    fmt.Println(“电脑正在使用直流电(DC)”)
    default:
    fmt.Println(“电源状态未知”)
    }
    }

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注