Word : "Contact opnemen met..."
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:
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> |
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:
Het runnen van wtc.exe zonder verder input toont de info hoe je de applicatie kunt gebruiken:
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> |
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> |
Nogmaals een dry-run, alleen wat algemener:
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> |
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> |
- 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).
Voor het oplossen zijn de volgende bronnen gebruikt:
- Google Search
Mijn grote zoekvriend - How to fix slow opening Microsoft Word documents because of invalid network paths
Het blog van Schakko, die de problemen hierboven in het engels beschrijft en de Word Template Changer tool heeft geschreven - Word Template Corrector @ Github
De Github locatie van Word Template Corrector
04-'20 Exchange 2016 : Mailbox logon returned EcLoginFailure -2147221231
Reacties
(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).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.)
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]
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.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).
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.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.
Was dat maar waar, dan was het een stuk simpeler en de noodzaak voor een dergelijk tooltje ook niet aanwezig geweest.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.
[...]
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".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...
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.
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
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
Ik mag hopen dat SERVER02 voorlopig nog wel een poosje blijft bestaan.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?
..
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.
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...
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
..
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 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]
..
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....
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
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.