Exemple de script utilisant l'interface ADSI pour réassocier des boîtes aux lettres Exchange

 

Dernière rubrique modifiée : 2005-10-13

L'exemple de script Microsoft Visual Basic® suivant peut également être utilisé pour réassocier des boîtes aux lettres Exchange d'une base de données à une autre.

Vous pouvez copier et coller le code suivant dans un nouveau fichier texte et l'enregistrer sous le nom Rest.vbs dans un dossier temporaire appelé Restauration. Pour exécuter ce script à partir d'une invite de commandes, ouvrez le dossier Restauration et exécutez la commande suivante :

cscript rest.vbs

Dans cet exemple, le script modifie les attributs suivants :

  • msExchHomeServerName
  • homeMDB
  • HomeMTA

Vous pouvez entrer ces trois attributs directement ou lors de l'exécution du script. Pour entrer ces informations lors de l'exécution du script, supprimez la ligne de commande du script.

    'Begin Script

Option Explicit
    
    Dim oRootDSE
    Dim strNamingContext
    Dim strConfigurationNamingContext
    Dim oConnection 
    Dim oCmd
    Dim strADOQuery 
    Dim strAttributes 
    Dim strFilter 
    Dim oRecordSet 
    Dim oField 
    Dim usr
    Dim UserPath
    
    Dim NewOrganizationName
    Dim OldOrganizationName
    Dim OldServerName 
    Dim NewServerName 
    Dim OldAdminGroupName
    Dim NewAdminGroupName
    Dim OldStorageGroupName
    Dim NewStorageGroupName
    Dim OldBaseName
    Dim NewBaseName
    Dim OldMTAServerName
    Dim NewMTAServerName
    
    Dim value
    ReDim strArgumentArray(0)
    Dim i, iReturnCode
    Dim fInteractiveMode, fTrialMode, iSuccessCount, iFailureCount, iRecordCount
    
    fInteractiveMode = False
    fTrialMode = False
    iSuccessCount = 0
    iFailureCount = 0
    iRecordCount = 0
    
    
    For i = 0 to Wscript.arguments.count - 1
        ReDim Preserve strArgumentArray(i)
        strArgumentArray(i) = Wscript.arguments.item(i)
    Next
    
    
    For i = 0 to Wscript.arguments.count - 1
      Select case Left(LCase(strArgumentArray(i)),2) 
        case "/i"
          fInteractiveMode = True    
        case "/t"
          fTrialMode = True      
      End Select
    Next
    
    If fInteractiveMode = False Then
    
    '***********************************************************
    '****** Modify this section for your Parameters ************
    '***********************************************************
    
      OldOrganizationName = "Contoso Corp"
      NewOrganizationName = "Contoso Corp"
    
      OldServerName = "CONTOSO-01"
      NewServerName = "CONTOSO-02"
    
      OldAdminGroupName  = "First Administrative Group"
      NewAdminGroupName  = "First Administrative Group"
    
      OldStorageGroupName = "First Storage Group"
      NewStorageGroupName = "First Storage Group"
    
      OldBaseName = "Mailbox Store (CONTOSO-01)"
      NewBaseName = "Mailbox Store (CONTOSO-02)"
    
      OldMTAServerName = "CONTOSO-01"
      NewMTAServerName = "CONTOSO-02"
    
    '*************************************************************
    '************** Parameter Section End ************************
    '**************************************************************
      
      Trace("You are running in batch mode.  The parameters are:")
      
    Else
      ' Get information
      OldOrganizationName = Trim(InputBox("Type the name of the old Exchange Organization : ", "Information"))
      NewOrganiZationName = Trim(InputBox("Type the name of the new Exchange Organization : ", "Information"))
    
      OldServerName = Trim(InputBox("Type the name of the old Exchange server : ", "Information"))
      NewServerName = Trim(InputBox("Type the name of the new Exchange server : ", "Information"))
    
      OldAdminGroupName = Trim(InputBox("Type the name of the old administrative group : ", "Information"))
      NewAdminGroupName = Trim(InputBox("Type the name of the new administrative group : ", "Information"))
    
      OldStorageGroupName = Trim(InputBox("Type the name of the old Storage group : ", "Information"))
      NewStorageGroupName = Trim(InputBox("Type the name of the new Storage group : ", "Information"))
    
      OldBaseName = Trim(InputBox("Type the name of the old database name : ", "Information"))
      NewBaseName = Trim(InputBox("Type the name of the new database name : ", "Information"))
    
      OldMTAServerName = Trim(InputBox("Type the name of the old MTA Server : ", "Information"))
      NewMTAServerName = Trim(InputBox("Type the name of the new MTA Server : ", "Information"))
    
      Trace("Your parameters are:")
      
    End If
    
    '--- Get the Naming Context ----
    Set oRootDSE = GetObject("LDAP://RootDSE")
    strNamingContext = oRootDSE.Get("defaultNamingContext")
    strConfigurationNamingContext = oRootDSE.Get("configurationNamingContext")
    Set oRootDSE = Nothing
    
    Trace("Targetted Domain: " & vbTab & strNamingContext)
    Trace("Configuration Naming Context: " & vbTab & strConfigurationNamingContext)
    Trace("Old Organization Name: " & vbTab & OldOrganizationName)
    Trace("New Organization Name: " & vbTab & NewOrganizationName)
    Trace("Old Server Name:" & vbTab & OldServerName)
    Trace("New Server Name:" & vbTab & NewServerName)  
    Trace("Old AdminGroup Name:" & vbTab & OldAdminGroupName)
    Trace("New AdminGroup Name:" & vbTab & NewAdminGroupName)
    Trace("Old Storage Group Name:" & vbTab & OldStorageGroupName)
    Trace("New Storage Group Name:" & vbTab & NewStorageGroupName)  
    Trace("Old Base Name:" & vbTab & OldBaseName)
    Trace("New Base Name:" & vbTab & NewBaseName)
    Trace("Old MTA Server Name:" & vbTab & OldMTAServerName)
    Trace("New MTA Server Name:" & vbTab & NewMTAServerName)  
    
    iReturnCode = MsgBox("Is the information correct?", vbYesNo, "Confirmation")
    If iReturnCode = vbNo Then
      If fInteractiveMode = False Then
        MsgBox "Please open the VBScript with a text editor and modify the parameters", vbOKOnly, "Exit"
        Trace("Please open the VBScript with a text editor and modify the parameters")
        Wscript.Quit 0
      End If
    End If
    If fTrialMode = False Then
      iReturnCode = MsgBox("Would you like to perform a trial run of the operation instead of doing a real update?", vbYesNo, "Confirmation")
      If iReturnCode = vbYes Then
        fTrialMode = True
      End If
    End If
    If fTrialMode = True Then
      Trace ("********************************************************")
      Trace ("***   You are running in Trial Mode only             ***")
      Trace ("***   Information in Active Directory will not be updated          ***")
      Trace ("********************************************************")
    End If
      
    
    ' --- Get a filter from the user ---
    Trace("")
    'strFilter = "(msExchHomeServerName=/o=" + OldOrganizationName + "/ou=" + OldAdminGroupName + "/cn=Configuration/cn=Servers/cn=" + OldServerName + ")"
    'Trace("LDAP Filter = " + strFilter)
    strFilter = "(homeMDB=" + "CN=" + OldBaseName + ",CN=" + OldStorageGroupName + ",CN=InformationStore,CN=" + OldServerName + ",CN=Servers,CN=" + OldAdminGroupName + ",CN=Administrative Groups,CN=" + OldOrganizationName + ",CN=Microsoft Exchange,CN=Services,"+ strConfigurationNamingContext + ")"
    Trace("LDAP Filter = " + strFilter)
    
    '  --- Define the attributes to be returned from the query ---
    strAttributes = "name,distinguishedName,msExchHomeServerName,homeMDB,homeMTA"
    
    '--- Set up the connection ---
    Set oConnection = CreateObject("ADODB.Connection")
    Set oCmd = CreateObject("ADODB.Command")
    oConnection.Provider = "ADsDSOObject"
    oConnection.Open "ADs Provider"
    Set oCmd.ActiveConnection = oConnection
    
    '--- Build the query string ---
    strADOQuery = "<LDAP://" + strNamingContext + ">;(&(objectCategory=person)(objectClass=user)" + strFilter + ");" + strAttributes + ";subtree"
    oCmd.CommandText = strADOQuery
    oCmd.Properties("Page Size") = 1000
    oCmd.Properties("Timeout") = 1000
    oCmd.Properties("Cache Results") = False 
    
    '--- Run the query for the user in the directory ---
    Set oRecordSet = oCmd.Execute
    If oRecordSet.EOF Then
      Trace("No Matching Users.  Program Aborted") 
      Wscript.Quit 1
    End If
    
    While Not oRecordSet.EOF
      Trace("")
      Trace("---------------------------------------------------------------------------")
      Trace("---------------------------------------------------------------------------")
      Trace("---------------------------------------------------------------------------")
      Trace("Work to : "+oRecordSet.Fields(0) + vbTab + oRecordSet.Fields(1))
      Trace("-----------------------------------------------")
      Trace("")
      Set usr = GetObject("LDAP://"+oRecordSet.Fields(1))
    
      ' Modify msExchHomeServerName attribute
      value = usr.Get("msExchHomeServerName")
      Trace("OLD msExchHomeServerName = "+value)
      Trace("-----------------------")
      value = "/o=" + NewOrganizationName + "/ou=" + NewAdminGroupName + "/cn=Configuration/cn=Servers/cn=" + NewServerName
      usr.Put "msExchHomeServerName", value
      Trace("NEW msExchHomeServerName = "+value)
      Trace("-----------------------------------------------")
    
      ' Modify homeMDB attribute
      value = usr.Get("homeMDB")
      Trace("OLD homeMDB = "+value)
      Trace("-----------------------")
      value = "CN=" + NewBaseName + ",CN=" + NewStorageGroupName + ",CN=InformationStore,CN=" + NewServerName + ",CN=Servers,CN=" + NewAdminGroupName + ",CN=Administrative Groups,CN=" + NewOrganizationName + ",CN=Microsoft Exchange,CN=Services,"+ strConfigurationNamingContext
      usr.Put "homeMDB", value
      Trace("NEW homeMDB = "+value)
      Trace("-----------------------------------------------")
    
      ' Modify homeMTA attribute
      value = usr.Get("homeMTA")
      Trace("OLD homeMTA = "+value)
      Trace("-----------------------")
      value = "CN=Microsoft MTA,CN=" + NewMTAServerName + ",CN=Servers,CN=" + NewAdminGroupName + ",CN=Administrative Groups,CN=" + NewOrganizationName + ",CN=Microsoft Exchange,CN=Services," + strConfigurationNamingContext
      usr.Put "homeMTA", value
      Trace("NEW homeMTA = "+value)
      Trace("-----------------------------------------------")
    
      On Error Resume Next 
      If fTrialMode = False Then
        usr.SetInfo
        If Err.Number Then
          Trace("")
          Trace("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
          Trace("Error Updating User: " & oRecordSet.Fields(0) & "    Reason: " & Err.Description)
          Trace("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
          Trace("")
          iFailureCount = iFailureCount + 1
          Err.Clear
        Else
          iSuccessCount = iSuccessCount + 1
        End If
      End If
      On Error Goto 0
      iRecordCount = iRecordCount + 1
      oRecordSet.MoveNext
    Wend
    
    ' -- Clean up --
    oRecordSet.Close
    oConnection.Close
    Set oField = Nothing
    Set oRecordSet = Nothing
    Set oCmd = Nothing
    Set oConnection = Nothing
    Set usr = Nothing
    
    ' Provide Summary
    Trace ("")
    Trace ("************* Summary **************")
    If fTrialMode = True Then
      Trace ("Running in Trial Mode")
    End If
    Trace ("Records Found: " & iRecordCount)
    Trace ("Successful Update: " & iSuccessCount)
    Trace ("Failure Update: " & iFailureCount)
    
    
    
    ' -------------------------------------------------------
    ' -------------------------------------------------------
    ' -------------------------------------------------------
    '
    ' -------------------------------------------------------
    ' -------------------------------------------------------
    ' -------------------------------------------------------
    
    Sub Trace(message)
       WScript.Echo message
    end sub
'End script

Pour plus d'informations

Pour plus d'informations sur les API et les interfaces disponibles pour l'administration et le développement d'Exchange, voir la rubrique Microsoft Exchange Software Development Kit.

Pour plus d'informations sur d'autres méthodes permettant d'activer, de désactiver et de réassocier des boîtes aux lettres, voir la rubrique Utilisation des attributs Active Directory pour activer, désactiver et réassocier des boîtes aux lettres.

Pour plus d'informations sur le déplacement de bases de données de boîtes aux lettres Exchange, voir la rubrique Déplacement d'une base de données de boîtes aux lettres Exchange vers un autre serveur ou groupe de stockage.