Beispielskript für das Verschieben von Exchange-Postfächern mithilfe von ADSI

 

Letztes Änderungsdatum des Themas: 2005-10-13

Das folgende Microsoft Visual Basic®-Skript kann auch zum Verschieben von Exchange-Postfächern von einer Postfachdatenbank in eine andere verwendet werden.

Sie können den folgenden Code in eine neue Textdatei kopieren und diese Datei unter dem Namen Rest.vbs in einem temporären Ordner mit dem Namen Restoring speichern. Zum Ausführen dieses Skipts auf der Befehlszeile wechseln Sie in den Ordner Restoring, und führen Sie den folgenden Befehl aus:

cscript rest.vbs

In diesem Beispiel werden durch das Skript die folgenden Attribute geändert:

  • msExchHomeServerName
  • homeMDB
  • HomeMTA

Diese drei Attribute können entweder direkt oder während der Ausführung des Skripts eingegeben werden. Wenn die Informationen während der Ausführung des Skripts eingegeben werden sollen, entfernen Sie die Kommentarzeile aus dem Skript.

    '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

Weitere Informationen

Weitere Informationen zu verfügbaren APIs und Schnittstellen für die Exchange-Administration und -Endwicklung finden Sie unter Microsoft Exchange Software Development Kit.

Weitere Informationen über andere Methoden zum Aktivieren, Deaktivieren und Verschieben von Postfächern finden Sie unter Aktivieren, Deaktivieren und Verschieben von Postfächern mit Active Directory-Attributen.

Weitere Informationen zum Verschieben von Exchange-Postfachdatenbanken finden Sie unter Verschieben einer Exchange-Postfachdatenbank auf einen anderen Server oder in eine andere Speichergruppe.