Let op: Tweakers stopt per 2023 met Tweakblogs. In dit artikel leggen we uit waarom we hiervoor hebben gekozen.

Word : "Contact opnemen met..."

Door DaLass op maandag 13 juli 2020 08:25 - Reacties (9)
Categorie: Office, Views: 4.596

Recent werd ik door een collega gevraagd om eens mee te denken met een geval van traagheid bij het starten van Word. In de betreffende case was er sprake van een vertraging van +/- 1 minuut bij het openen van een ouder Word document welke al meer dan een half jaar geleden is aangemaakt. Bij het openen van het bestand was het mooie blauwe start-scherm van Word te zien, met onderin de volgende tekst:

Contact opnemen met \\SERVER01\Share$\Bedrijf\Templates

Dit scherm bleef ongeveer een minuut staan, waarna het document geopend werd. Wat opviel in het start-scherm was dat er verwezen werd naar SERVER01, welke al een half jaar niet meer bestaat en is gemigreerd naar SERVER02. Alle bestanden die op SERVER02 zijn aangemaakt, hebben ook geen problemen en worden gewoon snel geopend in Word. Tijd om even verder te kijken.

De documenten in kwestie zijn .DOCX bestanden, wat eigenlijk gewoon archieven zijn. Bij een voorbeeld document hebben we de extensie dan ook hernoemd naar .ZIP en zijn we gaan spitten in het archief om de verwijzing naar de betreffende template locatie te kunnen vinden. De verwijzing was terug te vinden in het bestand settings.xml.rels, te vinden in de map word\_rels van het archief. Hierin was het volgende te vinden:

code:
1
2
3
4
<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
    <Relationship TargetMode="External" Target="file:///\\SERVER01\Share$\Bedrijf\Templates\Template.dotx" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/attachedTemplate" Id="rId1"/>
</Relationships>

Na het handmatig aanpassen van de template verwijzing naar de nieuwe locatie (\\SERVER02.domein.nl\Share\Bedrijf\Templates\Template.dotx) hebben we het archief weer terug hernoemd naar .DOCX om te kijken of de wijziging effect zou hebben, en met succes: Het bestand kon weer snel geopend worden en werd met de juiste template geladen.

Maar nu... De map in kwestie is een datamap van een applicatie die word documenten opslaat en bevat (inclusief submappen) enkele duizenden word documenten. Niet echt een klus om met de hand aan te gaan passen. Gelukkig waren wij niet de enige die tegen dit probleem zijn aangelopen en is er iemand geweest die daar een tooltje voor geschreven heeft, genaamd Word Template Corrector:




De tool moet je zelf even compilen (je kunt ook de binary aanschaffen en de ontwikkelaar supporten) met de instructies op bovenstaande website, en dan heb je een mooie executable genaamd wtc.exe die je kan helpen met het aanpassen van de template locatie in de .DOCX bestanden.

Het runnen van wtc.exe zonder verder input toont de info hoe je de applicatie kunt gebruiken:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
C:\Temp>wtc.exe
Word Template Corrector
Correcting wrong paths to templates in MS Office Word documents.
USE AT YOUR OWN RISK.

WTC 1.0.0.3
Don't panic!

ERROR(S):
  -d/--directory required option is missing.
  -o/--old required option is missing.
  -n/--new required option is missing.


  -d, --directory    Required. working directory.

  -o, --old          Required. The old part of the templates path to be
                     replaced.

  -n, --new          Required. The new (replacement) part of the templates
                     path.

  -r, --recursive    Recurse through subdirectories.

  -b, --nobackup     (Default: False) Do NOT create a backup (.bak) of each
                     changed document.

  -t, --dry-run      (Default: False) Do not change any files (for testing).

  -v, --verbose      (Default: False) Activates verbose error messages.

  -p, --preserve     (Default: False) Preserve permissions & dates

  --help             Display this help screen.


  Example: wtc -d \\server\share\documents -o \\oldserver\share\templates\ -n \\server\share\templates\ -r

C:\Temp>

Goed, laten we eens een dry run doen op een originele versie van het document:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
C:\Temp>wtc.exe -d "C:\Temp\Docs" -o \\SERVER01\Share$\Bedrijf\Templates\Template.dotx -n \\SERVER02.domein.nl\Share\Bedrijf\Templates\Template.dotx -t -p
Directory   : C:\Temp\Docs
Search for  : \\SERVER01\Share$\Bedrijf\Templates\Template.dotx
Replace with: \\SERVER02.domein.nl\Share\Bedrijf\Templates\Template.dotx
no Backups  : False
Recursive   : False
Preserve    : True
Dry run     : True
AFFECTED C:\Temp\Docs\Testdocument.docx
1 file(s) scanned
1 file(s) affected and need correction
0 error(s) occured
Runtime 00:00:00.04

C:\Temp>

De dry-run is goed gegaan, maar de locatie van de template is te specifiek, want op de share is er sprake van meerdere templates. Het liefst vervangen we dus alleen het begin van de share, aangezien alleen de servernaam en de sharenaam zijn gewijzigd en de rest van de template locatie(s) gelijk gebleven zijn.

Nogmaals een dry-run, alleen wat algemener:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
C:\Temp>wtc.exe -d "C:\Temp\Docs" -o \\SERVER01\Share$\ -n \\SERVER02.domein.nl\Share\ -t -p
Directory   : C:\Temp\Docs
Search for  : \\SERVER01\Share$\
Replace with: \\SERVER02.domein.nl\Share\
no Backups  : False
Recursive   : False
Preserve    : True
Dry run     : True
AFFECTED C:\Temp\Docs\Testdocument.docx
1 file(s) scanned
1 file(s) affected and need correction
0 error(s) occured
Runtime 00:00:00.04

C:\Temp>

Nice, dat werkt ook. Ok, dan eens geen dry-run, maar een daadwerkelijke aanpassing:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
C:\Temp>wtc.exe -d "C:\Temp\Docs" -o \\SERVER01\Share$\ -n \\SERVER02.domein.nl\Share\ -p
Directory   : C:\Temp\Docs
Search for  : \\SERVER01\Share$\
Replace with: \\SERVER02.domein.nl\Share\
no Backups  : False
Recursive   : False
Preserve    : True
Dry run     : False
CHANGED C:\Temp\Docs\Testdocument.docx
1 file(s) scanned
1 file(s) corrected
0 error(s) occured
Runtime 00:00:00.06

C:\Temp>

Een controle in de .DOCX laat zien dat het bestand settings.xml.rels netjes is aangepast naar de nieuwe locatie en het word document kan ook zonder problemen en snel geopend worden. Voor de uiteindelijke uitvoer op de locatie van de bestanden passen we nog de volgende wijzigingen toe:
  • Voor de dry-run:
    wtc.exe -d "<ROOT_DOCX_BESTANDEN>" -o \\SERVER01\Share$\ -n \\SERVER02.domein.nl\Share\ -t -r -p
    (-r toegevoegd, zodat ook de submappen meegepakt worden).
  • Extra backup draaien van de locatie van de DOCX bestanden, alvorens we daadwerkelijke aanpassing uitvoeren.
  • Voor de aanpassing:
    wtc.exe -d "<ROOT_DOCX_BESTANDEN>" -o \\SERVER01\Share$\ -n \\SERVER02.domein.nl\Share\ -r -b -p
    (-t verwijderd, het is geen dry-run meer. -b toegevoegd, het proces hoeft geen .bak te maken van elk aangepast document, daar hebben we al een backup voor).
Het uiteindelijke resultaat:
Met minimale inspanning alle documenten van de klant aangepast, zodat deze weer snel en met de juiste template verwijzing(en) geopend kunnen worden.




Voor het oplossen zijn de volgende bronnen gebruikt:

Volgende: Exchange 2016 : Mailbox logon returned EcLoginFailure -2147221231 04-'20 Exchange 2016 : Mailbox logon returned EcLoginFailure -2147221231

Reacties


Door Tweakers user WebHawk, maandag 13 juli 2020 11:06

Grappig dat daar een tooltje voor is. Maar, had dit niet met find & replace gekund? Of zie ik nu toch iets over het hoofd dat het daar te complex voor maakt?
(Omdat het om Word gaat, doe het eens gek en doe het in Word zelf. Normaal vind ik dat mensen die het een goed idee vinden om Word gebruiken om bestanden in plain-tekstformaat te bewerken bezocht moeten worden door een krijger te paard.)

Door Tweakers user DaLass, maandag 13 juli 2020 11:08

WebHawk schreef op maandag 13 juli 2020 @ 11:06:
Grappig dat daar een tooltje voor is. Maar, had dit niet met find & replace gekund? Of zie ik nu toch iets over het hoofd dat het daar te complex voor maakt?
(Omdat het om Word gaat, doe het eens gek en doe het in Word zelf. Normaal vind ik dat mensen die het een goed idee vinden om Word gebruiken om bestanden in plain-tekstformaat te bewerken bezocht moeten worden door een krijger te paard.)
Als je dit met Find&Replace wilt doen, zul je dus eerst alle word documenten om moeten zetten naar .ZIP, want die zoekt standaard niet in het word document (als: in het archief van het document).

Daarnaast is het ook wel prettig dat dit tooltje ook info geeft over wat er wel en niet gewijzigd is, je hebt dus meteen een duidelijk beeld van wat wel en niet is aangepast.

[Reactie gewijzigd op maandag 13 juli 2020 11:09]


Door Tweakers user WebHawk, maandag 13 juli 2020 11:16

DaLass schreef op maandag 13 juli 2020 @ 11:08:
[...]

Als je dit met Find&Replace wilt doen, zul je dus eerst alle word documenten om moeten zetten naar .ZIP, want die zoekt standaard niet in het word document (als: in het archief van het document).
Ah! Ik heb je artikel iets te vluchtig gelezen. Ik dacht daarom even dat het om één algemeen settings.xml.rels bestand ging met daarin verwijzingen naar duizenden bestanden in de map op de share.
Daarnaast is het ook wel prettig dat dit tooltje ook info geeft over wat er wel en niet gewijzigd is, je hebt dus meteen een duidelijk beeld van wat wel en niet is aangepast.
Dat is zeker waar, en dat maakt de dry run-functie ook een stuk nuttiger dan als het om het aanpassen van een enkel bestand zou gaan. :)

Door Tweakers user DaLass, maandag 13 juli 2020 11:32

WebHawk schreef op maandag 13 juli 2020 @ 11:16:
[...]
Ah! Ik heb je artikel iets te vluchtig gelezen. Ik dacht daarom even dat het om één algemeen settings.xml.rels bestand ging met daarin verwijzingen naar duizenden bestanden in de map op de share.
[...]
Was dat maar waar, dan was het een stuk simpeler en de noodzaak voor een dergelijk tooltje ook niet aanwezig geweest. ;)

Door Tweakers user TommieW, maandag 13 juli 2020 15:07

Zoiets kan toch ook prima in Powershell of Bash? Zelf heb ik daar een stuk meer vertrouwen van dan een willekeurig tooltje van de interwebs...

Door Tweakers user DaLass, maandag 13 juli 2020 15:11

TommieW schreef op maandag 13 juli 2020 @ 15:07:
Zoiets kan toch ook prima in Powershell of Bash? Zelf heb ik daar een stuk meer vertrouwen van dan een willekeurig tooltje van de interwebs...
Ja hoor, daar kun je vast iets voor bouwen in Powershell of Bash. Zo heeft de ontwikkelaar van dit tooltje gedacht "daar kun je vast iets voor bouwen in .NET". :)

Qua betrouwbaarheid snap ik je opmerking over het vertrouwen in het tooltje, gelukkig kun je deze ook zelf compilen en kan je dus in de source kijken voor je hem gebruikt. Iets wat lastiger wordt als je de binary aanschaft.

Door Tweakers user onkl, dinsdag 14 juli 2020 10:09

Hebben jullie al plannen om SERVER02 te vervangen door SERVER03, of komen die over een paar maanden pas? :Y)

Functioneel is die referentie op twee punten contraproductief:
  • Wanneer je zo'n referentie hebt, zal het document bij openen kijken of het template gewijzigd is en dan de stijlinformatie bijwerken. Klinkt lollig, maar meestal betekend dit dat het weggooien + opnieuw aanmaken van een invulveld in het template leidt tot een totale ontploffing in je documentarchief
  • Wanneer een collega zo'n Worddocument doormailt, zal de gemiddelde ontvanger die het bestand opent ook SERVER02 niet kunnen benaderen. At best onprofessioneel, at worst een ongewild inkijkje geven in je interne infrastructuur
Wanneer je een Worddocument opent, kan je de referentie naar een template ook gewoon verwijderen. Dan gebruikt Word danwel geen template, danwel normal.dot.
Door te kijken hoe settings.xml.rels (Let op: en settings.xml) veranderen wanneer je dat doet, kan je het documentarchief ook structureel ontkoppelen van die templates.

Om de kraan dicht te draaien voordat je gaat dweilen: kijk ook meteen even naar de hele usecase "nieuw document aanmaken": Hoe zorg je ervoor dat dit soort referenties niet worden meegenomen in een nieuw document? Een mogelijkheid is het opnemen van een stukje VBA in het templatebestand (Als je policies dat toelaten). Standaardbrokje code (Uit mijn hoofd, dus check het wel even):
Private Sub Document_New()
ActiveDocument.AttachedTemplate = ""
End Sub

Door Tweakers user DaLass, dinsdag 14 juli 2020 11:27

onkl schreef op dinsdag 14 juli 2020 @ 10:09:
Hebben jullie al plannen om SERVER02 te vervangen door SERVER03, of komen die over een paar maanden pas? :Y)
..
Ik mag hopen dat SERVER02 voorlopig nog wel een poosje blijft bestaan. ;)
Wat we nog niet getest hebben (en nog even moeten doen) is of het ook werkt als er een DFS locatie opgegeven wordt. Theoretisch zou ik geen problemen verwachten en dan hebben we het probleem met SERVER03 in de toekomst ook opgelost.
..
Functioneel is die referentie op twee punten contraproductief:
[list]
• Wanneer je zo'n referentie hebt, zal het document bij openen kijken of het template gewijzigd is en dan de stijlinformatie bijwerken. Klinkt lollig, maar meestal betekend dit dat het weggooien + opnieuw aanmaken van een invulveld in het template leidt tot een totale ontploffing in je documentarchief
..
Goed punt, daarom worden de templates ook niet zomaar aangepast en ligt dit in handen van de applicatiebeheerder(s), die aanpassingen in de templates uitvoerig testen voordat deze definitief gemaakt worden.
...
• Wanneer een collega zo'n Worddocument doormailt, zal de gemiddelde ontvanger die het bestand opent ook SERVER02 niet kunnen benaderen. At best onprofessioneel, at worst een ongewild inkijkje geven in je interne infrastructuur
[/list]
..
Dat is gelukkig hier niet van toepassing, de Word documenten bestaan als onderdeel van de applicatie en dienen na aanpassing omgezet te worden naar een PDF alvorens deze het bedrijf mogen verlaten.
...
Wanneer je een Worddocument opent, kan je de referentie naar een template ook gewoon verwijderen. Dan gebruikt Word danwel geen template, danwel normal.dot.
Door te kijken hoe settings.xml.rels (Let op: en settings.xml) veranderen wanneer je dat doet, kan je het documentarchief ook structureel ontkoppelen van die templates.

Om de kraan dicht te draaien voordat je gaat dweilen: kijk ook meteen even naar de hele usecase "nieuw document aanmaken": Hoe zorg je ervoor dat dit soort referenties niet worden meegenomen in een nieuw document? Een mogelijkheid is het opnemen van een stukje VBA in het templatebestand (Als je policies dat toelaten). Standaardbrokje code (Uit mijn hoofd, dus check het wel even):
Private Sub Document_New()
ActiveDocument.AttachedTemplate = ""
End Sub
Goede info om aan te leveren bij de applicatiebeheerders om dit mee te nemen wanneer het document gegenereerd wordt. Het enige is dan wel dat een document niet meer automatisch up-to-date gemaakt wordt middels het template bij het openen vanuit de applicatie, iets wat nu wel gebeurd. Misschien dat daar nog iets anders voor te verzinnen is.

Door Tweakers user onkl, dinsdag 14 juli 2020 14:50

Ha. Dat klinkt prima robuust. Was even bang dat dit ging om gewaardeerde collega's die willekeurig aan het typen zijn geweest en dat zelf gaan rondmailen (Dat is disaster waiting to happen, maar dit valt alleszins mee. :)
Wanneer de word-documenten onderdeel zijn van een workflow/applicatiestroom, dan heb je natuurlijk veel meer mogelijkheden. Dan zou ik in de routines waarmee een wordbestand definitief wordt gemaakt een stukje code opnemen om de referentie naar de template eruit te slopen. (Of, nog makkelijker: Zodra de pdf er is, is dat het te bewaren ding en gaat het worddocument gewoon weg.

Lijkt me wel dat je op deze manier een vrij lastig updateproces hebt voor je templates: Doordat ook bestanden die al gecreëerd zijn, maar nog niet gereed (Nog ergens in de pijplijn zitten) zichzelf telkens weer updaten naar het nieuwste template, moet dan ding ook nogal backwards compatibel zijn en moet de beheerder met erg veel usecases rekening houden. Misschien is een "verbeteringen in template gelden alleen voor documenten die we vanaf nu aanmaken" beleid (Als dat, bezien het doel van die documenten bespreekbaar is...) beter te beheren. En als jullie organisatie ook maar een beetje lijkt op wat ik ken heb je als wisselgeld voor de licht getergde lijn/procesmanager: "Nee. Niet leuk, maar... dan wordt het changeproces voor die templates zo rete-agile dat we zelfs tijd hebben om eindelijk jullie wensen eens te honoreren ipv. alleen maar paniek-problemen te fixen".

Om te kunnen reageren moet je ingelogd zijn. Via deze link kun je inloggen als je al geregistreerd bent. Indien je nog geen account hebt kun je er hier één aanmaken.