Go使用windows API获取用户信息

该代码示例展示了如何使用Go语言调用Windows API来获取所有用户信息,包括用户名称、用户组以及用户的登录时间等。通过`NetUserEnum`和`NetUserGetInfo`函数遍历用户并获取详细资料,同时使用`NetUserGetLocalGroups`获取用户所属的用户组信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要流程如下:
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
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值