Private Declare Function NetUserAdd _ Lib "Netapi32" (ByVal Servername As String, _ ByVal Level As Long, Buffer As Any, ParamErr As _ Long) As Long Private Declare Function NetUserEnum _ Lib "Netapi32" (ByVal Servername As String, _ ByVal Level As Long, ByVal Filter As Long, _ Buffer As Long, ByVal BufferLen As Long, _ EntriesRead As Long, TotalEntries As Long, _ ResumeHandle As Long) As Long Private Declare Function NetUserGetInfo _ Lib "Netapi32" (ByVal Servername As String, _ ByVal Username As String, ByVal Level As Long, _ Buffer As Long) As Long Private Declare Function NetUserSetInfo _ Lib "Netapi32" (ByVal Servername As String, _ ByVal Username As String, ByVal Level As Long, _ Buffer As Any, ParamErr As Long) As Long Private Declare Function NetUserGetGroups _ Lib "Netapi32" (ByVal Servername As String, _ ByVal Username As String, ByVal Level As Long, _ Buffer As Long, ByVal BufferLen As Long, _ EntriesRead As Long, TotalEntries As Long) As Long Private Declare Function NetUserDel _ Lib "Netapi32" (ByVal Servername As String, _ ByVal Username As String) As Long Private Declare Function NetApiBufferFree _ Lib "Netapi32" (ByVal Buffer As Long) As Long Private Declare Sub CopyMemory Lib "Kernel32" _ Alias "RtlMoveMemory" (lpSource As Any, _ lpDestination As Any, ByVal cbSize As Long) Private Declare Function StrLen Lib "Kernel32" _ Alias "lstrlenW" (ByVal lpString As Long) As LongPrivate Type UserInfo_1 Username As String Password As String PasswordAge As Long Privilege As Long HomeDir As String Comment As String Flags As Long ScriptPath As String End Type Private Type UserInfo_1011 Fullname As String End Type Private Type lpUserInfo_10 Username As Long Comment As Long UserComment As Long Fullname As Long End Type Private Type lpGroupUsersInfo_0 Groupname As Long End Type ' Guest privilege Public Const User_Priv_Guest = &H0 ' User privilege Public Const User_Priv_User = &H1 ' Administrator privilege Public Const User_Priv_Admin = &H2
' The logon script executed. Required fo ' r Lan Manager 2.0 and Windows NT. Public Const User_Flags_Script = &H1 ' The account is disabled. Public Const User_Flags_AccountDisable = &H2 ' The home directory is required. Ignore ' d in Windows NT. Public Const User_Flags_HomedirRequired = &H8 ' The user's account is currently locked ' out. Public Const User_Flags_Lockout = &H10 ' No password is required. Public Const User_Flags_PasswordNotRequired = &H20 ' User cannot change password. Public Const User_Flags_PasswordCantChange = &H40 ' Password never expire. Public Const User_Flags_PasswordNeverExpire = &H10000 ' Account for users whose primary accoun ' t is in other domain. "Local User Accoun ' t" in User Manager. Public Const User_Flags_TempDuplicateAccount = &H100 ' Typical user. Public Const User_Flags_NormalAccount = &H200 ' Permit to trust account for a Windows ' NT domain that trusts other domains. Public Const User_Flags_InterdomainTrustAccount = &H800 ' Computer account for an Windows NT Wor ' kstation or Server that is a member of t ' his domain. Public Const User_Flags_WorkstationTrustAccount = &H1000 ' Computer account for a Windows NT Back ' up Domain Controller that is a member of ' this domain. Public Const User_Flags_ServerTrustAccount = &H2000 Public Const User_Filter_TempDuplicateAccount = &H1 Public Const User_Filter_NormalAccount = &H2 Public Const User_Filter_InterdomainTrustAccount = &H8 Public Const User_Filter_WorkstationTrustAccount = &H10 Public Const User_Filter_ServerTrustAccount = &H20 ' Input Private Usr1 As UserInfo_1 Private Usr1011 As UserInfo_1011 ' Output Private lpUsr10 As lpUserInfo_10 Private lpGrpUsr0 As lpGroupUsersInfo_0 Private Lvi As ListItem ' Add a workstation to a domain: ' Servername: Your Domain Controller ' Username: New computer ' Flags: User_Flags_Script Or ' User_Flags_WorkstationTrustAccount
Function UserAdd(ByVal Servername As String, _ ByVal Username As String, ByVal Password As _ String, ByVal Comment As String, ByVal Flags As _ Long) As String Servername = StrConv(Servername, vbUnicode) Usr1.Username = StrConv(Username, vbUnicode) Usr1.Password = StrConv(Password, vbUnicode) Usr1.Privilege = User_Priv_User Usr1.Comment = StrConv(Comment, vbUnicode) Usr1.Flags = Flags UserAdd = NetUserAdd(Servername, 1, Usr1, 0) End Function Function UserEnum(ByVal Servername As String, _ ByVal Filter As Long, ByVal Lv As ListView, _ Optional NumItems As Long) As Long Dim Buffer As Long, BufferLen As Long, _ EntriesRead As Long, TotalEntries As Long, _ ResumeHandle As Long Servername = StrConv(Servername, vbUnicode) BufferLen = -1: ResumeHandle = 0 rc = NetUserEnum(Servername, 10, Filter, _ Buffer, BufferLen, EntriesRead, TotalEntries, _ ResumeHandle) If rc = 0 And EntriesRead <> 0 Then For i = 0 To EntriesRead - 1 CopyMemory lpUsr10, ByVal Buffer, Len(lpUsr10) Set Lvi = Lv.ListItems.Add Text:=PointerToString(lpUsr10.Username)) Lvi.SubItems(1) = PointerToString(lpUsr10.Fullname) Lvi.SubItems(2) = PointerToString(lpUsr10.Comment) Buffer = Buffer + Len(lpUsr10) Next i End If NetApiBufferFree Buffer: NumUsers = EntriesRead UserEnum = rc End Function Function UserGetInfo(ByVal Servername As String, _ ByVal Username As String, Optional Comment As _ String, Optional Fullname As String) As Long Dim Buffer As Long Servername = StrConv(Servername, vbUnicode) Username = StrConv(Username, vbUnicode) rc = NetUserGetInfo(Servername, Username, 10, _ Buffer) If rc = 0 Then CopyMemory lpUsr10, ByVal Buffer, Len(lpUsr10) Comment = PointerToString(lpUsr10.Comment) Fullname = PointerToString(lpUsr10.Fullname) End If NetApiBufferFree Buffer: UserGetInfo = rc End Function Function UserSetInfo(ByVal Servername As String, _ ByVal Username As String, ByVal Fullname As _ String) As Long Servername = StrConv(Servername, vbUnicode) Username = StrConv(Username, vbUnicode) Usr1011.Fullname = StrConv(Fullname, vbUnicode) UserSetInfo = NetUserSetInfo(Servername, _ Username, 1011, Usr1011, 0) End Function Function UserGetGroups(ByVal Servername As _ String, ByVal Username As String, ByVal Lv As _ ListView, Optional NumItems As Long) As Long Dim Buffer As Long, BufferLen As Long, _ EntriesRead As Long, TotalEntries As Long Servername = StrConv(Servername, vbUnicode) Username = StrConv(Username, vbUnicode): BufferLen = -1 rc = NetUserGetGroups(Servername, Username, 0, _ Buffer, BufferLen, EntriesRead, TotalEntries) If rc = 0 And EntriesRead <> 0 Then For i = 0 To EntriesRead - 1 CopyMemory lpGrpUsr0, ByVal Buffer, Len _(lpGrpUsr0) Lv.ListItems.Add Text:=PointerToString(lpGrpUsr0.Groupname) Buffer = Buffer + Len(lpGrpUsr0) Next i End If NetApiBufferFree Buffer: NumItems = EntriesRead UserGetGroups = rc End Function Function UserDel(ByVal Servername As String, _ ByVal Username As String) As Long Servername = StrConv(Servername, vbUnicode) Username = StrConv(Username, vbUnicode) UserDel = NetUserDel(Servername, Username) End Function Private Function PointerToString(lpString As _ Long) As String Dim Buffer() As Byte, BufferLen As Long If lpString Then BufferLen = StrLen(lpString) * 2 If BufferLen Then ReDim Buffer(0 To (BufferLen - 1)) As Byte CopyMemory Buffer(0), ByVal lpString, BufferLen PointerToString = Buffer End If End If End Function
新建用户可以了,请问 ch21st(风尘鸟) 把用户加到组里如何做?谢谢!!
问题解决了吗?给你例子,如果是本地: 模块代码: Option ExplicitDeclare Function NetLocalGroupAddMembers Lib "netapi32.dll" _ (ByVal servername As String, _ ByVal groupname As String, _ ByVal level As Long, _ buf As Any, _ ByVal totalentries As Long) As LongDeclare Function NetApiBufferFree Lib "netapi32.dll" _ (ByVal Buffer As Long) As LongDeclare Function NetUserEnum Lib "netapi32.dll" _ (ByVal servername As String, _ ByVal level As Long, _ ByVal filter As Long, _ bufptr As Any, _ ByVal prefmaxlen As Long, _ entriesread As Long, _ totalentries As Long, _ resume_handle As Long) As LongDeclare Function NetLocalGroupEnum Lib "netapi32.dll" _ (ByVal servername As String, _ ByVal level As Long, _ bufptr As Any, _ ByVal prefmaxlen As Long, _ entriesread As Long, _ totalentries As Long, _ resumehandle As Long) As LongDeclare Function NetUserGetLocalGroups Lib "netapi32.dll" _ (ByVal servername As String, _ ByVal username As String, _ ByVal level As Long, _ ByVal flag As Long, _ bufptr As Any, _ ByVal prefmaxlen As Long, _ entriesread As Long, _ totalentries As Long) As LongDeclare Sub RtlMoveMemory Lib "Kernel32.dll" _ (Destination As Any, _ Source As Any, _ ByVal Length As Long)Declare Function lstrcpy Lib "Kernel32.dll" _ Alias "lstrcpyW" _ (lpszString1 As Any, _ lpszString2 As Any) As LongDeclare Function lstrlen Lib "Kernel32.dll" _ Alias "lstrlenW" _ (ByVal lpszString As Long) As LongType USER_INFO_0 usri0_name As Long End TypeType LOCALGROUP_INFO_0 lgrpi0_name As Long End TypeType LOCALGROUP_USER_INFO_0 lgrui0_name As Long End TypeType LOCALGROUP_MEMBERS_INFO_3 lgrmi3_domainandname As Long End TypePublic Const LG_INCLUDE_INDIRECT = &H1 Public Const MAX_PREFERRED_LENGTH = -1& Public Const ERROR_MORE_DATA = 234& Public Const NERR_Success = 0 ' Function PointerToString(lngPointer As Long) As String Dim bytBuffer(255) As Byte
lstrcpy bytBuffer(0), ByVal lngPointer PointerToString = Left(bytBuffer, lstrlen(lngPointer)) End Function窗体: Private Sub Combo1_Click() EnumLocalGroups List2 EnumUserLocalGroups List1, List2 End SubPrivate Sub Form_Load() With Label1 .Alignment = vbRightJustify .Caption = "本地用户列表" End With Label2.Caption = "用户所在组" Label3.Caption = "本机用户组" Command1.Caption = "添加" EnumUsers Combo1 Combo1.ListIndex = 0 End SubPrivate Sub Command1_Click() Dim lngWin32apiResultCode As Long Dim strServerName As String Dim strLocalGroupName As String Dim lngBufPtr As Long Dim udtLGMemInfo As LOCALGROUP_MEMBERS_INFO_3 Dim strName As String
strServerName = _ StrConv("", _ vbUnicode) If List2.ListIndex >= 0 Then strLocalGroupName = _ StrConv(List2.Text, _ vbUnicode) If Combo1.ListIndex >= 0 Then strName = Combo1.Text udtLGMemInfo.lgrmi3_domainandname = StrPtr(strName) lngWin32apiResultCode = _ NetLocalGroupAddMembers(strServerName, _ strLocalGroupName, _ 3, _ udtLGMemInfo, _ 1) NetApiBufferFree lngBufPtr End If End If EnumLocalGroups List2 EnumUserLocalGroups List1, List2 End Sub
Private Sub EnumUsers(cboUsers As ComboBox) Dim lngWin32apiResultCode As Long Dim strServerName As String Dim lngBufPtr As Long Dim lngMaxLen As Long Dim lngEntriesRead As Long Dim lngTotalEntries As Long Dim lngResumeHandle As Long Dim udtUserInfo0 As USER_INFO_0 Dim lngEntry As Long
strServerName = _ StrConv("", _ vbUnicode) Do lngWin32apiResultCode = _ NetUserEnum(strServerName, _ 0, _ 0, _ lngBufPtr, _ lngMaxLen, _ lngEntriesRead, _ lngTotalEntries, _ lngResumeHandle) If (lngWin32apiResultCode = NERR_Success) Or _ (lngWin32apiResultCode = ERROR_MORE_DATA) Then For lngEntry = 0 To lngEntriesRead - 1 RtlMoveMemory udtUserInfo0, _ ByVal lngBufPtr + _ Len(udtUserInfo0) * _ lngEntry, _ Len(udtUserInfo0) cboUsers.AddItem _ PointerToString(udtUserInfo0.usri0_name) Next End If If lngBufPtr <> 0 Then NetApiBufferFree lngBufPtr End If Loop Until lngEntriesRead = lngTotalEntries End Sub ' Private Sub EnumUserLocalGroups(lstUserLocalGroups As ListBox, _ lstLocalGroups As ListBox) Dim lngWin32apiResultCode As Long Dim strServerName As String Dim strUserName As String Dim lngBufPtr As Long Dim lngEntriesRead As Long Dim lngTotalEntries As Long Dim lngResumeHandle As Long Dim udtLGInfo0 As LOCALGROUP_USER_INFO_0 Dim lngEntry As Long Dim strLocalGroup As String Dim lngListCounter As Long
lstUserLocalGroups.Clear strServerName = _ StrConv("", _ vbUnicode) strUserName = _ StrConv(Combo1.Text, _ vbUnicode) Do lngWin32apiResultCode = _ NetUserGetLocalGroups(strServerName, _ strUserName, _ 0, _ LG_INCLUDE_INDIRECT, _ lngBufPtr, _ MAX_PREFERRED_LENGTH, _ lngEntriesRead, _ lngTotalEntries) If (lngWin32apiResultCode = NERR_Success) Or _ (lngWin32apiResultCode = ERROR_MORE_DATA) Then For lngEntry = 0 To lngEntriesRead - 1 RtlMoveMemory udtLGInfo0, _ ByVal lngBufPtr + _ Len(udtLGInfo0) * _ lngEntry, _ Len(udtLGInfo0) strLocalGroup = _ PointerToString(udtLGInfo0.lgrui0_name) lstUserLocalGroups.AddItem strLocalGroup With lstLocalGroups For lngListCounter = 0 To .ListCount - 1 If strLocalGroup = .List(lngListCounter) Then .RemoveItem (lngListCounter) End If Next End With Next End If If lngBufPtr <> 0 Then NetApiBufferFree lngBufPtr End If Loop Until lngEntriesRead = lngTotalEntries End Sub ' Private Sub EnumLocalGroups(lstLocalGroups As ListBox) Dim lngWin32apiResultCode As Long Dim strServerName As String Dim lngBufPtr As Long Dim lngEntriesRead As Long Dim lngTotalEntries As Long Dim lngResumeHandle As Long Dim udtLGInfo0 As LOCALGROUP_INFO_0 Dim lngEntry As Long
lstLocalGroups.Clear strServerName = _ StrConv("", _ vbUnicode) Do lngWin32apiResultCode = _ NetLocalGroupEnum(strServerName, _ 0, _ lngBufPtr, _ MAX_PREFERRED_LENGTH, _ lngEntriesRead, _ lngTotalEntries, _ lngResumeHandle) If (lngWin32apiResultCode = NERR_Success) Or _ (lngWin32apiResultCode = ERROR_MORE_DATA) Then For lngEntry = 0 To lngEntriesRead - 1 RtlMoveMemory udtLGInfo0, _ ByVal lngBufPtr + _ Len(udtLGInfo0) * _ lngEntry, _ Len(udtLGInfo0) lstLocalGroups.AddItem _ PointerToString(udtLGInfo0.lgrpi0_name) Next End If If lngBufPtr <> 0 Then NetApiBufferFree lngBufPtr End If Loop While lngWin32apiResultCode = ERROR_MORE_DATA End Sub
Lib "Netapi32" (ByVal Servername As String, _
ByVal Level As Long, Buffer As Any, ParamErr As _
Long) As Long
Private Declare Function NetUserEnum _
Lib "Netapi32" (ByVal Servername As String, _
ByVal Level As Long, ByVal Filter As Long, _
Buffer As Long, ByVal BufferLen As Long, _
EntriesRead As Long, TotalEntries As Long, _
ResumeHandle As Long) As Long
Private Declare Function NetUserGetInfo _
Lib "Netapi32" (ByVal Servername As String, _
ByVal Username As String, ByVal Level As Long, _
Buffer As Long) As Long
Private Declare Function NetUserSetInfo _
Lib "Netapi32" (ByVal Servername As String, _
ByVal Username As String, ByVal Level As Long, _
Buffer As Any, ParamErr As Long) As Long
Private Declare Function NetUserGetGroups _
Lib "Netapi32" (ByVal Servername As String, _
ByVal Username As String, ByVal Level As Long, _
Buffer As Long, ByVal BufferLen As Long, _
EntriesRead As Long, TotalEntries As Long) As Long
Private Declare Function NetUserDel _
Lib "Netapi32" (ByVal Servername As String, _
ByVal Username As String) As Long
Private Declare Function NetApiBufferFree _
Lib "Netapi32" (ByVal Buffer As Long) As Long
Private Declare Sub CopyMemory Lib "Kernel32" _
Alias "RtlMoveMemory" (lpSource As Any, _
lpDestination As Any, ByVal cbSize As Long)
Private Declare Function StrLen Lib "Kernel32" _
Alias "lstrlenW" (ByVal lpString As Long) As LongPrivate Type UserInfo_1
Username As String
Password As String
PasswordAge As Long
Privilege As Long
HomeDir As String
Comment As String
Flags As Long
ScriptPath As String
End Type
Private Type UserInfo_1011
Fullname As String
End Type
Private Type lpUserInfo_10
Username As Long
Comment As Long
UserComment As Long
Fullname As Long
End Type
Private Type lpGroupUsersInfo_0
Groupname As Long
End Type
' Guest privilege
Public Const User_Priv_Guest = &H0
' User privilege
Public Const User_Priv_User = &H1
' Administrator privilege
Public Const User_Priv_Admin = &H2
' The logon script executed. Required fo
' r Lan Manager 2.0 and Windows NT.
Public Const User_Flags_Script = &H1
' The account is disabled.
Public Const User_Flags_AccountDisable = &H2
' The home directory is required. Ignore
' d in Windows NT.
Public Const User_Flags_HomedirRequired = &H8
' The user's account is currently locked
' out.
Public Const User_Flags_Lockout = &H10
' No password is required.
Public Const User_Flags_PasswordNotRequired = &H20
' User cannot change password.
Public Const User_Flags_PasswordCantChange = &H40
' Password never expire.
Public Const User_Flags_PasswordNeverExpire = &H10000
' Account for users whose primary accoun
' t is in other domain. "Local User Accoun
' t" in User Manager.
Public Const User_Flags_TempDuplicateAccount = &H100
' Typical user.
Public Const User_Flags_NormalAccount = &H200
' Permit to trust account for a Windows
' NT domain that trusts other domains.
Public Const User_Flags_InterdomainTrustAccount = &H800
' Computer account for an Windows NT Wor
' kstation or Server that is a member of t
' his domain.
Public Const User_Flags_WorkstationTrustAccount = &H1000
' Computer account for a Windows NT Back
' up Domain Controller that is a member of
' this domain.
Public Const User_Flags_ServerTrustAccount = &H2000
Public Const User_Filter_TempDuplicateAccount = &H1
Public Const User_Filter_NormalAccount = &H2
Public Const User_Filter_InterdomainTrustAccount = &H8
Public Const User_Filter_WorkstationTrustAccount = &H10
Public Const User_Filter_ServerTrustAccount = &H20
' Input
Private Usr1 As UserInfo_1
Private Usr1011 As UserInfo_1011
' Output
Private lpUsr10 As lpUserInfo_10
Private lpGrpUsr0 As lpGroupUsersInfo_0
Private Lvi As ListItem
' Add a workstation to a domain:
' Servername: Your Domain Controller
' Username: New computer
' Flags: User_Flags_Script Or
' User_Flags_WorkstationTrustAccount
ByVal Username As String, ByVal Password As _
String, ByVal Comment As String, ByVal Flags As _
Long) As String
Servername = StrConv(Servername, vbUnicode)
Usr1.Username = StrConv(Username, vbUnicode)
Usr1.Password = StrConv(Password, vbUnicode)
Usr1.Privilege = User_Priv_User
Usr1.Comment = StrConv(Comment, vbUnicode)
Usr1.Flags = Flags
UserAdd = NetUserAdd(Servername, 1, Usr1, 0)
End Function
Function UserEnum(ByVal Servername As String, _
ByVal Filter As Long, ByVal Lv As ListView, _
Optional NumItems As Long) As Long
Dim Buffer As Long, BufferLen As Long, _
EntriesRead As Long, TotalEntries As Long, _
ResumeHandle As Long
Servername = StrConv(Servername, vbUnicode)
BufferLen = -1: ResumeHandle = 0
rc = NetUserEnum(Servername, 10, Filter, _
Buffer, BufferLen, EntriesRead, TotalEntries, _
ResumeHandle)
If rc = 0 And EntriesRead <> 0 Then
For i = 0 To EntriesRead - 1
CopyMemory lpUsr10, ByVal Buffer, Len(lpUsr10)
Set Lvi = Lv.ListItems.Add Text:=PointerToString(lpUsr10.Username))
Lvi.SubItems(1) = PointerToString(lpUsr10.Fullname)
Lvi.SubItems(2) = PointerToString(lpUsr10.Comment)
Buffer = Buffer + Len(lpUsr10)
Next i
End If
NetApiBufferFree Buffer: NumUsers = EntriesRead
UserEnum = rc
End Function
Function UserGetInfo(ByVal Servername As String, _
ByVal Username As String, Optional Comment As _
String, Optional Fullname As String) As Long
Dim Buffer As Long
Servername = StrConv(Servername, vbUnicode)
Username = StrConv(Username, vbUnicode)
rc = NetUserGetInfo(Servername, Username, 10, _
Buffer)
If rc = 0 Then
CopyMemory lpUsr10, ByVal Buffer, Len(lpUsr10)
Comment = PointerToString(lpUsr10.Comment)
Fullname = PointerToString(lpUsr10.Fullname)
End If
NetApiBufferFree Buffer: UserGetInfo = rc
End Function
Function UserSetInfo(ByVal Servername As String, _
ByVal Username As String, ByVal Fullname As _
String) As Long
Servername = StrConv(Servername, vbUnicode)
Username = StrConv(Username, vbUnicode)
Usr1011.Fullname = StrConv(Fullname, vbUnicode)
UserSetInfo = NetUserSetInfo(Servername, _
Username, 1011, Usr1011, 0)
End Function
Function UserGetGroups(ByVal Servername As _
String, ByVal Username As String, ByVal Lv As _
ListView, Optional NumItems As Long) As Long
Dim Buffer As Long, BufferLen As Long, _
EntriesRead As Long, TotalEntries As Long
Servername = StrConv(Servername, vbUnicode)
Username = StrConv(Username, vbUnicode): BufferLen = -1
rc = NetUserGetGroups(Servername, Username, 0, _
Buffer, BufferLen, EntriesRead, TotalEntries)
If rc = 0 And EntriesRead <> 0 Then
For i = 0 To EntriesRead - 1
CopyMemory lpGrpUsr0, ByVal Buffer, Len _(lpGrpUsr0)
Lv.ListItems.Add Text:=PointerToString(lpGrpUsr0.Groupname)
Buffer = Buffer + Len(lpGrpUsr0)
Next i
End If
NetApiBufferFree Buffer: NumItems = EntriesRead
UserGetGroups = rc
End Function
Function UserDel(ByVal Servername As String, _
ByVal Username As String) As Long
Servername = StrConv(Servername, vbUnicode)
Username = StrConv(Username, vbUnicode)
UserDel = NetUserDel(Servername, Username)
End Function
Private Function PointerToString(lpString As _
Long) As String
Dim Buffer() As Byte, BufferLen As Long
If lpString Then
BufferLen = StrLen(lpString) * 2
If BufferLen Then
ReDim Buffer(0 To (BufferLen - 1)) As Byte
CopyMemory Buffer(0), ByVal lpString, BufferLen
PointerToString = Buffer
End If
End If
End Function
模块代码:
Option ExplicitDeclare Function NetLocalGroupAddMembers Lib "netapi32.dll" _
(ByVal servername As String, _
ByVal groupname As String, _
ByVal level As Long, _
buf As Any, _
ByVal totalentries As Long) As LongDeclare Function NetApiBufferFree Lib "netapi32.dll" _
(ByVal Buffer As Long) As LongDeclare Function NetUserEnum Lib "netapi32.dll" _
(ByVal servername As String, _
ByVal level As Long, _
ByVal filter As Long, _
bufptr As Any, _
ByVal prefmaxlen As Long, _
entriesread As Long, _
totalentries As Long, _
resume_handle As Long) As LongDeclare Function NetLocalGroupEnum Lib "netapi32.dll" _
(ByVal servername As String, _
ByVal level As Long, _
bufptr As Any, _
ByVal prefmaxlen As Long, _
entriesread As Long, _
totalentries As Long, _
resumehandle As Long) As LongDeclare Function NetUserGetLocalGroups Lib "netapi32.dll" _
(ByVal servername As String, _
ByVal username As String, _
ByVal level As Long, _
ByVal flag As Long, _
bufptr As Any, _
ByVal prefmaxlen As Long, _
entriesread As Long, _
totalentries As Long) As LongDeclare Sub RtlMoveMemory Lib "Kernel32.dll" _
(Destination As Any, _
Source As Any, _
ByVal Length As Long)Declare Function lstrcpy Lib "Kernel32.dll" _
Alias "lstrcpyW" _
(lpszString1 As Any, _
lpszString2 As Any) As LongDeclare Function lstrlen Lib "Kernel32.dll" _
Alias "lstrlenW" _
(ByVal lpszString As Long) As LongType USER_INFO_0
usri0_name As Long
End TypeType LOCALGROUP_INFO_0
lgrpi0_name As Long
End TypeType LOCALGROUP_USER_INFO_0
lgrui0_name As Long
End TypeType LOCALGROUP_MEMBERS_INFO_3
lgrmi3_domainandname As Long
End TypePublic Const LG_INCLUDE_INDIRECT = &H1
Public Const MAX_PREFERRED_LENGTH = -1&
Public Const ERROR_MORE_DATA = 234&
Public Const NERR_Success = 0
'
Function PointerToString(lngPointer As Long) As String
Dim bytBuffer(255) As Byte
lstrcpy bytBuffer(0), ByVal lngPointer
PointerToString = Left(bytBuffer, lstrlen(lngPointer))
End Function窗体:
Private Sub Combo1_Click()
EnumLocalGroups List2
EnumUserLocalGroups List1, List2
End SubPrivate Sub Form_Load()
With Label1
.Alignment = vbRightJustify
.Caption = "本地用户列表"
End With
Label2.Caption = "用户所在组"
Label3.Caption = "本机用户组"
Command1.Caption = "添加"
EnumUsers Combo1
Combo1.ListIndex = 0
End SubPrivate Sub Command1_Click()
Dim lngWin32apiResultCode As Long
Dim strServerName As String
Dim strLocalGroupName As String
Dim lngBufPtr As Long
Dim udtLGMemInfo As LOCALGROUP_MEMBERS_INFO_3
Dim strName As String
strServerName = _
StrConv("", _
vbUnicode)
If List2.ListIndex >= 0 Then
strLocalGroupName = _
StrConv(List2.Text, _
vbUnicode)
If Combo1.ListIndex >= 0 Then
strName = Combo1.Text
udtLGMemInfo.lgrmi3_domainandname = StrPtr(strName)
lngWin32apiResultCode = _
NetLocalGroupAddMembers(strServerName, _
strLocalGroupName, _
3, _
udtLGMemInfo, _
1)
NetApiBufferFree lngBufPtr
End If
End If
EnumLocalGroups List2
EnumUserLocalGroups List1, List2
End Sub
Dim lngWin32apiResultCode As Long
Dim strServerName As String
Dim lngBufPtr As Long
Dim lngMaxLen As Long
Dim lngEntriesRead As Long
Dim lngTotalEntries As Long
Dim lngResumeHandle As Long
Dim udtUserInfo0 As USER_INFO_0
Dim lngEntry As Long
strServerName = _
StrConv("", _
vbUnicode)
Do
lngWin32apiResultCode = _
NetUserEnum(strServerName, _
0, _
0, _
lngBufPtr, _
lngMaxLen, _
lngEntriesRead, _
lngTotalEntries, _
lngResumeHandle)
If (lngWin32apiResultCode = NERR_Success) Or _
(lngWin32apiResultCode = ERROR_MORE_DATA) Then
For lngEntry = 0 To lngEntriesRead - 1
RtlMoveMemory udtUserInfo0, _
ByVal lngBufPtr + _
Len(udtUserInfo0) * _
lngEntry, _
Len(udtUserInfo0)
cboUsers.AddItem _
PointerToString(udtUserInfo0.usri0_name)
Next
End If
If lngBufPtr <> 0 Then
NetApiBufferFree lngBufPtr
End If
Loop Until lngEntriesRead = lngTotalEntries
End Sub
'
Private Sub EnumUserLocalGroups(lstUserLocalGroups As ListBox, _
lstLocalGroups As ListBox)
Dim lngWin32apiResultCode As Long
Dim strServerName As String
Dim strUserName As String
Dim lngBufPtr As Long
Dim lngEntriesRead As Long
Dim lngTotalEntries As Long
Dim lngResumeHandle As Long
Dim udtLGInfo0 As LOCALGROUP_USER_INFO_0
Dim lngEntry As Long
Dim strLocalGroup As String
Dim lngListCounter As Long
lstUserLocalGroups.Clear
strServerName = _
StrConv("", _
vbUnicode)
strUserName = _
StrConv(Combo1.Text, _
vbUnicode)
Do
lngWin32apiResultCode = _
NetUserGetLocalGroups(strServerName, _
strUserName, _
0, _
LG_INCLUDE_INDIRECT, _
lngBufPtr, _
MAX_PREFERRED_LENGTH, _
lngEntriesRead, _
lngTotalEntries)
If (lngWin32apiResultCode = NERR_Success) Or _
(lngWin32apiResultCode = ERROR_MORE_DATA) Then
For lngEntry = 0 To lngEntriesRead - 1
RtlMoveMemory udtLGInfo0, _
ByVal lngBufPtr + _
Len(udtLGInfo0) * _
lngEntry, _
Len(udtLGInfo0)
strLocalGroup = _
PointerToString(udtLGInfo0.lgrui0_name)
lstUserLocalGroups.AddItem strLocalGroup
With lstLocalGroups
For lngListCounter = 0 To .ListCount - 1
If strLocalGroup = .List(lngListCounter) Then
.RemoveItem (lngListCounter)
End If
Next
End With
Next
End If
If lngBufPtr <> 0 Then
NetApiBufferFree lngBufPtr
End If
Loop Until lngEntriesRead = lngTotalEntries
End Sub
'
Private Sub EnumLocalGroups(lstLocalGroups As ListBox)
Dim lngWin32apiResultCode As Long
Dim strServerName As String
Dim lngBufPtr As Long
Dim lngEntriesRead As Long
Dim lngTotalEntries As Long
Dim lngResumeHandle As Long
Dim udtLGInfo0 As LOCALGROUP_INFO_0
Dim lngEntry As Long
lstLocalGroups.Clear
strServerName = _
StrConv("", _
vbUnicode)
Do
lngWin32apiResultCode = _
NetLocalGroupEnum(strServerName, _
0, _
lngBufPtr, _
MAX_PREFERRED_LENGTH, _
lngEntriesRead, _
lngTotalEntries, _
lngResumeHandle)
If (lngWin32apiResultCode = NERR_Success) Or _
(lngWin32apiResultCode = ERROR_MORE_DATA) Then
For lngEntry = 0 To lngEntriesRead - 1
RtlMoveMemory udtLGInfo0, _
ByVal lngBufPtr + _
Len(udtLGInfo0) * _
lngEntry, _
Len(udtLGInfo0)
lstLocalGroups.AddItem _
PointerToString(udtLGInfo0.lgrpi0_name)
Next
End If
If lngBufPtr <> 0 Then
NetApiBufferFree lngBufPtr
End If
Loop While lngWin32apiResultCode = ERROR_MORE_DATA
End Sub