标题: [求助]再次请教EXCHANG如何实现自动申请帐号? [打印本页] 作者: zlb4779 时间: 2005-7-30 16:41 标题: [求助]再次请教EXCHANG如何实现自动申请帐号? 上次发的贴不知何原因不见了。只好再次请教。斑竹不要嫌烦奥!!!!!作者: 85501188 时间: 2005-7-30 22:20 标题: re:基于ADSI的NT帐号及Exchange... 基于ADSI的NT帐号及Exchange Server帐号申请及验证模块源代码<br>
<br>
1.安装ADSI2.5<br>
2.创建一个新的ActiveX DLL工程,工程名:RbsBoxGen,类名:NTUserManager<br>
3.执行工程-引用将下列库选上:<br>Active DS Type Library <br>Microsoft Active Server Pages Object Library <br>
4.添加一个模块,代码如下:<br>
'模块<br>
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br>
''<br>
'' ADSI Sample to create and delete Exchange 5.5 Mailboxes<br>
''<br>
'' Richard Ault, Jean-Philippe Balivet, Neil Wemple -- 1998<br>
''<br>
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br>
Option Explicit<br>
<br>
' Mailbox property settings<br>
Public Const LOGON_CMD = "logon.cmd"<br>
Public Const INCOMING_MESSAGE_LIMIT = 1000<br>
Public Const OUTGOING_MESSAGE_LIMIT = 1000<br>
Public Const WARNING_STORAGE_LIMIT = 8000<br>
Public Const SEND_STORAGE_LIMIT = 12000<br>
Public Const REPLICATION_SENSITIVITY = 20<br>
Public Const COUNTRY = "US"<br>
<br>
' Mailbox rights for Exchange security descriptor (home made)<br>
Public Const RIGHT_MODIFY_USER_ATTRIBUTES = &H2<br>
Public Const RIGHT_MODIFY_ADMIN_ATTRIBUTES = &H4<br>
Public Const RIGHT_SEND_AS = &H8<br>
Public Const RIGHT_MAILBOX_OWNER = &H10<br>
Public Const RIGHT_MODIFY_PERMISSIONS = &H80<br>
Public Const RIGHT_SEARCH = &H100<br>
<br>
' win32 constants for security descriptors (from VB5 API viewer)<br>
Public Const ACL_REVISION = (2)<br>
Public Const SECURITY_DESCRIPTOR_REVISION = (1)<br>
Public Const SidTypeUser = 1<br>
<br>
Type ACL<br>AclRevision As Byte<br>Sbz1 As Byte<br>AclSize As Integer<br>AceCount As Integer<br>Sbz2 As Integer<br>
End Type<br>
<br>
Type ACE_HEADER<br>AceType As Byte<br>AceFlags As Byte<br>AceSize As Long<br>
End Type<br>
<br>
Type ACCESS_ALLOWED_ACE<br>Header As ACE_HEADER<br>Mask As Long<br>SidStart As Long<br>
End Type<br>
<br>
Type SECURITY_DESCRIPTOR<br>Revision As Byte<br>Sbz1 As Byte<br>Control As Long<br>Owner As Long<br>Group As Long<br>Sacl As ACL<br>Dacl As ACL<br>
End Type<br>
<br>
' Just an help to allocate the 2dim dynamic array<br>
Private Type mySID<br>x() As Byte<br>
End Type<br>
<br>
<br>
' Declares : modified from VB5 API viewer<br>
Declare Function InitializeSecurityDescriptor Lib "advapi32.dll" _<br>(pSecurityDescriptor As SECURITY_DESCRIPTOR, _<br>ByVal dwRevision As Long) As Long<br>
<br>
Declare Function SetSecurityDescriptorOwner Lib "advapi32.dll" _<br>(pSecurityDescriptor As SECURITY_DESCRIPTOR, _<br>pOwner As Byte, _<br>ByVal bOwnerDefaulted As Long) As Long<br>
<br>
Declare Function SetSecurityDescriptorGroup Lib "advapi32.dll" _<br>(pSecurityDescriptor As SECURITY_DESCRIPTOR, _<br>pGroup As Byte, _<br>ByVal bGroupDefaulted As Long) As Long<br>
<br>
Declare Function SetSecurityDescriptorDacl Lib "advapi32.dll" _<br>(pSecurityDescriptor As SECURITY_DESCRIPTOR, _<br>ByVal bDaclPresent As Long, _<br>pDacl As Byte, _<br>ByVal bDaclDefaulted As Long) As Long<br>
<br>
Declare Function SetSecurityDescriptorSacl Lib "advapi32.dll" _<br>(pSecurityDescriptor As SECURITY_DESCRIPTOR, _<br>ByVal bSaclPresent As Long, _<br>pSacl As Byte, _<br>ByVal bSaclDefaulted As Long) As Long<br>
<br>
Declare Function MakeSelfRelativeSD Lib "advapi32.dll" _<br>(pAbsoluteSecurityDescriptor As SECURITY_DESCRIPTOR, _<br>pSelfRelativeSecurityDescriptor As Byte, _<br>ByRef lpdwBufferLength As Long) As Long<br>
<br>
Declare Function GetSecurityDescriptorLength Lib "advapi32.dll" _<br>(pSecurityDescriptor As SECURITY_DESCRIPTOR) As Long<br>
<br>
Declare Function IsValidSecurityDescriptor Lib "advapi32.dll" _<br>(pSecurityDescriptor As Byte) As Long<br>
<br>
Declare Function InitializeAcl Lib "advapi32.dll" _<br>(pACL As Byte, _<br>ByVal nAclLength As Long, _<br>ByVal dwAclRevision As Long) As Long<br>
<br>
Declare Function AddAccessAllowedAce Lib "advapi32.dll" _<br>(pACL As Byte, _<br>ByVal dwAceRevision As Long, _<br>ByVal AccessMask As Long, _<br>pSid As Byte) As Long<br>
<br>
Declare Function IsValidAcl Lib "advapi32.dll" _<br>(pACL As Byte) As Long<br>
<br>
Declare Function GetLastError Lib "kernel32" _<br>() As Long<br>
<br>
Declare Function LookupAccountName Lib "advapi32.dll" _<br>Alias "LookupAccountNameA" _<br>(ByVal IpSystemName As String, _<br>ByVal IpAccountName As String, _<br>pSid As Byte, _<br>cbSid As Long, _<br>ByVal ReferencedDomainName As String, _<br>cbReferencedDomainName As Long, _<br>peUse As Integer) As Long<br>
<br>
Declare Function NetGetDCName Lib "NETAPI32.DLL" _<br>(ServerName As Byte, _<br>DomainName As Byte, _<br>DCNPtr As Long) As Long<br><br>
Declare Function NetApiBufferFree Lib "NETAPI32.DLL" _<br>(ByVal Ptr As Long) As Long<br><br>
Declare Function PtrToStr Lib "kernel32" _<br>Alias "lstrcpyW" (RetVal As Byte, ByVal Ptr As Long) As Long<br>
<br>
Declare Function GetLengthSid Lib "advapi32.dll" _<br>(pSid As Byte) As Long<br>
<br>
<br>
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br>
''<br>
'' Create_NT_Account() -- creates an NT user account<br>
''<br>
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br>
Public Function Create_NT_Account(strDomain As String, _<br>strAdmin As String, _<br>strPassword As String, _<br>UserName As String, _<br>FullName As String, _<br>NTServer As String, _<br>strPwd As String, _<br>strRealName As String) As Boolean<br>
<br>
Dim oNS As IADsOpenDSObject<br>
Dim User As IADsUser<br>
Dim Domain As IADsDomain<br>
<br>On Error GoTo Create_NT_Account_Error<br>
<br>Create_NT_Account = False<br><br>If (strPassword = "") Then<br>strPassword = ""<br>End If<br><br>Set oNS = GetObject("WinNT:")<br>Set Domain = oNS.OpenDSObject("WinNT://" & strDomain, strDomain & "\" & strAdmin, strPassword, 0)<br><br>Set User = Domain.Create("User", UserName)<br>With User<br>.Description = "ADSI 创建的用户"<br>.FullName = strRealName 'FullName<br>'.HomeDirectory = "\\" & NTServer & "\" & UserName<br>'.LoginScript = LOGON_CMD<br>.SetInfo<br>' First password = username<br>.SetPassword strPwd<br>End With<br><br>Debug.Print "Successfully created NT Account for user " & UserName<br>Create_NT_Account = True<br>Exit Function<br>
<br>
Create_NT_Account_Error:<br>Create_NT_Account = False<br>Debug.Print "Error 0x" & CStr(Hex(Err.Number)) & " occurred creating NT account for user " & UserName<br>
<br>
End Function<br>
<br>
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br>
''<br>
'' Delete_NT_Account() -- deletes an NT user account<br>
''<br>
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br>
Public Function Delete_NT_Account(strDomain As String, _<br>strAdmin As String, _<br>strPassword As String, _<br>UserName As String _<br>) As Boolean<br>
<br>
Dim Domain As IADsDomain<br>
Dim oNS As IADsOpenDSObject<br>
<br>On Error GoTo Delete_NT_Account_Error<br><br>Delete_NT_Account = False<br><br>If (strPassword = "") Then<br>strPassword = ""<br>End If<br>
<br>Set oNS = GetObject("WinNT:")<br>Set Domain = oNS.OpenDSObject("WinNT://" & strDomain, strDomain & "\" & strAdmin, strPassword, 0)<br><br>Domain.Delete "User", UserName<br><br>Debug.Print "Successfully deleted NT Account for user " & UserName<br>Delete_NT_Account = True<br>Exit Function<br><br>
Delete_NT_Account_Error:<br><br>Debug.Print "Error 0x" & CStr(Hex(Err.Number)) & " occurred deleting NT account for user " & UserName<br><br>
End Function<br>
<br>
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br>
''<br>
'' Create_Exchange_Mailbox() -- creates an Exchange mailbox, sets mailbox<br>
'' properties and and associates the mailbox with<br>
'' an existing NT user account<br>
''<br>
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''<br>
Public Function Create_Exchange_MailBox( _<br>IsRemote As Boolean, _<br>strServer As String, _<br>strDomain As String, _<br>strAdmin As String, _<br>strPassword As String, _<br>UserName As String, _<br>EmailAddress As String, _<br>strFirstName As String, _<br>strLastName As String, _<br>ExchangeServer As String, _<br>ExchangeSite As String, _<br>ExchangeOrganization As String, _<br>strPwd As String, _<br>strRealName As String) As Boolean<br>
<br>
<br>
Dim Container As IADsContainer<br>
Dim strRecipContainer As String<br>
Dim Mailbox As IADs<br>
Dim rbSID(1024) As Byte<br>
Dim OtherMailBox() As Variant<br>
Dim sSelfSD() As Byte<br>
Dim encodedSD() As Byte<br>
Dim I As Integer<br>
<br>
Dim oNS As IADsOpenDSObject<br>
<br>On Error GoTo Create_Exchange_MailBox_Error<br><br>Create_Exchange_MailBox = False<br><br>If (strPassword = "") Then<br>strPassword = ""<br>End If<br>
<br>' Recipients container for this server<br>strRecipContainer = "LDAP://" & ExchangeServer & _<br>"/CN=Recipients,OU=" & ExchangeSite & _<br>",O=" & ExchangeOrganization<br>Set oNS = GetObject("LDAP:")<br>Set Container = oNS.OpenDSObject(strRecipContainer, "cn=" & strAdmin & ",dc=" & strDomain, strPassword, 0)<br><br>' This creates both mailboxes or remote dir entries<br>If IsRemote Then<br>Set Mailbox = Container.Create("Remote-Address", "CN=" & UserName)<br>Mailbox.Put "Target-Address", EmailAddress<br>Else<br>Set Mailbox = Container.Create("OrganizationalPerson", "CN=" & UserName) '<br>Mailbox.Put "MailPreferenceOption", 0<br>End If<br><br>With Mailbox<br>.SetInfo<br><br>' As an example two other addresses<br>ReDim OtherMailBox(1)<br>OtherMailBox(0) = "MS$" & ExchangeOrganization & _<br>"/" & ExchangeSite & _<br>"/" & UserName<br><br>OtherMailBox(1) = "CCMAIL$" & UserName & _<br>" at " & ExchangeSite<br><br>If Not (IsRemote) Then<br>' Get the SID of the previously created NT user<br>Get_Exchange_Sid strDomain, UserName, rbSID<br>.Put "Assoc-NT-Account", rbSID<br>' This line also initialize the "Home Server" parameter of the Exchange admin<br>.Put "Home-MTA", "cn=Microsoft MTA,cn=" & ExchangeServer & ",cn=Servers,cn=Configuration,ou=" & ExchangeSite & ", o = " & ExchangeOrganization<br>.Put "Home-MDB", "cn=Microsoft Private MDB,cn=" & ExchangeServer & ",cn=Servers,cn=Configuration,ou=" & ExchangeSite & ",o=" & ExchangeOrganization<br>.Put "Submission-Cont-Length", OUTGOING_MESSAGE_LIMIT<br>.Put "MDB-Use-Defaults", False<br>.Put "MDB-Storage-Quota", WARNING_STORAGE_LIMIT<br>.Put "MDB-Over-Quota-Limit", SEND_STORAGE_LIMIT<br>.Put "MAPI-Recipient", True<br><br>' Security descriptor<br>' The rights choosen make a normal user role<br>' The other user is optionnal, delegate for ex.<br><br>Call MakeSelfSD(sSelfSD, _<br>strServer, _<br>strDomain, _<br>UserName, _<br>UserName, _<br>RIGHT_MAILBOX_OWNER + RIGHT_SEND_AS + _<br>RIGHT_MODIFY_USER_ATTRIBUTES _<br>)<br>
<br>ReDim encodedSD(2 * UBound(sSelfSD) + 1)<br>For I = 0 To UBound(sSelfSD) - 1<br>encodedSD(2 * I) = AscB(Hex$(sSelfSD(I) \ &H10))<br>encodedSD(2 * I + 1) = AscB(Hex$(sSelfSD(I) Mod &H10))<br>Next I<br><br>.Put "NT-Security-Descriptor", encodedSD<br>Else<br><br>ReDim Preserve OtherMailBox(2)<br>OtherMailBox(2) = EmailAddress<br>.Put "MAPI-Recipient", False<br>End If<br><br>' Usng PutEx for array properties<br>.PutEx ADS_PROPERTY_UPDATE, "otherMailBox", OtherMailBox<br><br>.Put "Deliv-Cont-Length", INCOMING_MESSAGE_LIMIT<br>' i : initials<br>.Put "TextEncodedORaddress", "c=" & COUNTRY & _<br>";a= " & _<br>";p=" & ExchangeOrganization & _<br>";o=" & ExchangeSite & _<br>";s=" & strLastName & _<br>";g=" & strFirstName & _<br>";i=" & Mid(strFirstName, 1, 1) & Mid(strLastName, 1, 1) & ";"<br><br>.Put "rfc822MailBox", UserName & "@" & ExchangeSite & "." & ExchangeOrganization & ".com"<br>.Put "Replication-Sensitivity", REPLICATION_SENSITIVITY<br>.Put "uid", UserName<br>.Put "name", UserName<br>
<br>' .Put "GivenName", strFirstName<br>' .Put "Sn", strLastName<br>.Put "Cn", strRealName 'strFirstName & " " & UserName 'strLastName<br>' .Put "Initials", Mid(strFirstName, 1, 1) & Mid(strLastName, 1, 1)<br><br>' Any of these fields are simply descriptive and optional, not included in<br>' this sample and there are many other fields in the mailbox<br>.Put "Mail", EmailAddress<br>'If 0 < Len(Direction) Then .Put "Department", Direction<br>'If 0 < Len(FaxNumber) Then .Put "FacsimileTelephoneNumber", FaxNumber<br>'If 0 < Len(City) Then .Put "l", City<br>'If 0 < Len(Address) Then .Put "PostalAddress", Address<br>'If 0 < Len(PostalCode) Then .Put "PostalCode", PostalCode<br>'If 0 < Len(Banque) Then .Put "Company", Banque<br>'If 0 < Len(PhoneNumber) Then .Put "TelephoneNumber", PhoneNumber<br>'If 0 < Len(Title) Then .Put "Title", Title<br>'If 0 < Len(AP1) Then .Put "Extension-Attribute-1", AP1<br>'If 0 < Len(Manager) Then .Put "Extension-Attribute-2", Manager<br>'If 0 < Len(Agence) Then .Put "Extension-Attribute-3", Agence<br>'If 0 < Len(Groupe) Then .Put "Extension-Attribute-4", Groupe<br>'If 0 < Len(Secteur) Then .Put "Extension-Attribute-5", Secteur<br>'If 0 < Len(Region) Then .Put "Extension-Attribute-6", Region<br>'If 0 < Len(GroupeBanque) Then .Put "Extension-Attribute-7", GroupeBanque<br>'If 0 < Len(AP7) Then .Put "Extension-Attribute-8", AP7<br>'If 0 < Len(AP8) Then .Put "Extension-Attribute-9", AP8<br>.SetInfo<br>End With<br><br>Debug.Print "Successfully created mailbox for user " & UserName<br>Create_Exchange_MailBox = True<br>Exit Function<br>
<br>
Create_Exchange_MailBox_Error:<br>Create_Exchange_MailBox = False<br>Debug.Print "Error 0x" & CStr(Hex(Err.Number)) & " occurred creating Mailbox for user " & UserName<br><br>
End Function<br>
<br>
连下贴。。。。。。。。作者: zlb4779 时间: 2005-7-31 09:03 标题: re:大恩不言谢。你就是及时雨啊!!!!!... 大恩不言谢。你就是及时雨啊!!!!!<br>
我试试先。