We had set our computers running MS Office 2003 to use group templates from a corporate server so that every one uses the same templates with our company logo, font styles, etc (Tools -> Options -> File locations -> Group templates). Some years ago the templates were located on a shared resource (everyone readonly access) in one of our servers (let's call it \\OLDSERVER\OfficeTemplates$\Word). Years have passed by and with Windows 2003 R2's new features, we have moved on to use replication, DFS and domain-based namespaces to unify all the shares into a single entry point for everyone. The new group templates location was set to H:\Common files\Office templates\Word. Everything seemed to be perfectly set up and working. Eventually, the server that used to host the templates was removed and the problem showed up: Every time you try to open a .doc file that was created using the original path template (based on a shared resource) MS Word took from 2 to 3 minutes to show up the file. It finally opens, but most users think there is a problem with the servers, the file, MS Word or their computers and rush to call IT support. We started to investigate the issue and found that Adam Leinss was experiencing the same problem. From Adam Leinss’ Tech Tips: Remove Novell and Microsoft Word Goes Ape:
Our company is moving from Novell to Microsoft for our file and directory services. We removed the Novell client from everyone’s workstation and that seemed to work just fine. Then we removed everyone’s rights to said Novell server and everything is still fine. Then shut down said Novell server and bam: opening some Word documents takes 2 to 3 minutes!We tried to use the macro/script he suggests. You need to download dsofile.dll - Microsoft Developer Support OLE File Property Reader 2.0 Sample (KB 224351) in order to make it run and still make some modifications to the code since there seem to be two different dsofile.dll versions and minor changes are needed in order to run it using the new dsofile.dll version. Extracted from March 2005 Tales from the Script (Historias de Secuencias de Comandos):
Old dsofile.dll version:Set objPropertyReader = CreateObject("DSOleFile.PropertyReader") Set objDocument = objPropertyReader.GetDocumentProperties("C:\Scripts\New_users.xls") Wscript.Echo "Author: " & objDocument.AuthorCode modified to make it run with the new version:
Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:\Scripts\New_users.xls") Wscript.Echo "Author: " & objFile.SummaryProperties.Author
Summing up, here is the modified version of the script that we used:
Sub TemplateBatchChangeModified() Dim objPropertyReader Dim strFolder As String Dim strFileName As String Dim objThisDoc As Word.Document Dim strFindTemplate As String Dim strReplaceTemplate As String Dim strAffectedDocs As String On Error Resume Next 'Create the PropertyReader object Set objPropertyReader = CreateObject("DSOFile.OleDocumentProperties") If Err.Number <> 0 Then MsgBox "You must install the DSOleFile component. See " & _ "http://support.microsoft.com/support/kb/articles/Q224/3/51.ASP" GoTo FinishUp End If 'Get the template names strFindTemplate = UCase(InputBox("Name of template to find (exclude the .dot)") & ".dot") strReplaceTemplate = InputBox("Name of replacement template (exclude the .dot)") & ".dot" 'Make sure it's a valid template. Try to create a new document based on it. Set objThisDoc = Word.Documents.Add(strReplaceTemplate, Visible:=False) If Err.Number <> 0 Then 'No such template MsgBox "There is no accessible template named " & strReplaceTemplate GoTo FinishUp End If 'Close the test document objThisDoc.Close wdDoNotSaveChanges On Error GoTo ErrorHandler 'Get the current documents path strFolder = "drive:\directory from with you want to replace templates\" 'Examine all Word documents in the directory 'Get the first document name strFileName = Dir(strFolder & "*.doc") While strFileName <> "" 'Look at the template name objPropertyReader.Open (strFolder & strFileName) If UCase(objPropertyReader.SummaryProperties.Template) = strFindTemplate Then objPropertyReader.Close 'It matches. Open the document Set objThisDoc = Word.Documents.Open(FileName:=strFolder & strFileName, _ Visible:=False) 'Change the attached template objThisDoc.AttachedTemplate = strReplaceTemplate 'Save the change objThisDoc.Close wdSaveChanges 'Note the document strAffectedDocs = strAffectedDocs & strFileName & ", " End If 'Get the next document strFileName = Dir Wend 'Report the results If strAffectedDocs = "" Then MsgBox "No documents were changed.", , "Template Batch Change" Else 'Remove the trailing comma and space strAffectedDocs = Left(strAffectedDocs, Len(strAffectedDocs) - 2) MsgBox "These documents were changed: " & strAffectedDocs, , "Template Batch Change" End If GoTo FinishUp ErrorHandler: Set objThisDoc = Nothing Set objPropertyReader = Nothing Err.Raise vbError + 1001, "TemplateBatchChange", "TemplateBatchChange encountered an error: " & Err.Description FinishUp: 'Release object references Set objThisDoc = Nothing Set objPropertyReader = Nothing End Sub
There is however a problem with this script, or with MS Word API to be more precise: In our case the old and the new templates are called the same. The only change is WHERE do they are located (the unexisting shared resource and the new location). Having that in mind, if you run: /
objThisDoc.AttachedTemplate = strReplaceTemplate
no change is actually done, and the file is not modified at all (despite that the scripts tells you that it has been changed). The only way to effectively change the files showing this delay when being opened is to change the name of the template. For instance we had a template called Corporate+TÜV Envelope English.dot, we would need to create a copy of it with the name Corporate+TÜV Envelope EN.dot for instance and then run the script telling to change Corporate+TÜV Envelope English.dot into Corporate+TÜV Envelope EN.dot FOR EVERY .DOC FILE created during the last 3 years that resides on the server, and this script repeated FOR EVERY template we use. If you have set your group templates on a shared resource I advise you not doing it any more. You will run into problems whenever you need to replace your server. You can check how the full path to the template is saved with your documents saving them as a .xml file and the opening it with notepad. You will find the following key:
<w:attachedTemplate w:val="\\OLDSERVER\OfficeTemplates$\Word\Corporate+TÜV Envelope English.dot"/>
We have finally decided not to change any single file of our servers. Instead of doing such a lot of changes, we just have created an A record in our DNS Servers to point OLDSERVER to the IP address of any of the live servers. Having done that MS Words 2003 opens the files that poing to \\OLDSERVER\OfficeTemplates$\Word without the delay of 3 minutes. There is no need to create the share on the server pointed by OLDSERVER, it only needs to be there, alive and 'pingable'. It is not a solution, just a workaround. The real solution is MS Word being updated (maybe in the next SP or in Office 2007) so that it does not look for the path of the original template anymore.
5 comments:
Unfortunately Word 2007 is just the same and has exactly the same problem.
Daz.
Brilliant! At last - the solution to my problem. How would have thought there were 2 versions of DSOleFile. I did ..
Set objPropertyReader = CreateObject("DSOFile.OleDocumentProperties")
' comment out the old version
' Set objPropertyReader = CreateObject("DSOleFile.PropertyReader")
and now it works! Thank you thank you thank you.
Same problem exists in Word 2010. Worse still is the number of clicks you need in order to remove the reference to the old template -- talk about convoluted. NetBIOS alias/DNS A record is definitely the way to go. Did Microsoft honestly not foresee this issue?
Hi guys,
Could you please help me and explain what exactly you mean with NetBios alias/DNS A record?
Cheers,
Bruno
You need to have administrative access to the DNS Server that your clients are using (running normally on your Domain Controller). From the administrative console of the DNS server, you need to create an 'A Record' with the name of the old/removed server that points to the IP address of the machine that is now hosting the templates (or any other as long as it is normally running, i.e. a server).
Post a Comment