Go使用windows API获取用户信息

5 篇文章 0 订阅

主要流程如下:
1、获取所有用户
2、获取相关用户信息


import (
	"syscall"
	"unsafe"

	"golang.org/x/sys/windows"
)

type USER_INFO_0 struct {
	Usri1_name *uint16
}

type LOCALGROUP_USERS_INFO_0 struct {
	lgrui0_name *uint16
}

type _USER_INFO_2 struct {
	usri2_name           *uint16
	usri2_password       *uint16
	usri2_password_age   uint32
	usri2_priv           uint32
	usri2_home_dir       *uint16
	usri2_comment        *uint16
	usri2_flags          uint32
	usri2_script_path    *uint16
	usri2_auth_flags     uint32
	usri2_full_name      *uint16
	usri2_usr_comment    *uint16
	usri2_parms          *uint16
	usri2_workstations   *uint16
	usri2_last_logon     uint32
	usri2_last_logoff    uint32
	usri2_acct_expires   uint32
	usri2_max_storage    uint32
	usri2_units_per_week uint32
	usri2_logon_hours    *uint16
	usri2_bad_pw_count   uint32
	usri2_num_logons     uint32
	usri2_logon_server   *uint16
	usri2_country_code   uint32
	usri2_code_page      uint32
}


func GetUserInfo() () {
	//调用windows的netapi32库
	netapi32 := syscall.NewLazyDLL("netapi32.dll")

	//调用库中的函数
	NetUserEnum := netapi32.NewProc("NetUserEnum")
	NetUserGetInfo := netapi32.NewProc("NetUserGetInfo")
	NetUserGetLocalGroups := netapi32.NewProc("NetUserGetLocalGroups")
	NetApiBufferFree := netapi32.NewProc("NetApiBufferFree")

	var serverName [128]byte
	var puserdata uintptr
	var dwEntriesRead, dwTotalEntries uint32
	//调用windows api,获取用户
	bret, _, _ := NetUserEnum.Call(uintptr(unsafe.Pointer(&serverName)), uintptr(0), uintptr(0x2), uintptr(unsafe.Pointer(&puserdata)),
		uintptr(128), uintptr(unsafe.Pointer(&dwEntriesRead)), uintptr(unsafe.Pointer(&dwTotalEntries)), uintptr(0))

	if int(bret) != 0 {
		return
	}

	var iter = puserdata
	//循环获取用户相关信息
	for i := uint32(0); i < dwEntriesRead; i++ {

		//var userinfo USERINFO
		var data = (*USER_INFO_0)(unsafe.Pointer(iter))

		//获取用户组信息
		var pgroupinfo uintptr
		var group_entriesread, group_totalentries uint32
		bret, _, _ = NetUserGetLocalGroups.Call(uintptr(0), uintptr(unsafe.Pointer(data.Usri1_name)), uintptr(0), uintptr(0x1),
			uintptr(unsafe.Pointer(&pgroupinfo)), uintptr(0xFFFFFFFF), uintptr(unsafe.Pointer(&group_entriesread)),
			uintptr(unsafe.Pointer(&group_totalentries)))

		//获取用户组信息失败
		if int(bret) != 0 {
			iter = uintptr(iter + unsafe.Sizeof(USER_INFO_0{}))

			continue
		}

		var ppgroupinfo_itr = pgroupinfo
		for j := uint32(0); j < group_entriesread; j++ {
			var groupinfo = (*LOCALGROUP_USERS_INFO_0)(unsafe.Pointer(ppgroupinfo_itr))
			//用户组
			//userinfo.Groupname = windows.UTF16PtrToString(groupinfo.lgrui0_name)
			ppgroupinfo_itr = uintptr(ppgroupinfo_itr + unsafe.Sizeof(LOCALGROUP_USERS_INFO_0{}))
		}
		//释放资源
		NetApiBufferFree.Call(uintptr(unsafe.Pointer(pgroupinfo)))

		//获取用户相关信息
		var puserinfo uintptr
		bret, _, _ = NetUserGetInfo.Call(uintptr(0), uintptr(unsafe.Pointer(data.Usri1_name)), uintptr(2), uintptr(unsafe.Pointer(&puserinfo)))

		//获取用户信息失败
		if int(bret) != 0 {
			iter = uintptr(iter + unsafe.Sizeof(USER_INFO_0{}))

			continue
		}

		var userdata = (*_USER_INFO_2)(unsafe.Pointer(puserinfo))

		//最后登陆时间
		//userinfo.Lastlogin_time = userdata.usri2_last_logon
		//用户权限 0-来宾 1-普通用户 2-管理员.
		userinfo.Rootlv = userdata.usri2_priv
		switch userinfo.Rootlv {
		case 0:
			userinfo.Usertype = "GUEST"
		// case 1:
		// 	userinfo.usertype = "USER"
		case 2:
			userinfo.Usertype = "ADMIN"
		default:
			userinfo.Usertype = "USER"
		}

		//用户名
		if userdata.usri2_name != nil {
			//userinfo.Name = windows.UTF16PtrToString(userdata.usri2_name)
		}

		//释放资源
		NetApiBufferFree.Call(uintptr(unsafe.Pointer(puserinfo)))

		iter = uintptr(iter + unsafe.Sizeof(USER_INFO_0{}))

	}

	//释放资源
	NetApiBufferFree.Call(uintptr(unsafe.Pointer(puserdata)))

	return
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 是的,Golang 可以不依赖 WIM 获取系统硬件信息,包括 BIOS 和 CPU 信息Golang 提供了对系统底层的访问能力,可以通过调用操作系统的 API获取硬件信息。例如,可以通过调用 Windows API获取 Windows 系统的硬件信息,也可以通过调用 Unix 系统的 ioctl 等函数来获取 Unix 系统的硬件信息。 ### 回答2: 是的,使用Golang编程语言可以获取系统硬件信息,而且不需要依赖Windows管理信息(WMI)。Golang提供了一些能够直接访问操作系统和硬件信息的标准库和第三方库。 要获取BIOS信息,可以使用Golang的"os"包和"syscall"包。使用这些包,可以调用操作系统的接口来获取BIOS相关信息,例如使用"syscall.Sysctl"函数获取系统的硬件和操作系统信息。 要获取CPU信息,可以使用Golang的"runtime"包。在这个包中,有一些函数可以获取CPU的数量和其他相关信息。例如,可以使用"runtime.NumCPU"函数获取系统中的CPU数量,使用"runtime.GOARCH"变量获取CPU架构信息。 除了使用这些标准库之外,还有一些第三方库在Golang社区中提供了更多的硬件信息获取功能,例如"gopsutil"和"hwinfo"等库。这些库使用操作系统提供的接口来获取各种硬件信息,包括CPU信息、内存信息、磁盘信息等。 总之,使用Golang编程语言可以轻松地获取系统硬件信息,包括BIOS和CPU信息,而无需依赖Windows管理信息(WMI)。 ### 回答3: 可以使用Golang的一些第三方库来获取系统硬件信息,而不依赖于WMI(Windows Management Instrumentation)。以下是一些Golang库可以实现获取系统硬件信息的功能: 1. sysinfo库:sysinfo库提供了一系列函数来检索系统的硬件信息,包括CPU、内存、磁盘和网络信息等。你可以使用sysinfo库的函数来获取系统的BIOS和CPU信息。 2. gohardware库:gohardware库是一个轻量级的库,用于获取系统硬件信息,包括CPU、内存、磁盘、网络和GPU等。通过调用gohardware库的函数,你可以获取系统的BIOS和CPU信息。 通过使用上述的库,你可以在Golang中编写代码来获取系统的硬件信息,而不需要依赖于WMI。这些库提供了一些函数或方法,可以直接在Golang程序中调用来获取所需的硬件信息。需要注意的是,不同的操作系统可能需要使用不同的库或方法来获取硬件信息。因此,在使用这些库之前,请确保你选择了适用于目标操作系统的库版本或适当的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值