package main

import (
"fmt"
"net"
"runtime"
"strings"
"syscall"
"time"
"unsafe" "github.com/StackExchange/wmi"
) var (
advapi = syscall.NewLazyDLL("Advapi32.dll")
kernel = syscall.NewLazyDLL("Kernel32.dll")
) func main() {
fmt.Printf("开机时长:%s\n", GetStartTime())
fmt.Printf("当前用户:%s\n", GetUserName())
fmt.Printf("当前系统:%s\n", runtime.GOOS)
fmt.Printf("系统版本:%s\n", GetSystemVersion())
fmt.Printf("%s\n", GetBiosInfo())
fmt.Printf("Motherboard:\t%s\n", GetMotherboardInfo()) fmt.Printf("CPU:\t%s\n", GetCpuInfo())
fmt.Printf("Memory:\t%s\n", GetMemory())
fmt.Printf("Disk:\t%v\n", GetDiskInfo())
fmt.Printf("Interfaces:\t%v\n", GetIntfs())
} //开机时间
func GetStartTime() string {
GetTickCount := kernel.NewProc("GetTickCount")
r, _, _ := GetTickCount.Call()
if r == 0 {
return ""
}
ms := time.Duration(r * 1000 * 1000)
return ms.String()
} //当前用户名
func GetUserName() string {
var size uint32 = 128
var buffer = make([]uint16, size)
user := syscall.StringToUTF16Ptr("USERNAME")
domain := syscall.StringToUTF16Ptr("USERDOMAIN")
r, err := syscall.GetEnvironmentVariable(user, &buffer[0], size)
if err != nil {
return ""
}
buffer[r] = '@'
old := r + 1
if old >= size {
return syscall.UTF16ToString(buffer[:r])
}
r, err = syscall.GetEnvironmentVariable(domain, &buffer[old], size-old)
return syscall.UTF16ToString(buffer[:old+r])
} //系统版本
func GetSystemVersion() string {
version, err := syscall.GetVersion()
if err != nil {
return ""
}
return fmt.Sprintf("%d.%d (%d)", byte(version), uint8(version>>8), version>>16)
} type diskusage struct {
Path string `json:"path"`
Total uint64 `json:"total"`
Free uint64 `json:"free"`
} func usage(getDiskFreeSpaceExW *syscall.LazyProc, path string) (diskusage, error) {
lpFreeBytesAvailable := int64(0)
var info = diskusage{Path: path}
diskret, _, err := getDiskFreeSpaceExW.Call(
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(info.Path))),
uintptr(unsafe.Pointer(&lpFreeBytesAvailable)),
uintptr(unsafe.Pointer(&(info.Total))),
uintptr(unsafe.Pointer(&(info.Free))))
if diskret != 0 {
err = nil
}
return info, err
} //硬盘信息
func GetDiskInfo() (infos []diskusage) {
GetLogicalDriveStringsW := kernel.NewProc("GetLogicalDriveStringsW")
GetDiskFreeSpaceExW := kernel.NewProc("GetDiskFreeSpaceExW")
lpBuffer := make([]byte, 254)
diskret, _, _ := GetLogicalDriveStringsW.Call(
uintptr(len(lpBuffer)),
uintptr(unsafe.Pointer(&lpBuffer[0])))
if diskret == 0 {
return
}
for _, v := range lpBuffer {
if v >= 65 && v <= 90 {
path := string(v) + ":"
if path == "A:" || path == "B:" {
continue
}
info, err := usage(GetDiskFreeSpaceExW, string(v)+":")
if err != nil {
continue
}
infos = append(infos, info)
}
}
return infos
} //CPU信息
//简单的获取方法fmt.Sprintf("Num:%d Arch:%s\n", runtime.NumCPU(), runtime.GOARCH)
func GetCpuInfo() string {
var size uint32 = 128
var buffer = make([]uint16, size)
var index = uint32(copy(buffer, syscall.StringToUTF16("Num:")) - 1)
nums := syscall.StringToUTF16Ptr("NUMBER_OF_PROCESSORS")
arch := syscall.StringToUTF16Ptr("PROCESSOR_ARCHITECTURE")
r, err := syscall.GetEnvironmentVariable(nums, &buffer[index], size-index)
if err != nil {
return ""
}
index += r
index += uint32(copy(buffer[index:], syscall.StringToUTF16(" Arch:")) - 1)
r, err = syscall.GetEnvironmentVariable(arch, &buffer[index], size-index)
if err != nil {
return syscall.UTF16ToString(buffer[:index])
}
index += r
return syscall.UTF16ToString(buffer[:index+r])
} type memoryStatusEx struct {
cbSize uint32
dwMemoryLoad uint32
ullTotalPhys uint64 // in bytes
ullAvailPhys uint64
ullTotalPageFile uint64
ullAvailPageFile uint64
ullTotalVirtual uint64
ullAvailVirtual uint64
ullAvailExtendedVirtual uint64
} //内存信息
func GetMemory() string {
GlobalMemoryStatusEx := kernel.NewProc("GlobalMemoryStatusEx")
var memInfo memoryStatusEx
memInfo.cbSize = uint32(unsafe.Sizeof(memInfo))
mem, _, _ := GlobalMemoryStatusEx.Call(uintptr(unsafe.Pointer(&memInfo)))
if mem == 0 {
return ""
}
return fmt.Sprint(memInfo.ullTotalPhys / (1024 * 1024))
} type intfInfo struct {
Name string
Ipv4 []string
Ipv6 []string
} //网卡信息
func GetIntfs() []intfInfo {
intf, err := net.Interfaces()
if err != nil {
return []intfInfo{}
}
var is = make([]intfInfo, len(intf))
for i, v := range intf {
ips, err := v.Addrs()
if err != nil {
continue
}
is[i].Name = v.Name
for _, ip := range ips {
if strings.Contains(ip.String(), ":") {
is[i].Ipv6 = append(is[i].Ipv6, ip.String())
} else {
is[i].Ipv4 = append(is[i].Ipv4, ip.String())
}
}
}
return is
} //主板信息
func GetMotherboardInfo() string {
var s = []struct {
Product string
}{}
err := wmi.Query("SELECT Product FROM Win32_BaseBoard WHERE (Product IS NOT NULL)", &s)
if err != nil {
return ""
}
return s[0].Product
} //BIOS信息
func GetBiosInfo() string {
var s = []struct {
Name string
}{}
err := wmi.Query("SELECT Name FROM Win32_BIOS WHERE (Name IS NOT NULL)", &s) // WHERE (BIOSVersion IS NOT NULL)
if err != nil {
return ""
}
return s[0].Name
}

  输出结果:

开机时长:27h3m55.042s

当前用户:saryli@saryli-PC

当前系统:windows

系统版本:6.1 (7601)

BIOS Date: 04/08/14 13:08:33 Ver: 04.06.05

Motherboard: Z97 GAMING 5 (MS-7917)

CPU: Num:8 Arch:AMD64

Memory: 16264

Disk: [{C: 127928365056 69651759104} {D: 858994503680 799115214848} {E: 536871956480 445582901248} {F: 249998340096 249896194048} {G: 1141402234880 896679825408} {H: 963427430400 881289777152} {J: 128033222656 118774480896}]

Interfaces: [{Local Area Connection [192.168.6.45/24 192.168.6.100/24 192.168.6.102/24] [fe80::91f7:d107:7d92:e971/64]} {VMware Network Adapter VMnet1 [192.168.46.1/24] [fe80::9c79:462d:6831:8c27/64]} {VMware Network Adapter VMnet8 [192.168.153.1/24] [fe80::8055:efa0:615c:4814/64]} {Loopback Pseudo-Interface 1 [127.0.0.1/8] [::1/128]} {isatap.{DEAC948E-CFD8-4CF7-9B40-C1AB75D37536} [] [fe80::5efe:c0a8:62d/128 fe80::5efe:c0a8:664/128 fe80::5efe:c0a8:666/128]} {isatap.localdomain [] [fe80::5efe:c0a8:2e01/128 fe80::5efe:c0a8:9901/128]}]

golang---获取windows系统相关信息的更多相关文章

  1. 获取Java系统相关信息

    package com.test; import java.util.Properties; import java.util.Map.Entry; import org.junit.Test; pu ...

  2. Python使用WMI模块获取Windows系统的硬件信息,并使用pyinstaller库编译打包成exe的可执行文件

    由于公司现阶段大多数应用软件都是基于Windows系统开发和部署,很多软件安装部署都是在windows server 2012.windows server 2008之类的服务器上,部门同事每次测试一 ...

  3. 这段百度问答,对我相关有对啊!!!----如何获取Windows系统登陆用户名

    如何获取Windows系统登陆用户名 http://zhidao.baidu.com/link?url=Hva9PkVwYZv8KSEWftSqTWe8fqM1dhoq59BurnfADmcOvFjF ...

  4. 获取系统相关信息 (CPU使用率 内存使用率 系统磁盘大小)

    引言 在软件开个过程中,对于软件的稳定性和使用率也是我们需要关注的 .  使用sigar来监控,简单方便!  使用说明:下载sigar jar及配合sigar的dll文件来用,需要将dll文件放到JD ...

  5. Linux sysinfo获取系统相关信息

    Linux中,可以用sysinfo来获取系统相关信息. #include <stdio.h> #include <stdlib.h> #include <errno.h& ...

  6. JAVA获取系统相关信息

    Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00003596 获取JRE系统相关参数 java 通过S ...

  7. [源码]一键获取windows系统登陆密码vc6版源码

    [源码]一键获取windows系统登陆密码vc6版源码支持:XP/2000/2003/WIN7/2008等 此版本编译出来的程序体积较小几十KB... 而vs版则1点几M,体积整整大了2-30倍对某些 ...

  8. 通过PowerShell获取Windows系统密码Hash

    当你拿到了系统控制权之后如何才能更长的时间内控制已经拿到这台机器呢?作为白帽子,已经在对手防线上撕开一个口子,如果你需要进一步扩大战果,你首先需要做的就是潜伏下来,收集更多的信息便于你判断,便于有更大 ...

  9. .Net中获取打印机的相关信息

    原文:.Net中获取打印机的相关信息 新项目中牵涉到对打印机的一些操作,最重要的莫过于获取打印机的状态,IP等信息,代码量不大,但是也是自己花了一点时间总结出来的,希望能帮助需要的朋友. Printe ...

随机推荐

  1. 【洛谷P5049】旅行(数据加强版)

    题目链接 m=n-1是直接按字典序dfs就行, m=n时是一棵基环树,我们发现当一个点在环上时,可以把它和它的一个在环上的儿子之间的边删掉,然后回溯,到达它的第一个有其他儿子的祖先的另一个儿子上,我们 ...

  2. Approximate Search

    题目链接:Gym-101492H 动态规划,应该是比较基础的,可是自己就是不会QAQ.... /* 把使用机会当成“花费” */ # include <iostream> # includ ...

  3. mysql 提示ssl问题

    问题信息如下: rements SSL connection must be established by default if explicit option isn't set. For comp ...

  4. OpenFOAM——高空腔内的湍流自然对流

    本算例来自<ANSYS Fluid Dynamics Verification Manual>中的VMFL052: Turbulent Natural Convection Inside ...

  5. Apache Flink - 架构和拓扑

    Flink结构: flink cli 解析本地环境配置,启动 ApplicationMaster 在 ApplicationMaster 中启动 JobManager 在 ApplicationMas ...

  6. 创建批处理文件.bat文件(删除指定文件夹下的文件及文件夹并循环)

    1.针对仅仅是删除文件夹下的文件的操作:使用del命令,单纯的删除文件操作,如下:del /f /s /q C:\Users\dell\AppData\Local\Temp\*.* 2.删除文件夹操作 ...

  7. Ubuntu18.04 Server安装Nginx+Git服务和独立的svn服务

    安装Nginx+Git 需要安装的包有 nginx, fcgiwrap, git. 其中git在Ubuntu18.04 Server安装时已经默认安装了. 需要安装的是前两个 而fcgiwrap是在 ...

  8. 已知X,Y独立,那么X^2与Y也独立

    考虑离散情况,  P{X^2=k} => P{X=sqrt(k)} 由X,Y独立可知, P{X=Sqrt(k}  | Y=y} =P{X=Sqrt(x)}, P{X^2=k | Y=y} =P{ ...

  9. nginx-rtmp

    最近使用ffmpeg推流为rtmp,进行直播.记录一下nginx-rtmp的配置.因为我们要添加ngin-rtmp模块,所以不能直接apt安装. 下载niginx和nginx-rtmp-module的 ...

  10. Android 编译 product 分区

    https://source.android.google.cn/devices/bootloader/product-partitions 编译 product 分区 Android 9​ 支持使用 ...