首页 | 邮件资讯 | 技术教程 | 解决方案 | 产品评测 | 邮件人才 | 邮件博客 | 邮件系统论坛 | 软件下载 | 邮件周刊 | 热点专题 | 工具
网络技术 | 操作系统 | 邮件系统 | 客户端 | 电子邮箱 | 反垃圾邮件 | 邮件安全 | 邮件营销 | 移动电邮 | 邮件软件下载 | 电子书下载

邮件服务器

技术前沿 | Qmail | IMail | MDaemon | Exchange | Domino | 其它 | Foxmail | James | Kerio | JavaMail | WinMail | Sendmail | Postfix | Winwebmail | Merak | CMailServer | 邮件与开发 | 金笛 |
首页 > 邮件服务器 > Exchange Server > 基于ADSI的NT帐号及Exchange Server帐号申请及验证模块源代码 > 正文

基于ADSI的NT帐号及Exchange Server帐号申请及验证模块源代码

出处:CSDN 作者:CSDN 时间:2005-7-12 11:38:00

1.安装ADSI2.5
2.创建一个新的ActiveX DLL工程,工程名:RbsBoxGen,类名:NTUserManager
3.执行工程-引用将下列库选上:
  Active DS Type Library 
  Microsoft Active Server Pages Object Library 
4.添加一个模块,代码如下:
'模块
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''
'' ADSI Sample to create and delete Exchange 5.5 Mailboxes
''
'' Richard Ault, Jean-Philippe Balivet, Neil Wemple -- 1998
''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Option Explicit

' Mailbox property settings
Public Const LOGON_CMD = "logon.cmd"
Public Const INCOMING_MESSAGE_LIMIT = 1000
Public Const OUTGOING_MESSAGE_LIMIT = 1000
Public Const WARNING_STORAGE_LIMIT = 8000
Public Const SEND_STORAGE_LIMIT = 12000
Public Const REPLICATION_SENSITIVITY = 20
Public Const COUNTRY = "US"

' Mailbox rights for Exchange security descriptor (home made)
Public Const RIGHT_MODIFY_USER_ATTRIBUTES = &H2
Public Const RIGHT_MODIFY_ADMIN_ATTRIBUTES = &H4
Public Const RIGHT_SEND_AS = &H8
Public Const RIGHT_MAILBOX_OWNER = &H10
Public Const RIGHT_MODIFY_PERMISSIONS = &H80
Public Const RIGHT_SEARCH = &H100

' win32 constants for security descriptors (from VB5 API viewer)
Public Const ACL_REVISION = (2)
Public Const SECURITY_DESCRIPTOR_REVISION = (1)
Public Const SidTypeUser = 1

Type ACL
        AclRevision As Byte
        Sbz1 As Byte
        AclSize As Integer
        AceCount As Integer
        Sbz2 As Integer
End Type

Type ACE_HEADER
        AceType As Byte
        AceFlags As Byte
        AceSize As Long
End Type

Type ACCESS_ALLOWED_ACE
        Header As ACE_HEADER
        Mask As Long
        SidStart As Long
End Type

Type SECURITY_DESCRIPTOR
        Revision As Byte
        Sbz1 As Byte
        Control As Long
        Owner As Long
        Group As Long
        Sacl As ACL
        Dacl As ACL
End Type

' Just an help to allocate the 2dim dynamic array
Private Type mySID
    x() As Byte
End Type


' Declares : modified from VB5 API viewer
Declare Function InitializeSecurityDescriptor Lib "advapi32.dll" _
        (pSecurityDescriptor As SECURITY_DESCRIPTOR, _
        ByVal dwRevision As Long) As Long

Declare Function SetSecurityDescriptorOwner Lib "advapi32.dll" _
        (pSecurityDescriptor As SECURITY_DESCRIPTOR, _
        pOwner As Byte, _
        ByVal bOwnerDefaulted As Long) As Long

Declare Function SetSecurityDescriptorGroup Lib "advapi32.dll" _
        (pSecurityDescriptor As SECURITY_DESCRIPTOR, _
        pGroup As Byte, _
        ByVal bGroupDefaulted As Long) As Long

Declare Function SetSecurityDescriptorDacl Lib "advapi32.dll" _
        (pSecurityDescriptor As SECURITY_DESCRIPTOR, _
        ByVal bDaclPresent As Long, _
        pDacl As Byte, _
        ByVal bDaclDefaulted As Long) As Long

Declare Function SetSecurityDescriptorSacl Lib "advapi32.dll" _
        (pSecurityDescriptor As SECURITY_DESCRIPTOR, _
        ByVal bSaclPresent As Long, _
        pSacl As Byte, _
        ByVal bSaclDefaulted As Long) As Long

Declare Function MakeSelfRelativeSD Lib "advapi32.dll" _
        (pAbsoluteSecurityDescriptor As SECURITY_DESCRIPTOR, _
        pSelfRelativeSecurityDescriptor As Byte, _
        ByRef lpdwBufferLength As Long) As Long

Declare Function GetSecurityDescriptorLength Lib "advapi32.dll" _
        (pSecurityDescriptor As SECURITY_DESCRIPTOR) As Long

Declare Function IsValidSecurityDescriptor Lib "advapi32.dll" _
        (pSecurityDescriptor As Byte) As Long

Declare Function InitializeAcl Lib "advapi32.dll" _
        (pACL As Byte, _
        ByVal nAclLength As Long, _
        ByVal dwAclRevision As Long) As Long

Declare Function AddAccessAllowedAce Lib "advapi32.dll" _
        (pACL As Byte, _
        ByVal dwAceRevision As Long, _
        ByVal AccessMask As Long, _
        pSid As Byte) As Long

Declare Function IsValidAcl Lib "advapi32.dll" _
        (pACL As Byte) As Long

Declare Function GetLastError Lib "kernel32" _
        () As Long

Declare Function LookupAccountName Lib "advapi32.dll" _
        Alias "LookupAccountNameA" _
        (ByVal IpSystemName As String, _
        ByVal IpAccountName As String, _
        pSid As Byte, _
        cbSid As Long, _
        ByVal ReferencedDomainName As String, _
        cbReferencedDomainName As Long, _
        peUse As Integer) As Long

Declare Function NetGetDCName Lib "NETAPI32.DLL" _
        (ServerName As Byte, _
        DomainName As Byte, _
        DCNPtr As Long) As Long
                                       
Declare Function NetApiBufferFree Lib "NETAPI32.DLL" _
        (ByVal Ptr As Long) As Long
       
Declare Function PtrToStr Lib "kernel32" _
        Alias "lstrcpyW" (RetVal As Byte, ByVal Ptr As Long) As Long

Declare Function GetLengthSid Lib "advapi32.dll" _
        (pSid As Byte) As Long


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''
'' Create_NT_Account() -- creates an NT user account
''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function Create_NT_Account(strDomain As String, _
                                  strAdmin As String, _
                                  strPassword As String, _
                                  UserName As String, _
                                  FullName As String, _
                                  NTServer As String, _
                                  strPwd As String, _
                                  strRealName As String) As Boolean

Dim oNS As IADsOpenDSObject
Dim User As IADsUser
Dim Domain As IADsDomain

    On Error GoTo Create_NT_Account_Error

    Create_NT_Account = False
   
    If (strPassword = "") Then
        strPassword = ""
    End If
   
    Set oNS = GetObject("WinNT:")
    Set Domain = oNS.OpenDSObject("WinNT://" & strDomain, strDomain & "\" & strAdmin, strPassword, 0)
   
    Set User = Domain.Create("User", UserName)
    With User
        .Description = "ADSI 创建的用户"
        .FullName = strRealName 'FullName
        '.HomeDirectory = "\\" & NTServer & "\" & UserName
        '.LoginScript = LOGON_CMD
        .SetInfo
        ' First password = username
        .SetPassword strPwd
    End With
   
    Debug.Print "Successfully created NT Account for user " & UserName
    Create_NT_Account = True
    Exit Function

Create_NT_Account_Error:
    Create_NT_Account = False
    Debug.Print "Error 0x" & CStr(Hex(Err.Number)) & " occurred creating NT account for user " & UserName

End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''
'' Delete_NT_Account() -- deletes an NT user account
''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function Delete_NT_Account(strDomain As String, _
                                  strAdmin As String, _
                                  strPassword As String, _
                                  UserName As String _
                                  ) As Boolean

Dim Domain As IADsDomain
Dim oNS As IADsOpenDSObject

    On Error GoTo Delete_NT_Account_Error
   
    Delete_NT_Account = False
   
    If (strPassword = "") Then
        strPassword = ""
    End If

    Set oNS = GetObject("WinNT:")
    Set Domain = oNS.OpenDSObject("WinNT://" & strDomain, strDomain & "\" & strAdmin, strPassword, 0)
   
    Domain.Delete "User", UserName
   
    Debug.Print "Successfully deleted NT Account for user " & UserName
    Delete_NT_Account = True
    Exit Function
   
Delete_NT_Account_Error:
   
    Debug.Print "Error 0x" & CStr(Hex(Err.Number)) & " occurred deleting NT account for user " & UserName
   
End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''
'' Create_Exchange_Mailbox() -- creates an Exchange mailbox, sets mailbox
''                          properties and and associates the mailbox with
''                          an existing NT user account
''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function Create_Exchange_MailBox( _
    IsRemote As Boolean, _
    strServer As String, _
    strDomain As String, _
    strAdmin As String, _
    strPassword As String, _
    UserName As String, _
    EmailAddress As String, _
    strFirstName As String, _
    strLastName As String, _
    ExchangeServer As String, _
    ExchangeSite As String, _
    ExchangeOrganization As String, _
    strPwd As String, _
    strRealName As String) As Boolean


Dim Container As IADsContainer
Dim strRecipContainer As String
Dim Mailbox As IADs
Dim rbSID(1024) As Byte
Dim OtherMailBox() As Variant
Dim sSelfSD() As Byte
Dim encodedSD() As Byte
Dim I As Integer

Dim oNS As IADsOpenDSObject

    On Error GoTo Create_Exchange_MailBox_Error
   
    Create_Exchange_MailBox = False
   
    If (strPassword = "") Then
        strPassword = ""
    End If

    ' Recipients container for this server
    strRecipContainer = "LDAP://" & ExchangeServer & _
                        "/CN=Recipients,OU=" & ExchangeSite & _
                        ",O=" & ExchangeOrganization
    Set oNS = GetObject("LDAP:")
    Set Container = oNS.OpenDSObject(strRecipContainer, "cn=" & strAdmin & ",dc=" & strDomain, strPassword, 0)
   
    ' This creates both mailboxes or remote dir entries
    If IsRemote Then
        Set Mailbox = Container.Create("Remote-Address", "CN=" & UserName)
        Mailbox.Put "Target-Address", EmailAddress
    Else
        Set Mailbox = Container.Create("OrganizationalPerson", "CN=" & UserName) '
        Mailbox.Put "MailPreferenceOption", 0
    End If
   
    With Mailbox
        .SetInfo
       
        ' As an example two other addresses
        ReDim OtherMailBox(1)
        OtherMailBox(0) = "MS$" & ExchangeOrganization & _
                          "/" & ExchangeSite & _
                          "/" & UserName
       
        OtherMailBox(1) = "CCMAIL$" & UserName & _
                          " at " & ExchangeSite
                         
        If Not (IsRemote) Then
            ' Get the SID of the previously created NT user
            Get_Exchange_Sid strDomain, UserName, rbSID
            .Put "Assoc-NT-Account", rbSID
            ' This line also initialize the "Home Server" parameter of the Exchange admin
            .Put "Home-MTA", "cn=Microsoft MTA,cn=" & ExchangeServer & ",cn=Servers,cn=Configuration,ou=" & ExchangeSite & ", o = " & ExchangeOrganization
            .Put "Home-MDB", "cn=Microsoft Private MDB,cn=" & ExchangeServer & ",cn=Servers,cn=Configuration,ou=" & ExchangeSite & ",o=" & ExchangeOrganization
            .Put "Submission-Cont-Length", OUTGOING_MESSAGE_LIMIT
            .Put "MDB-Use-Defaults", False
            .Put "MDB-Storage-Quota", WARNING_STORAGE_LIMIT
            .Put "MDB-Over-Quota-Limit", SEND_STORAGE_LIMIT
            .Put "MAPI-Recipient", True
           
            ' Security descriptor
            ' The rights choosen make a normal user role
            ' The other user is optionnal, delegate for ex.
           
            Call MakeSelfSD(sSelfSD, _
                            strServer, _
                            strDomain, _
                            UserName, _
                            UserName, _
                            RIGHT_MAILBOX_OWNER + RIGHT_SEND_AS + _
                            RIGHT_MODIFY_USER_ATTRIBUTES _
                          )

            ReDim encodedSD(2 * UBound(sSelfSD) + 1)
            For I = 0 To UBound(sSelfSD) - 1
                encodedSD(2 * I) = AscB(Hex$(sSelfSD(I) \ &H10))
                encodedSD(2 * I + 1) = AscB(Hex$(sSelfSD(I) Mod &H10))
            Next I
           
            .Put "NT-Security-Descriptor", encodedSD
        Else
           
            ReDim Preserve OtherMailBox(2)
            OtherMailBox(2) = EmailAddress
            .Put "MAPI-Recipient", False
        End If
       
        ' Usng PutEx for array properties
        .PutEx ADS_PROPERTY_UPDATE, "otherMailBox", OtherMailBox
       
        .Put "Deliv-Cont-Length", INCOMING_MESSAGE_LIMIT
        ' i : initials
        .Put "TextEncodedORaddress", "c=" & COUNTRY & _
                                    ";a= " & _
                                    ";p=" & ExchangeOrganization & _
                                    ";o=" & ExchangeSite & _
                                    ";s=" & strLastName & _
                                    ";g=" & strFirstName & _
                                    ";i=" & Mid(strFirstName, 1, 1) & Mid(strLastName, 1, 1) & ";"
       
        .Put "rfc822MailBox", UserName & "@" & ExchangeSite & "." & ExchangeOrganization & ".com"
        .Put "Replication-Sensitivity", REPLICATION_SENSITIVITY
        .Put "uid", UserName
        .Put "name", UserName

      '  .Put "GivenName", strFirstName
      '  .Put "Sn", strLastName
        .Put "Cn", strRealName 'strFirstName & " " & UserName 'strLastName
      '  .Put "Initials", Mid(strFirstName, 1, 1) & Mid(strLastName, 1, 1)
       
        ' Any of these fields are simply descriptive and optional, not included in
        ' this sample and there are many other fields in the mailbox
        .Put "Mail", EmailAddress
        'If 0 < Len(Direction) Then .Put "Department", Direction
        'If 0 < Len(FaxNumber) Then .Put "FacsimileTelephoneNumber", FaxNumber
        'If 0 < Len(City) Then .Put "l", City
        'If 0 < Len(Address) Then .Put "PostalAddress", Address
        'If 0 < Len(PostalCode) Then .Put "PostalCode", PostalCode
        'If 0 < Len(Banque) Then .Put "Company", Banque
        'If 0 < Len(PhoneNumber) Then .Put "TelephoneNumber", PhoneNumber
        'If 0 < Len(Title) Then .Put "Title", Title
        'If 0 < Len(AP1) Then .Put "Extension-Attribute-1", AP1
        'If 0 < Len(Manager) Then .Put "Extension-Attribute-2", Manager
        'If 0 < Len(Agence) Then .Put "Extension-Attribute-3", Agence
        'If 0 < Len(Groupe) Then .Put "Extension-Attribute-4", Groupe
        'If 0 < Len(Secteur) Then .Put "Extension-Attribute-5", Secteur
        'If 0 < Len(Region) Then .Put "Extension-Attribute-6", Region
        'If 0 < Len(GroupeBanque) Then .Put "Extension-Attribute-7", GroupeBanque
        'If 0 < Len(AP7) Then .Put "Extension-Attribute-8", AP7
        'If 0 < Len(AP8) Then .Put "Extension-Attribute-9", AP8
        .SetInfo
    End With
   
    Debug.Print "Successfully created mailbox for user " & UserName
    Create_Exchange_MailBox = True
    Exit Function

Create_Exchange_MailBox_Error:
    Create_Exchange_MailBox = False
    Debug.Print "Error 0x" & CStr(Hex(Err.Number)) & " occurred creating Mailbox for user " & UserName
   
End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''
'' Delete_Exchange_Mailbox() -- deletes an Exchange mailbox
''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function Delete_Exchange_Mailbox( _
    IsRemote As Boolean, _
    strDomain As String, _
    strAdmin As String, _
    strPassword As String, _
    UserName As String, _
    ExchangeServer As String, _
    ExchangeSite As String, _
    ExchangeOrganization As String _
  ) As Boolean

Dim strRecipContainer As String
Dim Container As IADsContainer
Dim oNS As IADsOpenDSObject

    If (strPassword = "") Then
        strPassword = ""
    End If

    On Error GoTo Delete_Exchange_MailBox_Error
    Delete_Exchange_Mailbox = False
   
    ' Recipients container for this server
    strRecipContainer = "LDAP://" & ExchangeServer & _
                        "/CN=Recipients,OU=" & ExchangeSite & _
                        ",O=" & ExchangeOrganization
    Set oNS = GetObject("LDAP:")
    Set Container = oNS.OpenDSObject(strRecipContainer, "cn=" & strAdmin & ",dc=" & strDomain, strPassword, 0)

    If Not (IsRemote) Then
        Container.Delete "OrganizationalPerson", "CN=" & UserName
    Else
        Container.Delete "Remote-Address", "CN=" & UserName
    End If
   
    Container.SetInfo
   
    Debug.Print "Successfully deleted mailbox for user " & UserName
    Delete_Exchange_Mailbox = True
    Exit Function

Delete_Exchange_MailBox_Error:
   
    Debug.Print "Error 0x" & CStr(Hex(Err.Number)) & " occurred deleting Mailbox for user " & UserName

End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''
'' MakeSelfSD -- builds a self-relative Security Descriptor suitable for ADSI
''
'' Return code : 1 = OK
''              0 = error
'' In    sSelfSD    dynamic byte array, size 0
''      sServer    DC for the domain
''      sDomain    Domain name
''      sAssocUser  Primary NT account for the mail box (SD owner)
''      paramarray  Authorized accounts
''                  This is an array of (userid, role, userid, role...)
''                  where role is a combination of rights (cf RIGHTxxx constants)
'' Out  sSelfSD    Self relative SD allocated and initalized
''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function MakeSelfSD(sSelfSD() As Byte, _
        sServer As String, sDomain As String, _
        sAssocUSer As String, _
        ParamArray ACEList() As Variant) As Long
Dim SecDesc As SECURITY_DESCRIPTOR
Dim I As Integer
Dim tACL As ACL
Dim tACCESS_ALLOWED_ACE As ACCESS_ALLOWED_ACE
Dim pSid() As Byte
Dim pACL() As Byte
Dim pACESID() As mySID
Dim Longueur As Long
Dim rc As Long
   
    On Error GoTo SDError
    ' Initializing abolute SD
    rc = InitializeSecurityDescriptor(SecDesc, SECURITY_DESCRIPTOR_REVISION)
    If (rc <> 1) Then
        Err.Raise -12, , "InitializeSecurityDescriptor"
    End If
   
    rc = GetSID(sServer, sDomain, sAssocUSer, pSid)
    If (rc <> 1) Then
        Err.Raise -12, , "GetSID"
    End If
   
    rc = SetSecurityDescriptorOwner(SecDesc, pSid(0), 0)
    If (rc <> 1) Then
        Err.Raise -12, , "SetSecurityDescriptorOwner"
    End If
   
    ' I don't know why we had to do this one, but it works for us
    rc = SetSecurityDescriptorGroup(SecDesc, pSid(0), 0)
    If (rc <> 1) Then
        Err.Raise -12, , "SetSecurityDescriptorGroup"
    End If
   
    ' Getting SIDs for all the other users, and computing of total ACL length
    ' (famous formula from MSDN)
    Longueur = Len(tACL)
    ReDim Preserve pACESID((UBound(ACEList) - 1) / 2)
    For I = 0 To UBound(pACESID)
        If 1 <> GetSID(sServer, sDomain, CStr(ACEList(2 * I)), pACESID(I).x) Then Err.Raise -12, , "GetSID"
        Longueur = Longueur + GetLengthSid(pACESID(I).x(0)) + Len(tACCESS_ALLOWED_ACE) - 4
    Next I
   
    ' Initalizing ACL, and adding one ACE for each user
    ReDim pACL(Longueur)
    If 1 <> InitializeAcl(pACL(0), Longueur, ACL_REVISION) Then Err.Raise -12, , "InitializeAcl"
    For I = 0 To UBound(pACESID)
        If 1 <> AddAccessAllowedAce(pACL(0), ACL_REVISION, CLng(ACEList(2 * I + 1)), pACESID(I).x(0)) Then Err.Raise -12, , "AddAccessAllowedAce"
    Next I
    If 1 <> SetSecurityDescriptorDacl(SecDesc, 1, pACL(0), 0) Then Err.Raise -12, , "SetSecurityDescriptorDacl"
   
    ' Allocation and conversion in the self relative SD
    Longueur = GetSecurityDescriptorLength(SecDesc)
    ReDim sSelfSD(Longueur)
    If 1 <> MakeSelfRelativeSD(SecDesc, sSelfSD(0), Longueur) Then Err.Raise -12, , "MakeSelfRelativeSD"
    MakeSelfSD = 1
    Exit Function

SDError:
    MakeSelfSD = 0
End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''
'' GetSID -- gets the Security IDentifier for the specified account name
''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function GetSID(sServer As String, sDomain As String, sUserID As String, pSid() As Byte) As Long
Dim rc As Long
Dim pDomain() As Byte
Dim lSID As Long, lDomain As Long
Dim sSystem As String, sAccount As String

    On Error GoTo SIDError
   
    ReDim pSid(0)
    ReDim pDomain(0)
    lSID = 0
    lDomain = 0
    sSystem = "\\" & sServer
    sAccount = sDomain & "\" & sUserID
   
    rc = LookupAccountName(sSystem, sAccount, pSid(0), lSID, pDomain(0), lDomain, SidTypeUser)
   
    If (rc = 0) Then
        ReDim pSid(lSID)
        ReDim pDomain(lDomain + 1)

        rc = LookupAccountName(sSystem, sAccount, pSid(0), lSID, pDomain(0), lDomain, SidTypeUser)
        If (rc = 0) Then
            GoTo SIDError
        End If
    End If
   
    GetSID = 1
    Exit Function

SIDError:
    GetSID = 0
End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''
'' Get_Primary_DCName -- gets the name of the Primary Domain Controller for
''                      the NT domain
''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function Get_Primary_DCName(ByVal MName As String, ByVal DName As String) As String

Dim Result As Long
Dim DCName As String
Dim DCNPtr As Long
Dim DNArray() As Byte
Dim MNArray() As Byte
Dim DCNArray(100) As Byte

    MNArray = MName & vbNullChar
    DNArray = DName & vbNullChar
    Result = NetGetDCName(MNArray(0), DNArray(0), DCNPtr)
    If Result <> 0 Then
        Exit Function
    End If
    Result = PtrToStr(DCNArray(0), DCNPtr)
    Result = NetApiBufferFree(DCNPtr)
    DCName = DCNArray()
    Get_Primary_DCName = DCName
   
End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''
'' Get_Exchange_Sid -- gets the NT user's Security IDentifier for Exchange
''
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Get_Exchange_Sid(strNTDomain As String, strNTAccount As String, rbSID() As Byte)

Dim pSid(512) As Byte
Dim pDomain(512) As Byte
Dim IReturn As Long
Dim I As Integer
Dim NtDomain As String
NtDomain = strNTDomain
    IReturn = LookupAccountName(Get_Primary_DCName("", NtDomain), strNTAccount, pSid(0), 512, pDomain, 512, 1)
   
    For I = 0 To GetLengthSid(pSid(0)) - 1
        rbSID(2 * I) = AscB(Hex$(pSid(I) \ &H10))
        rbSID(2 * I + 1) = AscB(Hex$(pSid(I) Mod &H10))
    Next I
End Sub

5.将下列代码粘贴到NTUserManager类模块,注意修改默认属性
'类名:NTUserManager
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'              DECLARE VARIABLES
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Private MyScriptingContext As ScriptingContext
    Private MyRequest As Request
    Private MyResponse As Response
    Private MyServer As Server
  Dim txtDomain As String, txtAdmin As String
  Dim txtPassword As String, txtUserName As String
  Dim txtFirstName As String, txtLastName As String
  Dim txtNTServer As String
  Dim txtEMailAddress As String, txtExchServer As String
  Dim txtExchSite As String, txtExchOrganization As String
  Dim txtPwd As String, txtRealName As String
  Dim bIsOk As Boolean
   
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'                OnStartPage
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)

    Set MyScriptingContext = PassedScriptingContext
    Set MyRequest = MyScriptingContext.Request
    Set MyResponse = MyScriptingContext.Response
    Set MyServer = MyScriptingContext.Server
End Sub
Public Sub GetUserInfo()

    '~~~~~~~~~~~~~~~~~~ ERROR CODE ~~~~~~~~~~~~~~~~
'  On Error GoTo ErrorCode
    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
txtUserName = MyRequest.Form("UID")
txtPwd = MyRequest.Form("PWD")
txtRealName = MyRequest.Form("Name")
End Sub
Public Sub DeleteUser()
    Call Delete_Exchange_Mailbox(False, txtDomain, txtAdmin, _
                                txtPassword, txtUserName, txtExchServer, _
                                txtExchSite, txtExchOrganization)
    Call Delete_NT_Account(txtDomain, txtAdmin, txtPassword, txtUserName)
End Sub

Public Sub CreateUser()
    bIsOk = Create_NT_Account(txtDomain, txtAdmin, txtPassword, _
                          txtUserName, txtFirstName & txtLastName, _
                          txtNTServer, txtPwd, txtRealName)
                           
    If Not bIsOk Then Exit Sub
    bIsOk = Create_Exchange_MailBox(False, txtNTServer, txtDomain, txtAdmin, _
                                txtPassword, txtUserName, txtEMailAddress, _
                                txtFirstName, txtLastName, txtExchServer, _
                                txtExchSite, txtExchOrganization, txtPwd, txtRealName)
    If Not bIsOk Then Exit Sub
End Sub
Public Property Let Domain(ByVal vNewValue As Variant)
txtDomain = vNewValue
End Property

Public Property Let Admin(ByVal vNewValue As Variant)
txtAdmin = vNewValue
End Property

Public Property Let Password(ByVal vNewValue As Variant)
txtPassword = vNewValue
End Property

Public Property Let NTServer(ByVal vNewValue As Variant)
txtNTServer = vNewValue
End Property
Public Property Let EmailAddress(ByVal vNewValue As Variant)
txtEMailAddress = vNewValue
End Property

Public Property Let ExchServer(ByVal vNewValue As Variant)
txtExchServer = vNewValue
End Property

Public Property Let ExchSite(ByVal vNewValue As Variant)
txtExchSite = vNewValue
End Property

Public Property Let ExchOrganization(ByVal vNewValue As Variant)
txtExchOrganization = vNewValue
End Property
Private Sub Class_Initialize()
  txtDomain = "XX"  '此处该为主域名
  txtAdmin = "administrator"  '超级管理员帐号
  txtPassword = ""            '超级管理员密码
  txtNTServer = "XXserver"    '主域控制器主机名
  txtEMailAddress = "@sina.net" '邮件服务器域名
  txtExchServer = "XXserver"  'Exchange服务器的主机名
  txtExchSite = "XX"          'Exchange站点名称
  txtExchOrganization = "xxx"  'Exchange组织名称
  bIsOk = True
End Sub
Public Property Get IsOK() As Variant
IsOK = bIsOk
End Property

Public Sub ChangePwd(ByVal UID As String, ByVal oPwd As String, ByVal nPwd As String)
Dim o As IADsOpenDSObject
Dim usr As IADsUser

On Error GoTo ErrMsg

Set o = GetObject("WinNT:")
Set usr = o.OpenDSObject("WinNT://" & txtDomain & "/" & UID, UID, oPwd, 1)
usr.ChangePassword oPwd, nPwd
bIsOk = True
Exit Sub

ErrMsg:
bIsOk = False
End Sub

Public Sub ResetPwd(ByVal UID As String, ByVal nPwd As String)
Dim o As IADsOpenDSObject
Dim usr As IADsUser

On Error GoTo ErrMsg

Set o = GetObject("WinNT:")
Set usr = o.OpenDSObject("WinNT://" & txtDomain & "/" & UID & ",user", txtAdmin, txtPassword, 1)


usr.SetPassword nPwd
bIsOk = True
Exit Sub

ErrMsg:
bIsOk = False

End Sub
Public Sub Login(ByVal UID As String, ByVal Pwd As String)
Dim o As IADsOpenDSObject
Dim usr As IADsUser
Dim nPwd As String
On Error GoTo ErrMsg

Set o = GetObject("WinNT:")
Set usr = o.OpenDSObject("WinNT://" & txtDomain & "/" & UID & ",user", txtAdmin, txtPassword, 1)

nPwd = Pwd & "X"

usr.ChangePassword Pwd, nPwd
usr.SetPassword Pwd
bIsOk = True

Exit Sub

ErrMsg:
bIsOk = False

End Sub

6.编译工程
7.注册RbsBoxGen.dll或在Mts中注册

注:本单位主域控制器与Exchange服务器及WEB服务器为同一机器.

附:ASB示例
1申请邮箱
a>申请页面:UserAdd.htm
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>New Page 1</title>
<meta name="Microsoft Theme" content="mstheme1530 1111, default">
</head>

<body>

<form method="POST" action="UserAdd.asp" onsubmit="return FrontPage_Form1_Validator(this)" name="FrontPage_Form1">
  <p>帐号<input type="text" name="UID" size="20"></p>
  <p>密码<input type="text" name="PWD" size="20"></p>
  <p>姓名<input type="text" name="Name" size="20"><input type="submit" value="提交" name="B1"><input type="reset" value="全部重写" name="B2"></p>
</form>

</body>

</html>

b>响应文件UserAdd.asp
<HTML>
<head>
<meta name="Microsoft Theme" content="mstheme1530 1111, default">
</head>
<BODY>
<H1> </H1>
<%
 
  '  Variables
dim rbox
set rbox = Server.CreateObject("RbsBoxGen.NTUserManager")
'以下如果已在DLL的初始化事件中设置正确则无须设置,可提高安全性
'rbox.Domain="yourdomain"
'rbox.Admin="administrator"
'rbox.password="XXXXXX"
'rbox.Ntserver="yonrntserver"
'rbox.EmailAddress="@Xxx.xxx"
'rbox.ExchServer="yourExchangeServerName"
'rbox.ExchSite="yourExchangeSiteName"
'rbox.ExchOrganization="yourExchangeOrganizationName"
  rbox.getuserinfo
   
  rbox.CreateUser 
  'rbox.DeleteUser 

  if rbox.isok then
  set rbox = nothing
  response.write "注册成功!"
  else
  set rbox = nothing
  response.write "该用户名已被使用,请换一个名字再试!"
  end if
 

%>
</BODY>
</HTML>

2修改密码:
a>.密码修改页面CHPWD.htm
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>New Page 1</title>
<SCRIPT LANGUAGE="VBScript">
<!--
Sub cmdOk_OnClick
Dim TheForm
Set TheForm = Document.MyForm

opwd=trim(TheForm.opwd.Value)
npwd=trim(TheForm.npwd.Value)
cpwd=trim(TheForm.cpwd.Value)

if opwd="" then
  msgbox "请输入旧密码!"
  exit sub
end if

if npwd="" then
  msgbox "请输入新密码!"
  exit sub
end if
 
if cpwd="" then
  msgbox "请输入确认密码!"
  exit sub
end if

if npwd<>cpwd then
  msgbox "新密码与确认密码不一致!"
  exit sub
end if

if ucase(opwd)=ucase(npwd) then
msgbox "新密码不得与旧密码相同!"
exit sub
end if

if len(npwd)<3 then
msgbox "新密码长度不得小于3位!"
exit sub
end if

TheForm.submit

End Sub
//-->
</SCRIPT>


<meta name="Microsoft Theme" content="mstheme1530 1111, default">
</head>

<body>
<form method="POST" action="Chpwd.asp" name="myform" target="_self">
<div align="center">
  <center>
<table width="100%" height="100%"><tr>
    <td valign="middle" align="center">
<div align="center">
  <center>
<table width="256" height="100" cellspacing="0" cellpadding="0" border="1" bordercolor="#FFFFFF"><tr><td>
  <div align="center">
    <center>
    <table border="0" width="256" height="100" cellspacing="0" cellpadding="0" bgcolor="#C0C0C0">
      <tr>
        <td width="92"> </td>
        <td width="160" colspan="2"> </td>
      </tr>
    </center>
    <tr>
      <td width="92">
        <p align="center"><font size="3">旧 密 码:</font></td>
      <td width="160" colspan="2"><input type="password" name="oPwd" size="20"></td>
      </tr>
      <tr>
        <td width="92">
          <p align="center"><font size="3">新 密 码:</font></td>
        <td width="160" colspan="2"><input type="password" name="nPWD" size="20"></td>
      </tr>
      <tr>
        <td width="92">
          <p align="center"><font size="3">确认密码:</font></td>
        <td width="160" colspan="2"><input type="password" name="cPwd" size="20"></td>
      </tr>
      <tr>
        <td width="92"> </td>
        <td width="160" colspan="2">
          <p align="center"> </td>
      </tr>
      <tr>
        <td width="92"> </td>
        <td width="80">
          <p align="center"><input type="button" value="确定" name="cmdOK"></p>
        </td>
        <td width="80">
          <p align="center"><input type="button" value="取消" name="Cancel" onclick="JavaScript:history.back();"></td>
      </tr>
      <tr>
        <td width="92"> </td>
        <td width="80"> </td>
        <td width="80"> </td>
      </tr>
    </table>
  </div>
</td></tr></table> 
  </center>
</div></tr></table>
  </center>
</div>
</form>
</body>

</html>

b>响应文件CHPWD.asp
<HTML>

<head>
<meta name="Microsoft Theme" content="mstheme1530 1111, default">
</head>

<BODY>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
  <tr>
    <td width="100%" height="100%" align="center" valign="middle">
<%
 
  '  Variables
  dim rbox

  uid=session("SID_UID")
  opwd=request.form("opwd")
  npwd=request.form("npwd")
  cpwd=request.form("cpwd")
 
  if opwd="" then
  response.write "请输入旧密码!"
  response.end
  end if

if npwd="" then
  response.write "请输入新密码!"
  response.end
end if
 
if cpwd="" then
  response.write "请输入确认密码!"
  response.end
end if

if npwd<>cpwd then
  response.write "新密码与确认密码不一致!"
  response.end
end if

if ucase(opwd)=ucase(npwd) then
response.write "新密码不得与旧密码相同!"
response.end
end if

if len(npwd)<3 then
response.write "新密码长度不得小于3位!"
response.end
end if

set rbox = Server.CreateObject("RbsBoxGen.NTUserManager")

' rbox.ResetPwd uid,npwd 
' rbox.Login uid,npwd
  rbox.ChangePwd uid,opwd,npwd
   
  if rbox.isok then
  set rbox = nothing
  response.write "密码更改成功!"
  else
  set rbox = nothing
  response.write "旧密码输入错误!"
  end if
response.end 

%>
</td>
  </tr>
</table>
</BODY>
</HTML>

3.登陆验证(ASP):
dim rbox
set rbox = Server.CreateObject("RbsBoxGen.NTUserManager")
'以下如果已在DLL的初始化事件中设置正确则无须设置,可提高安全性
'rbox.Domain="yourdomain"
'rbox.Admin="administrator"
'rbox.password="XXXXXX"
'rbox.Ntserver="yonrntserver"
'rbox.EmailAddress="@Xxx.xxx"
'rbox.ExchServer="yourExchangeServerName"
'rbox.ExchSite="yourExchangeSiteName"
'rbox.ExchOrganization="yourExchangeOrganizationName"


rbox.Login name,pass  'name:待验证的用户帐号,Pass:用户密码
Login=cbool(rbox.isok)  '如果rbox.isok为真,验证通过.
set rbox = nothing
if Not Login then
  response.redirect Request.ServerVariables("HTTP_REFERER")
  response.end
end if

,
相关文章 热门文章
  • 精通Windows Server 2008 多元密码策略之ADSIEDIT篇
  • AD & ADSI入门
  • ADSI和EXCHANGE结合的示范代码
  • Exchange 2000 Server 常见问题(四)
  • Exchange 2000 Server 常见问题(一)
  • Exchange 2000 Server 常见问题(三)
  • Exchange 2000 Server 常见问题(五)
  • Exchange 2000 Server 常见问题(二)
  • 部署Exchange Server 2003问题集(1)
  • Telnet到端口25以测试SMTP通信
  • 限制Exchange用户从Internet收发邮件
  • Exchange Server管理与设定(一)
  • 使用Exchange 2000 Server 构建多域名邮件系统
  • 虚拟内存碎片的检测和EXCHANGE的内存优化
  • Exchange Server 公用程序(一)
  • 自由广告区
     
    最新软件下载
  • SharePoint Server 2010 部署文档
  • Exchange 2010 RTM升级至SP1 教程
  • Exchange 2010 OWA下RBAC实现的组功能...
  • Lync Server 2010 Standard Edition 标..
  • Lync Server 2010 Enterprise Edition...
  • Forefront Endpoint Protection 2010 ...
  • Lync Server 2010 Edge 服务器部署文档
  • 《Exchange 2003专家指南》
  • Mastering Hyper-V Deployment
  • Windows Server 2008 R2 Hyper-V
  • Microsoft Lync Server 2010 Unleashed
  • Windows Server 2008 R2 Unleashed
  • 今日邮件技术文章
  • 腾讯,在创新中演绎互联网“进化论”
  • 华科人 张小龙 (中国第二代程序员 QQ...
  • 微软推出新功能 提高Hotmail密码安全性
  • 快压技巧分享:秒传邮件超大附件
  • 不容忽视的邮件营销数据分析过程中的算..
  • 国内手机邮箱的现状与未来发展——访尚..
  • 易观数据:2011Q2中国手机邮箱市场收入..
  • 穿越时空的爱恋 QQ邮箱音视频及贺卡邮件
  • Hotmail新功能:“我的朋友可能被黑了”
  • 入侵邻居网络发骚扰邮件 美国男子被重..
  • 网易邮箱莫子睿:《非你莫属》招聘多过..
  • 中国电信推广189邮箱绿色账单
  • 最新专题
  • 鸟哥的Linux私房菜之Mail服务器
  • Exchange Server 2010技术专题
  • Windows 7 技术专题
  • Sendmail 邮件系统配置
  • 组建Exchange 2003邮件系统
  • Windows Server 2008 专题
  • ORF 反垃圾邮件系统
  • Exchange Server 2007 专题
  • ISA Server 2006 教程专题
  • Windows Vista 技术专题
  • “黑莓”(BlackBerry)专题
  • Apache James 专题
  • 分类导航
    邮件新闻资讯:
    IT业界 | 邮件服务器 | 邮件趣闻 | 移动电邮
    电子邮箱 | 反垃圾邮件|邮件客户端|网络安全
    行业数据 | 邮件人物 | 网站公告 | 行业法规
    网络技术:
    邮件原理 | 网络协议 | 网络管理 | 传输介质
    线路接入 | 路由接口 | 邮件存储 | 华为3Com
    CISCO技术 | 网络与服务器硬件
    操作系统:
    Windows 9X | Linux&Uinx | Windows NT
    Windows Vista | FreeBSD | 其它操作系统
    邮件服务器:
    程序与开发 | Exchange | Qmail | Postfix
    Sendmail | MDaemon | Domino | Foxmail
    KerioMail | JavaMail | Winwebmail |James
    Merak&VisNetic | CMailServer | WinMail
    金笛邮件系统 | 其它 |
    反垃圾邮件:
    综述| 客户端反垃圾邮件|服务器端反垃圾邮件
    邮件客户端软件:
    Outlook | Foxmail | DreamMail| KooMail
    The bat | 雷鸟 | Eudora |Becky! |Pegasus
    IncrediMail |其它
    电子邮箱: 个人邮箱 | 企业邮箱 |Gmail
    移动电子邮件:服务器 | 客户端 | 技术前沿
    邮件网络安全:
    软件漏洞 | 安全知识 | 病毒公告 |防火墙
    攻防技术 | 病毒查杀| ISA | 数字签名
    邮件营销:
    Email营销 | 网络营销 | 营销技巧 |营销案例
    邮件人才:招聘 | 职场 | 培训 | 指南 | 职场
    解决方案:
    邮件系统|反垃圾邮件 |安全 |移动电邮 |招标
    产品评测:
    邮件系统 |反垃圾邮件 |邮箱 |安全 |客户端
    广告联系 | 合作联系 | 关于我们 | 联系我们 | 繁體中文
    版权所有:邮件技术资讯网©2003-2010 www.5dmail.net, All Rights Reserved
    www.5Dmail.net Web Team   粤ICP备05009143号