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. 54、Spark Streaming:DStream的transformation操作概览

    一. transformation操作概览 Transformation Meaning map 对传入的每个元素,返回一个新的元素 flatMap 对传入的每个元素,返回一个或多个元素 filter ...

  2. rabbitmq添加user及vhost

    rabbitmqctl add_vhost /myhost # 添加 vhost rabbitmqctl add_user me me123 # 设置用户和密码 rabbitmqctl set_per ...

  3. win10 自带计算器删除了怎么办

    win+S后输入Powershell,以管理员身份运行后,使用下面的命令:重要的说三遍:以管理员身份运行!以管理员身份运行!以管理员身份运行!Get-AppxPackage *calculator* ...

  4. CFD-Post批量添加截面

    有时候我们需要在一个算例中截取多个面 我们打开CFD-Post 我们编写如下的Python代码来实现在一个算例当中截取多个面 源代码如下: 上述代码完成以后,我们重新打开CFD-Post

  5. 2019 SDN第三次上机作业

    作业要求: 利用Mininet仿真平台构建给定的网络拓扑,配置主机h1和h2的IP地址(h1:10.0.0.1,h2:10.0.0.2),测试两台主机之间的网络连通性: 利用Wireshark工具,捕 ...

  6. 20189220 余超《Linux内核原理与分析》第一周作业

    实验一 Linux系统简介 通过实验一主要是学习到了Linux 的历史简介,linux与windows之间的区别,主要是免费和收费,软件和支持,安全性,使用习惯,可制定性,应用范畴等.linux具有稳 ...

  7. Sharding-JDBC 按日期时间分库分表

    简介 Sharding-JDBC 定位为轻量级Java框架,在Java的JDBC层提供的额外服务. 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完 ...

  8. elasticsearch jestclient api

    1.es search sroll 可以遍历索引下所有数据 public class TestDemo { @Test public void searchSroll() { JestClientFa ...

  9. 调用百度API接口 正解析地址和逆解析

    地址解析(结构化地址 解析得到 经纬度): public void SaveLocation(DataRequest<Location> request, DataResponse< ...

  10. IDEA查看接口的实现类

    查找接口的实现类: 快捷键 ctrl + alt +B 再按F2查看详细文档注解 查看类或接口的继承关系: ctrl + h