Visual Basic:添加用户和组

时间:2014-09-17 14:00:40

标签: windows vba winapi basic

我正在更新安装程序,需要创建一个Windows组并将(现有的)用户添加到该组。

用户是IIS伪用户,即IIS APPPOOL \ username

使用VB6或VB.NET有一种简单的方法吗?我无法找到明显的库/ API或任何示例代码

由于

1 个答案:

答案 0 :(得分:1)

您可以尝试从此link中提取以下代码来创建用户。基本上它使用API​​ NetUserAdd

Option Explicit
' ---------------------------------------------
' The USER_INFO_3 data structure
' ---------------------------------------------
Private Type USER_INFO_3
   usri3_name              As Long
   usri3_password          As Long
   usri3_password_age      As Long
   usri3_priv              As Long
   usri3_home_dir          As Long
   usri3_comment           As Long
   usri3_flags             As Long
   usri3_script_path       As Long
   usri3_auth_flags        As Long
   usri3_full_name         As Long
   usri3_usr_comment       As Long
   usri3_parms             As Long
   usri3_workstations      As Long
   usri3_last_logon        As Long
   usri3_last_logoff       As Long
   usri3_acct_expires      As Long
   usri3_max_storage       As Long
   usri3_units_per_week    As Long
   usri3_logon_hours       As Long
   usri3_bad_pw_count      As Long
   usri3_num_logons        As Long
   usri3_logon_server      As Long
   usri3_country_code      As Long
   usri3_code_page         As Long
   usri3_user_id           As Long
   usri3_primary_group_id  As Long
   usri3_profile           As Long
   usri3_home_dir_drive    As Long
   usri3_password_expired  As Long
End Type

' ---------------------------------------------
' Possible errors with API call
' ---------------------------------------------
Private Const ERROR_ACCESS_DENIED      As Long = 5
Private Const NERR_BASE                As Long = 2100
Private Const NERR_GroupExists         As Long = NERR_BASE + 123
Private Const NERR_NotPrimary          As Long = NERR_BASE + 126
Private Const NERR_UserExists          As Long = NERR_BASE + 124
Private Const NERR_PasswordTooShort    As Long = NERR_BASE + 145
Private Const NERR_InvalidComputer     As Long = NERR_BASE + 251
Private Const NERR_Success             As Long = 0&

Private Const TIMEQ_FOREVER            As Long = -1&
Private Const DOMAIN_GROUP_RID_USERS   As Long = &H201&
Private Const USER_MAXSTORAGE_UNLIMITED   As Long = -1&
Private Const constUserInfoLevel3      As Long = 3
' ---------------------------------------------
' Used by usri3_flags element of data structure
' ---------------------------------------------
Private Const UF_SCRIPT                As Long = &H1&
Private Const UF_ACCOUNTDISABLE        As Long = &H2&
Private Const UF_HOMEDIR_REQUIRED      As Long = &H8&
Private Const UF_LOCKOUT               As Long = &H10&
Private Const UF_PASSWD_NOTREQD        As Long = &H20&
Private Const UF_PASSWD_CANT_CHANGE    As Long = &H40&
Private Const UF_DONT_EXPIRE_PASSWD    As Long = &H10000
Private Const STILL_ACTIVE             As Long = &H103&
Private Const UF_NORMAL_ACCOUNT        As Long = &H200&
Private Const UF_SERVER_TRUST_ACCOUNT  As Long = &H2000&
Private Const PROCESS_QUERY_INFORMATION   As Long = &H400&
Private Const UF_TEMP_DUPLICATE_ACCOUNT   As Long = &H100&
Private Const UF_INTERDOMAIN_TRUST_ACCOUNT   As Long = &H800&
Private Const UF_WORKSTATION_TRUST_ACCOUNT   As Long = &H1000&


Private Declare Function NetUserAdd Lib "netapi32.dll" (ServerName As Byte, ByVal Level As Long, Buffer As USER_INFO_3, parm_err As Long) As Long
Private Declare Function NetApiBufferAllocate Lib "netapi32.dll" (ByVal ByteCount As Long, Ptr As Long) As Long
Private Declare Function NetApiBufferFree Lib "Netapi32" (ByVal pBuffer As Long) As Long


' *******************************************************
' Add a user either to NT -- you *MUST* have admin or
'     account operator privileges to successfully run
'     this function
'     Use on NT Only
' *******************************************************
Public Function AddUser(ByVal xi_strServerName As String, _
                        ByVal xi_strUserName As String, _
                        ByVal xi_strPassword As String, _
                        Optional ByVal xi_strUserFullName As String = vbNullString, _
                        Optional ByVal xi_strUserComment As String = vbNullString) As Boolean

   Dim p_strErr                        As String
   Dim p_lngRtn                        As Long
   Dim p_lngPtrUserName                As Long
   Dim p_lngPtrPassword                As Long
   Dim p_lngPtrUserFullName            As Long
   Dim p_lngPtrUserComment             As Long
   Dim p_lngParameterErr               As Long
   Dim p_lngFlags                      As Long
   Dim p_abytServerName()              As Byte
   Dim p_abytUserName()                As Byte
   Dim p_abytPassword()                As Byte
   Dim p_abytUserFullName()            As Byte
   Dim p_abytUserComment()             As Byte
   Dim p_typUserInfo3                  As USER_INFO_3

   If xi_strUserFullName = vbNullString Then
      xi_strUserName = xi_strUserName
   End If

   ' ------------------------------------------
   ' Create byte arrays to avoid Unicode hassles
   ' ------------------------------------------
   p_abytServerName = xi_strServerName & vbNullChar
   p_abytUserName = xi_strUserName & vbNullChar
   p_abytUserFullName = xi_strUserFullName & vbNullChar
   p_abytPassword = xi_strPassword & vbNullChar
   p_abytUserComment = xi_strUserComment & vbNullChar

   ' ------------------------------------------
   ' Allocate buffer space
   ' ------------------------------------------
   p_lngRtn = NetApiBufferAllocate(UBound(p_abytUserName), p_lngPtrUserName)
   p_lngRtn = NetApiBufferAllocate(UBound(p_abytUserFullName), p_lngPtrUserFullName)
   p_lngRtn = NetApiBufferAllocate(UBound(p_abytPassword), p_lngPtrPassword)
   p_lngRtn = NetApiBufferAllocate(UBound(p_abytUserComment), p_lngPtrUserComment)

   ' ------------------------------------------
   ' Get pointers to the byte arrays
   ' ------------------------------------------
   p_lngPtrUserName = VarPtr(p_abytUserName(0))
   p_lngPtrUserFullName = VarPtr(p_abytUserFullName(0))
   p_lngPtrPassword = VarPtr(p_abytPassword(0))
   p_lngPtrUserComment = VarPtr(p_abytUserComment(0))

   ' ------------------------------------------
   ' Fill the VB structure
   ' ------------------------------------------
   p_lngFlags = UF_NORMAL_ACCOUNT Or UF_SCRIPT Or UF_DONT_EXPIRE_PASSWD
   With p_typUserInfo3
      .usri3_acct_expires = TIMEQ_FOREVER                ' Never expires
      .usri3_comment = p_lngPtrUserComment               ' Comment
      .usri3_flags = p_lngFlags                          ' There are a number of variations
      .usri3_full_name = p_lngPtrUserFullName            ' User's full name
      .usri3_max_storage = USER_MAXSTORAGE_UNLIMITED     ' Can use any amount of disk space
      .usri3_name = p_lngPtrUserName                     ' Name of user account
      .usri3_password = p_lngPtrPassword                 ' Password for user account
      .usri3_primary_group_id = DOMAIN_GROUP_RID_USERS   ' You MUST use this constant for NetUserAdd
      .usri3_script_path = 0&       ' Path of user's logon script
      .usri3_auth_flags = 0&        ' Ignored by NetUserAdd
      .usri3_bad_pw_count = 0&      ' Ignored by NetUserAdd
      .usri3_code_page = 0&         ' Code page for user's language
      .usri3_country_code = 0&      ' Country code for user's language
      .usri3_home_dir = 0&          ' Can specify path of home directory of this user
      .usri3_home_dir_drive = 0&    ' Drive letter assign to user's profile
      .usri3_last_logoff = 0&       ' Not needed when adding a user
      .usri3_last_logon = 0&        ' Ignored by NetUserAdd
      .usri3_logon_hours = 0&       ' Null means no restrictions
      .usri3_logon_server = 0&      ' Null means logon to domain server
      .usri3_num_logons = 0&        ' Ignored by NetUserAdd
      .usri3_parms = 0&             ' Used by specific applications
      .usri3_password_age = 0&      ' Ignored by NetUserAdd
      .usri3_password_expired = 0&  ' None-zero means user must change password at next logon
      .usri3_priv = 0&              ' Ignored by NetUserAdd
      .usri3_profile = 0&           ' Path to a user's profile
      .usri3_units_per_week = 0&    ' Ignored by NetUserAdd
      .usri3_user_id = 0&           ' Ignored by NetUserAdd
      .usri3_usr_comment = 0&       ' User comment
      .usri3_workstations = 0&      ' Workstations a user can log onto (null = all stations)
   End With

   ' ------------------------------------------
   ' Attempt to add the user
   ' ------------------------------------------
   p_lngRtn = NetUserAdd(p_abytServerName(0), _
                         constUserInfoLevel3, _
                         p_typUserInfo3, _
                         p_lngParameterErr)

   ' ------------------------------------------
   ' Check for error
   ' ------------------------------------------
   If p_lngRtn <> 0 Then
      AddUser = False
      Select Case p_lngRtn
         Case ERROR_ACCESS_DENIED
            p_strErr = "User doesn't have sufficient access rights."
         Case NERR_GroupExists
            p_strErr = "The group already exists."
         Case NERR_NotPrimary
            p_strErr = "Can only do this operation on the PDC of the domain."
         Case NERR_UserExists
            p_strErr = "The user account already exists."
         Case NERR_PasswordTooShort
            p_strErr = "The password is shorter than required."
         Case NERR_InvalidComputer
            p_strErr = "The computer name is invalid."
         Case Else
            p_strErr = "Unknown error #" & CStr(p_lngRtn)
      End Select

      On Error GoTo 0
      Err.Raise Number:=p_lngRtn, _
                Description:=p_strErr & vbCrLf & _
                             "Error in parameter " & p_lngParameterErr & _
                             " when attempting to add the user, " & xi_strUserName, _
                Source:="Form1.AddUser"
   Else
      AddUser = True
   End If

   ' ------------------------------------------
   ' Be a good programmer and free the memory
   '     you've allocated
   ' ------------------------------------------
   p_lngRtn = NetApiBufferFree(p_lngPtrUserName)
   p_lngRtn = NetApiBufferFree(p_lngPtrPassword)
   p_lngRtn = NetApiBufferFree(p_lngPtrUserFullName)
   p_lngRtn = NetApiBufferFree(p_lngPtrUserComment)

End Function

编辑:

我在msdn中找到了以下示例:

Option Explicit

On Error Resume Next

Dim scriptResult        ' Script success or failure

Dim groupPath           ' ADsPath to the group container

Dim group               ' Group object

Dim memberPath          ' ADsPath to the member

Dim member              ' Member object

Dim groupMemberList     ' Used to display group members

Dim errorText           ' Error handing text

scriptResult = False

groupPath = 
  "LDAP://fabrikam.com/CN=TestGroup,OU=TestOU,DC=fabrikam,DC=com"

memberPath = "LDAP://CN=JeffSmith,OU=TestOU,DC=fabrikam,DC=com"

WScript.Echo("Retrieving group object")

Set group = GetObject(groupPath)

If Err.number <> vbEmpty then

    Call ErrorHandler("Could not create group object.")

End If

Call ShowMembers(groupPath)     'Optional function call

WScript.Echo("Retrieving new member object")

Set member = GetObject(memberPath)

If Err.number <> vbEmpty then

    Call ErrorHandler("Could not get new member object.")

End If

WScript.Echo("Adding member to group.")

group.Add(member.ADsPath)

If Err.number <> vbEmpty then

    Call ErrorHandler("Could not add member to group.")

End If

Call ShowMembers(groupPath)     ' Optional function call

scriptResult = True

Call FinalResult(scriptResult)

'****************************************************************
' This function displays the members of a group. The function
' takes the ADsPath of the group.
'****************************************************************

Sub ShowMembers(groupPath)

    Dim groupMember

    Dim groupMemberList

    Dim groupObject

    Set groupObject = GetObject(groupPath)

    Set groupMemberList = groupObject.Members

    Select Case groupMemberList.Count

        Case 1 

            WScript.Echo vbcrlf & "The group has one member."

        Case 0

            WScript.Echo vbcrlf & "The group has no members."

        Case Else

            WScript.Echo vbcrlf & "The group has " & 
                                  groupMemberList.Count & 
                                  " members."

    End Select

    If groupMemberList.Count > 0 then

        WScript.Echo vbcrlf & "Here is a member list."

        For Each groupMember in groupMemberList

            WScript.Echo groupMember.Name

        Next

        WScript.Echo vbcrlf

    End If

    Set groupObject = Nothing

    Set groupMemberList = Nothing

End Sub

'****************************************************************
' This function shows if the script succeeded or failed. The 
' function processed the scriptResult variable.
'****************************************************************

Sub FinalResult(scriptResult)

    WScript.Echo vbcrlf

    If scriptResult = False then

        WScript.Echo "Script failed."

    Else

        WScript.Echo("Script successfully completed.")

    End If

    WScript.Quit

End Sub

'****************************************************************
' This function handles errors that occur in the script.
'****************************************************************

Sub ErrorHandler( errorText )

    WScript.Echo(vbcrlf & errorText)

    WScript.Echo("Error number: " & Err.number)

    WScript.Echo("Error Description: " & Err.Description)

    Err.Clear 

    Call FinalResult(scriptResult)

End Sub  

或者,您可以使用Windows脚本宿主来执行网络工具:

Set objShell = CreateObject("Wscript.Shell")
strCommand = "net localgroup Administrators /add DOMAIN\USERNAME" 
Set objExec = objShell.Exec(strCommand)