golang获取windows系统用户列表
在Go语言中获取Windows系统用户列表,可以使用syscall和netapi32包。
以下是一个示例代码:
package main
import (
"fmt"
"syscall"
"unsafe"
)
var (
netapi32 = syscall.MustLoadDLL("netapi32.dll")
netUserEnum = netapi32.MustFindProc("NetUserEnum")
netApiBufferFree = netapi32.MustFindProc("NetApiBufferFree")
nerr = syscall.MustLoadDLL("nerr.dll")
errorNetUserEnumNerr = nerr.MustFindProc("ErrorNetUserEnumNerr")
errorNetUserEnumNoMoreItems = nerr.MustFindProc("ErrorNetUserEnumNoMoreItems")
)
const (
level = 1
filter = 0
maxPreferredLength = ^uint32(0)
nerrSuccess = 0
)
type user struct {
Name string
}
func main() {
var (
resumeHandle uintptr
bufferSize uint32 = 1024
entriesRead uint32
totalEntries uint32
usersPtr uintptr
)
for {
ret, _, _ := netUserEnum.Call(
0, // servername, 0表示本地计算机
uintptr(level),
uintptr(filter),
uintptr(unsafe.Pointer(&usersPtr)),
uintptr(bufferSize),
uintptr(unsafe.Pointer(&entriesRead)),
uintptr(unsafe.Pointer(&totalEntries)),
uintptr(unsafe.Pointer(&resumeHandle)),
)
if ret != uintptr(errorNetUserEnumNerr.Find()) &&
ret != uintptr(errorNetUserEnumNoMoreItems.Find()) {
fmt.Printf("Error: %v\n", syscall.Errno(ret))
break
}
if entriesRead == 0 {
break
}
for i := 0; i < int(entriesRead); i++ {
userPtr := uintptr(usersPtr) + uintptr(i) * unsafe.Sizeof(user{})
u := (*user)(unsafe.Pointer(userPtr))
fmt.Printf("User: %s\n", u.Name)
}
if ret == uintptr(errorNetUserEnumNoMoreItems.Find()) {
break
}
netApiBufferFree.Call(usersPtr)
}
}
该代码使用了NetUserEnum函数来获取用户列表。该函数定义在netapi32.dll中。
该函数的参数说明:
servername:指定要查询的服务器名称,0表示本地计算机。level:指定返回信息的级别,这里指定为1,表示返回用户信息的详细信息。filter:指定过滤条件,这里设为0,表示无过滤条件。bufPtr:指向指针的指针,用于接收返回的用户信息。maxPrefferedLength:指定返回信息的最大长度,这里指定为^uint32(0),表示返回所有信息。entriesRead:指向一个变量的指针,用于接收实际读取的条目数。totalEntries:指向一个变量的指针,用于接收总条目数。resumeHandle:指定从哪个位置开始读取,这里设为0,表示从第一个开始。
由于NetUserEnum函数返回的是一个数组指针,我们需要对其进行解析,将其转换成user结构体指针,然后即可读取用户信息
原文地址: https://www.cveoy.top/t/topic/fshN 著作权归作者所有。请勿转载和采集!