user.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. //go:build windows
  2. package winapi
  3. import (
  4. "syscall"
  5. "golang.org/x/sys/windows"
  6. )
  7. const UserNameCharLimit = 20
  8. const (
  9. USER_PRIV_GUEST uint32 = iota
  10. USER_PRIV_USER
  11. USER_PRIV_ADMIN
  12. )
  13. const (
  14. UF_NORMAL_ACCOUNT = 0x00200
  15. UF_DONT_EXPIRE_PASSWD = 0x10000
  16. )
  17. const NERR_UserNotFound = syscall.Errno(0x8AD)
  18. // typedef struct _LOCALGROUP_MEMBERS_INFO_0 {
  19. // PSID lgrmi0_sid;
  20. // } LOCALGROUP_MEMBERS_INFO_0, *PLOCALGROUP_MEMBERS_INFO_0, *LPLOCALGROUP_MEMBERS_INFO_0;
  21. type LocalGroupMembersInfo0 struct {
  22. Sid *windows.SID
  23. }
  24. // typedef struct _LOCALGROUP_INFO_1 {
  25. // LPWSTR lgrpi1_name;
  26. // LPWSTR lgrpi1_comment;
  27. // } LOCALGROUP_INFO_1, *PLOCALGROUP_INFO_1, *LPLOCALGROUP_INFO_1;
  28. type LocalGroupInfo1 struct {
  29. Name *uint16
  30. Comment *uint16
  31. }
  32. // typedef struct _USER_INFO_1 {
  33. // LPWSTR usri1_name;
  34. // LPWSTR usri1_password;
  35. // DWORD usri1_password_age;
  36. // DWORD usri1_priv;
  37. // LPWSTR usri1_home_dir;
  38. // LPWSTR usri1_comment;
  39. // DWORD usri1_flags;
  40. // LPWSTR usri1_script_path;
  41. // } USER_INFO_1, *PUSER_INFO_1, *LPUSER_INFO_1;
  42. type UserInfo1 struct {
  43. Name *uint16
  44. Password *uint16
  45. PasswordAge uint32
  46. Priv uint32
  47. HomeDir *uint16
  48. Comment *uint16
  49. Flags uint32
  50. ScriptPath *uint16
  51. }
  52. // NET_API_STATUS NET_API_FUNCTION NetLocalGroupGetInfo(
  53. // [in] LPCWSTR servername,
  54. // [in] LPCWSTR groupname,
  55. // [in] DWORD level,
  56. // [out] LPBYTE *bufptr
  57. // );
  58. //
  59. //sys netLocalGroupGetInfo(serverName *uint16, groupName *uint16, level uint32, bufptr **byte) (status error) = netapi32.NetLocalGroupGetInfo
  60. // NetLocalGroupGetInfo is a slightly go friendlier wrapper around the NetLocalGroupGetInfo function. Instead of taking in *uint16's, it takes in
  61. // go strings and does the conversion internally.
  62. func NetLocalGroupGetInfo(serverName, groupName string, level uint32, bufPtr **byte) (err error) {
  63. var (
  64. serverNameUTF16 *uint16
  65. groupNameUTF16 *uint16
  66. )
  67. if serverName != "" {
  68. serverNameUTF16, err = windows.UTF16PtrFromString(serverName)
  69. if err != nil {
  70. return err
  71. }
  72. }
  73. if groupName != "" {
  74. groupNameUTF16, err = windows.UTF16PtrFromString(groupName)
  75. if err != nil {
  76. return err
  77. }
  78. }
  79. return netLocalGroupGetInfo(
  80. serverNameUTF16,
  81. groupNameUTF16,
  82. level,
  83. bufPtr,
  84. )
  85. }
  86. // NET_API_STATUS NET_API_FUNCTION NetUserAdd(
  87. // [in] LPCWSTR servername,
  88. // [in] DWORD level,
  89. // [in] LPBYTE buf,
  90. // [out] LPDWORD parm_err
  91. // );
  92. //
  93. //sys netUserAdd(serverName *uint16, level uint32, buf *byte, parm_err *uint32) (status error) = netapi32.NetUserAdd
  94. // NetUserAdd is a slightly go friendlier wrapper around the NetUserAdd function. Instead of taking in *uint16's, it takes in
  95. // go strings and does the conversion internally.
  96. func NetUserAdd(serverName string, level uint32, buf *byte, parm_err *uint32) (err error) {
  97. var serverNameUTF16 *uint16
  98. if serverName != "" {
  99. serverNameUTF16, err = windows.UTF16PtrFromString(serverName)
  100. if err != nil {
  101. return err
  102. }
  103. }
  104. return netUserAdd(
  105. serverNameUTF16,
  106. level,
  107. buf,
  108. parm_err,
  109. )
  110. }
  111. // NET_API_STATUS NET_API_FUNCTION NetUserDel(
  112. // [in] LPCWSTR servername,
  113. // [in] LPCWSTR username
  114. // );
  115. //
  116. //sys netUserDel(serverName *uint16, username *uint16) (status error) = netapi32.NetUserDel
  117. // NetUserDel is a slightly go friendlier wrapper around the NetUserDel function. Instead of taking in *uint16's, it takes in
  118. // go strings and does the conversion internally.
  119. func NetUserDel(serverName, userName string) (err error) {
  120. var (
  121. serverNameUTF16 *uint16
  122. userNameUTF16 *uint16
  123. )
  124. if serverName != "" {
  125. serverNameUTF16, err = windows.UTF16PtrFromString(serverName)
  126. if err != nil {
  127. return err
  128. }
  129. }
  130. if userName != "" {
  131. userNameUTF16, err = windows.UTF16PtrFromString(userName)
  132. if err != nil {
  133. return err
  134. }
  135. }
  136. return netUserDel(
  137. serverNameUTF16,
  138. userNameUTF16,
  139. )
  140. }
  141. // NET_API_STATUS NET_API_FUNCTION NetLocalGroupAddMembers(
  142. // [in] LPCWSTR servername,
  143. // [in] LPCWSTR groupname,
  144. // [in] DWORD level,
  145. // [in] LPBYTE buf,
  146. // [in] DWORD totalentries
  147. // );
  148. //
  149. //sys netLocalGroupAddMembers(serverName *uint16, groupName *uint16, level uint32, buf *byte, totalEntries uint32) (status error) = netapi32.NetLocalGroupAddMembers
  150. // NetLocalGroupAddMembers is a slightly go friendlier wrapper around the NetLocalGroupAddMembers function. Instead of taking in *uint16's, it takes in
  151. // go strings and does the conversion internally.
  152. func NetLocalGroupAddMembers(serverName, groupName string, level uint32, buf *byte, totalEntries uint32) (err error) {
  153. var (
  154. serverNameUTF16 *uint16
  155. groupNameUTF16 *uint16
  156. )
  157. if serverName != "" {
  158. serverNameUTF16, err = windows.UTF16PtrFromString(serverName)
  159. if err != nil {
  160. return err
  161. }
  162. }
  163. if groupName != "" {
  164. groupNameUTF16, err = windows.UTF16PtrFromString(groupName)
  165. if err != nil {
  166. return err
  167. }
  168. }
  169. return netLocalGroupAddMembers(
  170. serverNameUTF16,
  171. groupNameUTF16,
  172. level,
  173. buf,
  174. totalEntries,
  175. )
  176. }