123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- //go:build windows
- package winapi
- import (
- "syscall"
- "golang.org/x/sys/windows"
- )
- const UserNameCharLimit = 20
- const (
- USER_PRIV_GUEST uint32 = iota
- USER_PRIV_USER
- USER_PRIV_ADMIN
- )
- const (
- UF_NORMAL_ACCOUNT = 0x00200
- UF_DONT_EXPIRE_PASSWD = 0x10000
- )
- const NERR_UserNotFound = syscall.Errno(0x8AD)
- // typedef struct _LOCALGROUP_MEMBERS_INFO_0 {
- // PSID lgrmi0_sid;
- // } LOCALGROUP_MEMBERS_INFO_0, *PLOCALGROUP_MEMBERS_INFO_0, *LPLOCALGROUP_MEMBERS_INFO_0;
- type LocalGroupMembersInfo0 struct {
- Sid *windows.SID
- }
- // typedef struct _LOCALGROUP_INFO_1 {
- // LPWSTR lgrpi1_name;
- // LPWSTR lgrpi1_comment;
- // } LOCALGROUP_INFO_1, *PLOCALGROUP_INFO_1, *LPLOCALGROUP_INFO_1;
- type LocalGroupInfo1 struct {
- Name *uint16
- Comment *uint16
- }
- // typedef struct _USER_INFO_1 {
- // LPWSTR usri1_name;
- // LPWSTR usri1_password;
- // DWORD usri1_password_age;
- // DWORD usri1_priv;
- // LPWSTR usri1_home_dir;
- // LPWSTR usri1_comment;
- // DWORD usri1_flags;
- // LPWSTR usri1_script_path;
- // } USER_INFO_1, *PUSER_INFO_1, *LPUSER_INFO_1;
- type UserInfo1 struct {
- Name *uint16
- Password *uint16
- PasswordAge uint32
- Priv uint32
- HomeDir *uint16
- Comment *uint16
- Flags uint32
- ScriptPath *uint16
- }
- // NET_API_STATUS NET_API_FUNCTION NetLocalGroupGetInfo(
- // [in] LPCWSTR servername,
- // [in] LPCWSTR groupname,
- // [in] DWORD level,
- // [out] LPBYTE *bufptr
- // );
- //
- //sys netLocalGroupGetInfo(serverName *uint16, groupName *uint16, level uint32, bufptr **byte) (status error) = netapi32.NetLocalGroupGetInfo
- // NetLocalGroupGetInfo is a slightly go friendlier wrapper around the NetLocalGroupGetInfo function. Instead of taking in *uint16's, it takes in
- // go strings and does the conversion internally.
- func NetLocalGroupGetInfo(serverName, groupName string, level uint32, bufPtr **byte) (err error) {
- var (
- serverNameUTF16 *uint16
- groupNameUTF16 *uint16
- )
- if serverName != "" {
- serverNameUTF16, err = windows.UTF16PtrFromString(serverName)
- if err != nil {
- return err
- }
- }
- if groupName != "" {
- groupNameUTF16, err = windows.UTF16PtrFromString(groupName)
- if err != nil {
- return err
- }
- }
- return netLocalGroupGetInfo(
- serverNameUTF16,
- groupNameUTF16,
- level,
- bufPtr,
- )
- }
- // NET_API_STATUS NET_API_FUNCTION NetUserAdd(
- // [in] LPCWSTR servername,
- // [in] DWORD level,
- // [in] LPBYTE buf,
- // [out] LPDWORD parm_err
- // );
- //
- //sys netUserAdd(serverName *uint16, level uint32, buf *byte, parm_err *uint32) (status error) = netapi32.NetUserAdd
- // NetUserAdd is a slightly go friendlier wrapper around the NetUserAdd function. Instead of taking in *uint16's, it takes in
- // go strings and does the conversion internally.
- func NetUserAdd(serverName string, level uint32, buf *byte, parm_err *uint32) (err error) {
- var serverNameUTF16 *uint16
- if serverName != "" {
- serverNameUTF16, err = windows.UTF16PtrFromString(serverName)
- if err != nil {
- return err
- }
- }
- return netUserAdd(
- serverNameUTF16,
- level,
- buf,
- parm_err,
- )
- }
- // NET_API_STATUS NET_API_FUNCTION NetUserDel(
- // [in] LPCWSTR servername,
- // [in] LPCWSTR username
- // );
- //
- //sys netUserDel(serverName *uint16, username *uint16) (status error) = netapi32.NetUserDel
- // NetUserDel is a slightly go friendlier wrapper around the NetUserDel function. Instead of taking in *uint16's, it takes in
- // go strings and does the conversion internally.
- func NetUserDel(serverName, userName string) (err error) {
- var (
- serverNameUTF16 *uint16
- userNameUTF16 *uint16
- )
- if serverName != "" {
- serverNameUTF16, err = windows.UTF16PtrFromString(serverName)
- if err != nil {
- return err
- }
- }
- if userName != "" {
- userNameUTF16, err = windows.UTF16PtrFromString(userName)
- if err != nil {
- return err
- }
- }
- return netUserDel(
- serverNameUTF16,
- userNameUTF16,
- )
- }
- // NET_API_STATUS NET_API_FUNCTION NetLocalGroupAddMembers(
- // [in] LPCWSTR servername,
- // [in] LPCWSTR groupname,
- // [in] DWORD level,
- // [in] LPBYTE buf,
- // [in] DWORD totalentries
- // );
- //
- //sys netLocalGroupAddMembers(serverName *uint16, groupName *uint16, level uint32, buf *byte, totalEntries uint32) (status error) = netapi32.NetLocalGroupAddMembers
- // NetLocalGroupAddMembers is a slightly go friendlier wrapper around the NetLocalGroupAddMembers function. Instead of taking in *uint16's, it takes in
- // go strings and does the conversion internally.
- func NetLocalGroupAddMembers(serverName, groupName string, level uint32, buf *byte, totalEntries uint32) (err error) {
- var (
- serverNameUTF16 *uint16
- groupNameUTF16 *uint16
- )
- if serverName != "" {
- serverNameUTF16, err = windows.UTF16PtrFromString(serverName)
- if err != nil {
- return err
- }
- }
- if groupName != "" {
- groupNameUTF16, err = windows.UTF16PtrFromString(groupName)
- if err != nil {
- return err
- }
- }
- return netLocalGroupAddMembers(
- serverNameUTF16,
- groupNameUTF16,
- level,
- buf,
- totalEntries,
- )
- }
|