'################################################################################ '# NAME: migrate_signature_and_alias.vbs # '# # '# This script will convert IPSwitch IMail 2006.x (or higher) aliases and # '# webmail signature files to Alt-N MDaemon 11.x # '# The script loops through all the domains in the IMail computer's registry # '# and then it loops through all the aliases of each domain. # '# It creates an Alias.TXT file which you can paste to the # '# \MDaemon\App\Alias.DAT file and mailing list files (group aliases) which # '# should be copied to the \MDaemon\App\ directory. # '# It also loops through all user directories to look for a signature and copies# '# it to the MDaemons User's directory, in the WorldClient (WC) folder. # '# # '# Author: Roel Broersma Date: 25 july 2011 Version: 1.1 # '# Company: Gigaweb B.V. E-Mail: roel@gigaweb.nl # '################################################################################ Option Explicit Dim migrate_aliases, migrate_signatures, postmaster_alias_for_domains, postmaster_destination, imail_registry_domain_path, imail_domains_folder, imail_domain_filter, mdaemon_users_folder, mdaemon_maillist_folder, mdaemon_alias_dat_file Dim domain, domain_topdir, alias, alias_destination, ALIASFILE, user, file, logfile Dim obj_stdout, obj_filesys, obj_reg, domain_folder_obj, user_folder_obj, alias_file_obj Dim array_domains(), array_aliases() const HKEY_LOCAL_MACHINE = &H80000002 migrate_aliases = True '##SET TO TRUE TO MIGRATE IMAIL ALIASES TO MDAEMON ALIASES AND MAILINGLISTS.## migrate_signatures = True '##SET TO TRUE TO MIGRATE THE WEBMAIL SIGNATURES TO WORLDCLIENT SIGNATURES.## postmaster_alias_for_domains = True '##SET TO TRUE TO ADD A POSTMASTER@ ALIAS FOR EVERY DOMAIN (SAME AS A NOBODY ALIAS IN IMAIL).## postmaster_destination = "info" '##SET DESTINATION FOR POSTMASTER@ ALIAS OF DOMAIN.## imail_registry_domain_path = "SOFTWARE\Wow6432Node\Ipswitch\IMail\Domains" imail_domains_folder = "E:\messaging\IMail\Domains\" '##ENUMERATE THIS DIRECTORY.## imail_domain_filter = "" '##SET A FILTER FOR THE DOMAIN ENUMERATION, IN CASE YOU ONLY WANT TO MIGRATE 1 DOMAIN: "mydomain.com" OR IF YOU WANT TO MIGRATE ONLY ALL ".nl" DOMAINS, ETC.## mdaemon_users_folder = "E:\MDaemon\Users\" '##USED TO WRITE THE SIGNATURE FILES, YOU DON'T HAVE TO INSTALL MDAEMON, JUST CREATE THIS DIRECTORY. YOU CAN LATER COPY THIS DIRECTORY OVER THE MDAEMON DIRECTORY.## mdaemon_maillist_folder = "E:\MDaemon\App\" '##USED TO WRITE THE MAILING LIST FILES, YOU DON'T HAVE TO INSTALL MDAEMON, JUST CREATE THIS DIRECTORY. YOU CAN LATER COPY THIS DIRECTORY OVER THE MDAEMON DIRECTORY.## mdaemon_alias_dat_file = "E:\Alias.txt" '##RECOMMENDED TO USE A TEMP FILE AND MANUALLY COPY THE CONTENT TO THE E:\MDaemon\App\Alias.dat FILE.## Set obj_stdout = WScript.StdOut Set obj_filesys = CreateObject ("Scripting.FileSystemObject") Set obj_reg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") logfile = "Starting migration..." &vbNewLine '###Loop through all the domains.### obj_reg.EnumKey HKEY_LOCAL_MACHINE, imail_registry_domain_path, array_domains For Each domain In array_domains obj_reg.GetStringValue HKEY_LOCAL_MACHINE,imail_registry_domain_path&"\"&domain, "TopDir", domain_topdir If ( Left(LCase(domain),8)<>"$virtual" AND IsNull(domain_topdir)=False ) Then '###Filter the domain directory if needed.### If Instr(LCase(domain),LCase(imail_domain_filter))>0 Then logfile = logfile & vbNewLine & "=====================================" & vbNewLine & "Migrating for domain: " & domain & vbNewLine & "=====================================" & vbNewLine If (migrate_aliases=True) Then '###Loop through all aliases of the domain as found in the registry.### obj_reg.EnumValues HKEY_LOCAL_MACHINE, imail_registry_domain_path&"\"&domain&"\Users\_aliases", array_aliases For Each alias In array_aliases obj_reg.GetStringValue HKEY_LOCAL_MACHINE,imail_registry_domain_path&"\"&domain&"\Users\_aliases", alias, alias_destination If ( LCase(alias)="postmaster" OR LCase(alias)="nobody") Then logfile = logfile & alias& " alias found, do not migrate. We add a postmaster alias later anyway." &vbNewLine ElseIf ( Left(LCase(alias),6)="owner-" OR Right(LCase(alias),6)="-owner" OR Left(LCase(alias_destination),11)="| imailsrv " ) Then logfile = logfile & alias& " Mailinglist found. Mailinglists will not be migrated!" &vbNewLine Else If Instr(alias_destination, ",")>0 Then logfile = logfile & "Group alias found, migrating to mailinglist: " & alias & "@" & domain &vbNewLine Call create_mailinglist (alias &"@" &domain, alias_destination) Else logfile = logfile & "Migrating alias: " &alias &" - " &alias_destination &vbNewLine ALIASFILE = ALIASFILE & alias &"@" &domain & " = " &alias_destination &vbNewLine End If End If Next End If If (postmaster_alias_for_domains) Then ALIASFILE = ALIASFILE & "postmaster@" &domain & " = " &postmaster_destination &"@" &domain &vbNewLine logfile = logfile & alias& "Postmaster alias added to domain to: " &postmaster_destination &"@" &domain &vbNewLine End If '###Loop through all the users in the domain (based on Directories because users can exist in registry or ODBC but are always on disk).### Set domain_folder_obj = obj_filesys.GetFolder(domain_topdir&"\Users") For Each user In domain_folder_obj.SubFolders logfile = logfile & "Migrating signature of: " &user.name &"@" &domain &vbNewLine '###Loop through all files in the users directory.### Set user_folder_obj = obj_filesys.GetFolder(user.path) For Each file In user_folder_obj.Files '###Do only for signature files### If (file.Name="signature.txt" AND migrate_signatures=True) Then If (obj_filesys.FolderExists(mdaemon_users_folder & domain)=False) Then obj_filesys.CreateFolder mdaemon_users_folder & domain End If If (obj_filesys.FolderExists(mdaemon_users_folder & domain & "\" & user.name)=False) Then obj_filesys.CreateFolder mdaemon_users_folder & domain & "\" & user.name End If If (obj_filesys.FolderExists(mdaemon_users_folder & domain & "\" & user.name & "\WC")=False) Then obj_filesys.CreateFolder mdaemon_users_folder & domain & "\" & user.name & "\WC" End If obj_filesys.CopyFile file.Path, mdaemon_users_folder & domain & "\" & user.name & "\WC\signature.txt" logfile = logfile & Chr(9) & "Copied: " & file.Path & " to " & mdaemon_users_folder & domain & "\" & user.name & "\WC\signature.txt" &vbNewLine End If Next Set user_folder_obj = Nothing Next Set domain_folder_obj = Nothing End If End If Next Set alias_file_obj = obj_filesys.CreateTextFile(mdaemon_alias_dat_file,True) alias_file_obj.write ALIASFILE Set alias_file_obj = Nothing obj_stdout.Write logfile Set obj_reg = Nothing Set obj_filesys = Nothing Set obj_stdout = Nothing Sub create_mailinglist (name, distribution_list) Dim obj_filesystem, obj_filetext, destination_address Set obj_filesystem = CreateObject ("Scripting.FileSystemObject") Set obj_filetext = obj_filesystem.CreateTextFile(mdaemon_maillist_folder & name & ".grp", True) obj_filetext.WriteLine "# Mailing List file" obj_filetext.WriteLine "#" obj_filetext.WriteLine "; ListName = " &name obj_filetext.WriteLine "; Private = N" obj_filetext.WriteLine "; HideFromAddressBook = N" obj_filetext.WriteLine "; AllowExpn = N" obj_filetext.WriteLine "; ListNameInSubject = N" obj_filetext.WriteLine "; ThreadNumbersInSubject = N" obj_filetext.WriteLine "; UseMemberNames = N" obj_filetext.WriteLine "; UseListName = N" obj_filetext.WriteLine "; UseStandardName = Y" obj_filetext.WriteLine "; InsertCaption = N" obj_filetext.WriteLine "; CrackMessage = Y" obj_filetext.WriteLine "; ForceUniqueID = Y" obj_filetext.WriteLine "; IgnoreRcptErrors = Y" obj_filetext.WriteLine "; SubscribeNote = N" obj_filetext.WriteLine "; UnsubscribeNote = N" obj_filetext.WriteLine "; MsgTooBigNote = N" obj_filetext.WriteLine "; InformNonMember = N" obj_filetext.WriteLine "; SendStatusMessages = N" obj_filetext.WriteLine "; Moderated = N" obj_filetext.WriteLine "; PasswordPost = N" obj_filetext.WriteLine "; Subscribe = N" obj_filetext.WriteLine "; AuthSubscribe = Y" obj_filetext.WriteLine "; AuthAutoSubscribe = Y" obj_filetext.WriteLine "; Unsubscribe = N" obj_filetext.WriteLine "; AuthUnsubscribe = Y" obj_filetext.WriteLine "; AuthAutoUnsubscribe = N" obj_filetext.WriteLine "; AutoPrune = N" obj_filetext.WriteLine "; EnableDigest = N" obj_filetext.WriteLine "; ForceDigestUse = N" obj_filetext.WriteLine "; ArchiveDigest = N" obj_filetext.WriteLine "; Nine = N" obj_filetext.WriteLine "; Twelve = N" obj_filetext.WriteLine "; Three = N" obj_filetext.WriteLine "; Six = N" obj_filetext.WriteLine "; AM = N" obj_filetext.WriteLine "; PM = N" obj_filetext.WriteLine "; DigestMBF = DIGEST" obj_filetext.WriteLine "; Notifications-To = [trash]" obj_filetext.WriteLine "; RoutingLimit = 0" obj_filetext.WriteLine "; MaxMessageSize = 0" obj_filetext.WriteLine "; PrecedenceLevel = 80" obj_filetext.WriteLine "; MaxMembers = 0" obj_filetext.WriteLine "; MaxMessageCount = 0" obj_filetext.WriteLine "; MaxLineCount = 0" obj_filetext.WriteLine "; ODBCDSN = " obj_filetext.WriteLine "; ODBCUser = " obj_filetext.WriteLine "; ODBCPass = " obj_filetext.WriteLine "; ODBCTable = " obj_filetext.WriteLine "; ODBCEmailFieldMapping = " obj_filetext.WriteLine "; ODBCFirstNameFieldMapping = " obj_filetext.WriteLine "; ODBCLastNameFieldMapping = " obj_filetext.WriteLine "; ODBCReadOnlyQuery = " obj_filetext.WriteLine "; ODBCPostOnlyQuery = " obj_filetext.WriteLine "; ODBCNormalQuery = " obj_filetext.WriteLine "; ODBCDigestQuery = " obj_filetext.WriteLine "; ADBASEDN = " obj_filetext.WriteLine "; ADSEARCHFILTER = (&(objectClass=user)(objectCategory=person))" obj_filetext.WriteLine "; ADATTRIBUTE = mail" obj_filetext.WriteLine "; ADUSERNAME = " obj_filetext.WriteLine "; ADBINDFLAGS = 1" obj_filetext.WriteLine "; ADSEARCHSCOPE = 2" obj_filetext.WriteLine "; ADPAGESIZE = 1000" obj_filetext.WriteLine "; ADPASSWORD = " obj_filetext.WriteLine "; DefaultMode = Normal" obj_filetext.WriteLine "" For Each destination_address In Split(Trim(distribution_list),",") obj_filetext.WriteLine (Trim(destination_address)) Next Set obj_filetext = Nothing Set obj_filesystem = Nothing End Sub