Het probleem
Wij hebben verschillende website's die gebruik maken van ons CMS/DMS, hierbij hebben we een HTMLEditor gemaakt zodat gebruikers gemakkelijk zelf de content van hun site kunnen aanpassen.
Nu willen sommige gebruikers graag dat ze complete Office Word en OpenOffice Writer documenten kunnen importeren via de website en zo deze gemakkelijk op hun site kunnen zetten en hier zit nu het probleem, hiervoor willen we Microsoft.Office.Interop.Word gebruiken voor Word om het document daarmee te openen en op te slaan als HTML, maar daar lopen tegen een aantal problemen aan.
De HTML die Word maakt is natuurlijk erg vies en wil je nooit op een website hebben, maar daarvoor gebruiken we HTMLTidy, om de HTML op te schonen, maar daar gaat dit topic niet over.
Voordat jullie meteen gaan zeggen dat Office hier niet voor gemaakt is enzo, dat weten we, we hebben ook dit artikel gelezen, maar het moet toch wel kunnen?
Op zoek naar oplossingen
Toen we het in het begin hadden gemaakt leek het allemaal goed te werken, documenten werden netjes geopend, opgeslagen als HTML en gesloten. Maar... dit was tijdens het ontwikkelen en testen in Visual Web Developer Express 2008, welke zijn eigen webserver (Visual Studio Development Server) heeft en standaard ook gebruikt.
Daarna zijn we gaan testen in IIS, maar daar kwam dus het grote probleem, daarmee werkte het niet. Word werd wel opgestart, maar daarbij kregen we een 'Access denied' foutmelding bij Word en 'Server execution failed' bij Writer.
Hierna zijn we dus gaan onderzoeken wat het probleem kan zijn en het bleek al snel dat het een rechten probleem is. IIS maakt gebruik van een gebruiker ASPNET, welke heel beperkte rechten heeft. Visual Studio Development Server gebruikt het account waarmee je bent ingelogd (welke, in mijn geval, administrator rechten heeft). Toen had ik geprobeerd om mijn eigen gebruikers-account te gebruiken voor ASP.NET, dmv de impersonate instelling van de web.config en toen werkte het ook met IIS.
Daarna heb ik een nieuwe gebruiker gemaakt (genaamd test) in Windows en die administrator gemaakt, om te testen, en die in ASP.NET gebruikt, dit werkte ook. Omdat het natuurlijk niet slim is om gebruik te maken van een account met administrator rechten voor ASP.NET is dit geen goede oplossen en dus gingen we verder zoeken naar wat voor rechten meneer test moet hebben om dit te kunnen.
We kwamen al snel iets tegen dat je dcomcnfg moest gebruiken om aan "Microsoft Office Word 97 - 2003 document" de gebruikers die gebruikt worden door IIS toe te voegen zodat ze die mogen opstarten. We hebben dat toen gedaan door bij "Launch and Activation Permissions" en "Access Permissions" de volgende gebruikers toe te voegen: ASPNET, IUSR_[MACHINENAAM] en IWAM_[MACHINENAAM] en deze "local launch" en "local activation" rechten te geven (remote zou niet nodig moeten zijn, maar hebben we voor de zekerheid ook geprobeerd en werkte ook niet). Hiermee was de "Access denied" melding bij het aanroepen van Word weg, maar veel verder dan dat kwam het niet, het proces "WINWORD.exe" werd geopend, maar leek verder niets te doen, bij het debuggen bleek dat het bleef hangen op het volgende stukje:
Hoe lang we ook wachtte, er gebeurde niets en het bleef bezig met laden, het leek erop dat Word ergens op wachtte, bijvoorbeeld op een actie van de gebruiker.
We hebben "Full control" rechten gegeven aan de map waarin documenten geüpload worden en welke vervolgens worden geopend. Ook hebben we geprobeerd om dezelfde rechten op "winword.exe" in de map "C:\Program Files\Microsoft Office\Office12" te zetten, maar dat wilde ook niet helpen.
Daarna hebben we nog verschillende andere dingen gevonden en geprobeerd, maar omdat dit topic al erg lang begint te worden en ik niet alles meer precies weet, laat ik dat er maar even uit, op één ding na:
Andere aanpak / idee
Als laatste kregen we nog het idee om een console programma te maken die op dezelfde manier het openen en opslaan van documenten doet regelen, dit gingen we dan aanroepen via ASP.NET op de volgende manier:
Wij dachten dus om op deze manier het probleem te omzeilen, omdat we dan de console applicatie aanroepen en die applicatie laten draaien met een administrator account, dat zou in ieder geval een stuk veiliger moeten zijn dan heel ASP.NET als administrator te laten draaien (of vergissen we ons hierin?). Helaas werkte dit ook niet, we kregen eerst een "Application failed to initialize properly" melding, na wat zoeken kwam ik dit artikel tegen, waarmee ik die melding heb kunnen oplossen. Hierna kregen we weer het probleem dat het proces blijft hangen op de Open functie van Microsoft.Office.Interop.Word.
En nu..?
Er zijn zoiezo nog dingen waar we rekening mee moeten houden als we dit ooit werkend krijgen, zoals wat er gaat gebeuren als er meerdere dit tegelijk gebruiken (hoewel dit waarschijnlijk niet gaat gebeuren)?
Wat zien wij over het hoofd? Het moet wel mogelijk zijn lijkt me? Want het werkt wel als we de gebruiker die IIS gebruikt toevoegen aan administrators, maar dat is natuurlijk een slecht idee... Zijn er nog ergens bepaalde rechten in Windows die we moeten geven of is er nog iets anders aan de hand?
Nog een laatste ding
Alternatieven geven omdat Office zo eigenlijk niet gebruikt hoort te worden mag natuurlijk altijd, maar ga au.b. niet flamen door alleen te zeggen dat dit niet goed is en we ermee moeten stoppen of zo.
Wij hebben verschillende website's die gebruik maken van ons CMS/DMS, hierbij hebben we een HTMLEditor gemaakt zodat gebruikers gemakkelijk zelf de content van hun site kunnen aanpassen.
Nu willen sommige gebruikers graag dat ze complete Office Word en OpenOffice Writer documenten kunnen importeren via de website en zo deze gemakkelijk op hun site kunnen zetten en hier zit nu het probleem, hiervoor willen we Microsoft.Office.Interop.Word gebruiken voor Word om het document daarmee te openen en op te slaan als HTML, maar daar lopen tegen een aantal problemen aan.
De HTML die Word maakt is natuurlijk erg vies en wil je nooit op een website hebben, maar daarvoor gebruiken we HTMLTidy, om de HTML op te schonen, maar daar gaat dit topic niet over.
Voordat jullie meteen gaan zeggen dat Office hier niet voor gemaakt is enzo, dat weten we, we hebben ook dit artikel gelezen, maar het moet toch wel kunnen?
Op zoek naar oplossingen
Toen we het in het begin hadden gemaakt leek het allemaal goed te werken, documenten werden netjes geopend, opgeslagen als HTML en gesloten. Maar... dit was tijdens het ontwikkelen en testen in Visual Web Developer Express 2008, welke zijn eigen webserver (Visual Studio Development Server) heeft en standaard ook gebruikt.
Daarna zijn we gaan testen in IIS, maar daar kwam dus het grote probleem, daarmee werkte het niet. Word werd wel opgestart, maar daarbij kregen we een 'Access denied' foutmelding bij Word en 'Server execution failed' bij Writer.
Hierna zijn we dus gaan onderzoeken wat het probleem kan zijn en het bleek al snel dat het een rechten probleem is. IIS maakt gebruik van een gebruiker ASPNET, welke heel beperkte rechten heeft. Visual Studio Development Server gebruikt het account waarmee je bent ingelogd (welke, in mijn geval, administrator rechten heeft). Toen had ik geprobeerd om mijn eigen gebruikers-account te gebruiken voor ASP.NET, dmv de impersonate instelling van de web.config en toen werkte het ook met IIS.
Daarna heb ik een nieuwe gebruiker gemaakt (genaamd test) in Windows en die administrator gemaakt, om te testen, en die in ASP.NET gebruikt, dit werkte ook. Omdat het natuurlijk niet slim is om gebruik te maken van een account met administrator rechten voor ASP.NET is dit geen goede oplossen en dus gingen we verder zoeken naar wat voor rechten meneer test moet hebben om dit te kunnen.
We kwamen al snel iets tegen dat je dcomcnfg moest gebruiken om aan "Microsoft Office Word 97 - 2003 document" de gebruikers die gebruikt worden door IIS toe te voegen zodat ze die mogen opstarten. We hebben dat toen gedaan door bij "Launch and Activation Permissions" en "Access Permissions" de volgende gebruikers toe te voegen: ASPNET, IUSR_[MACHINENAAM] en IWAM_[MACHINENAAM] en deze "local launch" en "local activation" rechten te geven (remote zou niet nodig moeten zijn, maar hebben we voor de zekerheid ook geprobeerd en werkte ook niet). Hiermee was de "Access denied" melding bij het aanroepen van Word weg, maar veel verder dan dat kwam het niet, het proces "WINWORD.exe" werd geopend, maar leek verder niets te doen, bij het debuggen bleek dat het bleef hangen op het volgende stukje:
C#:
1
2
3
4
5
| WordApp.Documents.Open( ref lvFileName, ref lvUnknown, ref lvUnknown, ref lvUnknown, ref lvUnknown, ref lvUnknown, ref lvUnknown, ref lvUnknown, ref lvUnknown, ref lvUnknown, ref lvUnknown, ref lvUnknown, ref lvUnknown, ref lvUnknown, ref lvUnknown, ref lvUnknown); |
Hoe lang we ook wachtte, er gebeurde niets en het bleef bezig met laden, het leek erop dat Word ergens op wachtte, bijvoorbeeld op een actie van de gebruiker.
We hebben "Full control" rechten gegeven aan de map waarin documenten geüpload worden en welke vervolgens worden geopend. Ook hebben we geprobeerd om dezelfde rechten op "winword.exe" in de map "C:\Program Files\Microsoft Office\Office12" te zetten, maar dat wilde ook niet helpen.
Daarna hebben we nog verschillende andere dingen gevonden en geprobeerd, maar omdat dit topic al erg lang begint te worden en ik niet alles meer precies weet, laat ik dat er maar even uit, op één ding na:
Andere aanpak / idee
Als laatste kregen we nog het idee om een console programma te maken die op dezelfde manier het openen en opslaan van documenten doet regelen, dit gingen we dan aanroepen via ASP.NET op de volgende manier:
C#:
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
40
41
42
| public string GetHtml(string pvConvertedLocation, string pvFileLocation, string pvUsername, string pvPass, string pvDomain) { string lvHTML = ""; System.Diagnostics.Process lvProcess = new System.Diagnostics.Process(); lvProcess.StartInfo.FileName = Server.MapPath(@"bin\ParseDoc.exe"); lvProcess.StartInfo.Arguments = pvConvertedLocation + " " + pvFileLocation; lvProcess.StartInfo.UseShellExecute = false; lvProcess.StartInfo.RedirectStandardOutput = true; lvProcess.StartInfo.Domain = pvDomain; lvProcess.StartInfo.UserName = pvUsername; lvProcess.StartInfo.RedirectStandardInput = true; lvProcess.StartInfo.RedirectStandardError = true; lvProcess.StartInfo.RedirectStandardOutput = true; Char[] lvCharArray = pvPass.ToCharArray(); System.Security.SecureString lvSecurePassword = new System.Security.SecureString(); foreach (char lvChar in lvCharArray) { lvSecurePassword.AppendChar(lvChar); } lvProcess.StartInfo.Password = lvSecurePassword; try { if (lvProcess.Start()) { lvHTML = lvProcess.StandardOutput.ReadToEnd(); } else { lvHTML = "fout"; } } catch (Exception lvException) { lvHTML = lvException.ToString(); } return lvHTML; } |
Wij dachten dus om op deze manier het probleem te omzeilen, omdat we dan de console applicatie aanroepen en die applicatie laten draaien met een administrator account, dat zou in ieder geval een stuk veiliger moeten zijn dan heel ASP.NET als administrator te laten draaien (of vergissen we ons hierin?). Helaas werkte dit ook niet, we kregen eerst een "Application failed to initialize properly" melding, na wat zoeken kwam ik dit artikel tegen, waarmee ik die melding heb kunnen oplossen. Hierna kregen we weer het probleem dat het proces blijft hangen op de Open functie van Microsoft.Office.Interop.Word.
En nu..?
Er zijn zoiezo nog dingen waar we rekening mee moeten houden als we dit ooit werkend krijgen, zoals wat er gaat gebeuren als er meerdere dit tegelijk gebruiken (hoewel dit waarschijnlijk niet gaat gebeuren)?
Wat zien wij over het hoofd? Het moet wel mogelijk zijn lijkt me? Want het werkt wel als we de gebruiker die IIS gebruikt toevoegen aan administrators, maar dat is natuurlijk een slecht idee... Zijn er nog ergens bepaalde rechten in Windows die we moeten geven of is er nog iets anders aan de hand?
Nog een laatste ding
Alternatieven geven omdat Office zo eigenlijk niet gebruikt hoort te worden mag natuurlijk altijd, maar ga au.b. niet flamen door alleen te zeggen dat dit niet goed is en we ermee moeten stoppen of zo.
[ Voor 1% gewijzigd door Walance op 07-09-2009 16:14 . Reden: foute link ]