Laden...

Doc zu Txt mit ASP?

Erstellt von haudi vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.970 Views
H
haudi Themenstarter:in
30 Beiträge seit 2005
vor 18 Jahren
Doc zu Txt mit ASP?

Hallo, kennt vielleicht jemand nen Link zu einem C#-Codeschnipsel in dem aus einer Word Doc Datei eine Txt Datei erstellt wird ? Letzten Endes soll einfach der Klartext der Worddatei in ein Byte-Array geschrieben werden, ohne dass großartig externe Tools eingesetzt werden müssen...

Ich hab schon versucht mit dem "Automating Word" zu arbeiten:
http://www.dotnet247.com/247reference/msgs/26/131289.aspx

Aber das funktioniert nicht mit ASP.NET sondern nur, wenn der Code client-mässig ausgeführt werden soll 😭
Will man das serverseitig nutzen kommt eine "Zugriff verweigert" - Fehlermeldung, wenn das
Word.ApplicationClass WordApp = new Word.ApplicationClass();

  • Objekt instanziert werden soll (scheint irgendwie an den Rechten des ASPNET Users zu liegen).
    Hab auch schon versucht, per dcomcnfg die dcom Einstellung für das "Microsoft Word Document" zu ändern, aber diesen Eintrag gibts leider garnicht ???!

Hat jemand eine Idee ??

Danke
H.

381 Beiträge seit 2004
vor 18 Jahren

Was genau willst du denn machen? Ein Word Dokument vom Client auf dem Server ändern? Wenn ja dann geht das nicht so einfach. Du musst dann das Word Dokument erst zum Server übertragen, dort evtl. in einem Temp. Verzeichnis ablegen das entsprechende Rechte hat und dann kannst du mit dem von dir genannten Artikel auch das TXT File schreiben.

Wichtig ist das der ASP.NET User auf dem Verzeichnis entsprechende Rechte hat. Wenn du natürlich mit der integrierten Sicherheit arbeitest muss der User bzw. die Gruppe die entsprechenden Rechte haben.

Mit freundlichen Grüßen

René Paschold
.NET Developer / Trainer / Speaker / Author /
Projectleader / Software-Architect


.blog http://www.rene-paschold.de/
.business http://www.smarthouse.de/

H
haudi Themenstarter:in
30 Beiträge seit 2005
vor 18 Jahren

Hallo, danke erstmal für die schnelle Antwort...
An den Verzeichnisrechten kann es nicht liegen, da ich den Ordner bereits entsprechend freigegeben hatte und auch andere Operationen in diesem ausführen kann.
Diese Fehlermeldung erhalte ich:

Exception: System.Web.Services.Protocols.SoapException: Der Server konnte die Anforderung nicht verarbeiten. ---> System.UnauthorizedAccessException: Zugriff verweigert

Und an dieser Stelle:

Word.ApplicationClass newApp = new ApplicationClass();

Das heisst, das er schon Probleme mit dem Initialieren des Word-Objektes hat...
Und ich hatte eben gelesen, dass man in dcomcnfg die dcom einstellung für "Microsoft Word Document" ändern muss, und zwar dem ASPNET User die Sicherheitsrechte zum Ausführen geben. Leider gibt es bei mir in DCOM kein "Microsoft Word Document" ??
Liegt das daran, das ich Office 2003 nutze ?

H
haudi Themenstarter:in
30 Beiträge seit 2005
vor 18 Jahren

So, hab nun per Registry Eintrag den DCOM "Microsoft Word Dokument" Eintrag hinbekommen. Hab auch schon unter Sicherheit "Start und Aktivierungsberechtigungen" und "Zugriffsberechtigungen" folgenden Usern alle Rechte eingeräumt:

Administratoren
ASP.NET Machine Account
IIS Prozesskonto IWAM_Rechnername
Interaktiv
Internetgastkonto IUSR_Rechnername
Jeder
System

Bei Zugriffsberechtigung sind sogar noch die User "Selbst" und "Administrator" angegeben!

Ich erhalte trotzdem noch die gleiche Fehlermeldung.
Danach hab ich unter dem Reiter "Identität" den User unter dem ich aktuell eingeloggt bin (der hat Admin-Rechte) eingetragen => Hat nichts gebracht...

Dort kann ich leider nicht den ASP.NET oder IUSR_Rechnername angeben, da die Passwörter zu den diesen Accounts vom System verschlüsselt gegeben werden und die mir nicht bekannt sind.

Das muss doch irgendwie gehen ??????

Gruß
H.

381 Beiträge seit 2004
vor 18 Jahren

Ich kann dir da jetzt so direkt nicht helfen da ich das Problem noch nie hatte. Ich schaue heute Abend aber mal nach und versuche das ganze zu reproduzieren.. Melde mich dann spätestens morgen.

Mit freundlichen Grüßen

René Paschold
.NET Developer / Trainer / Speaker / Author /
Projectleader / Software-Architect


.blog http://www.rene-paschold.de/
.business http://www.smarthouse.de/

I
1.739 Beiträge seit 2005
vor 18 Jahren

Ich vermute das Problem ist, das Word(letztenendes wird das ja gestartet) zwingend das Recht "Interactive with Desktop benötigt". Einen Prozess mit derartigen Rechten aus einem IIS-Thread zu starten dürfte nicht ganz leicht sein(oder unmöglich).

H
haudi Themenstarter:in
30 Beiträge seit 2005
vor 18 Jahren

Hmm, auf der MSDN Seite wird eine mögliche Lösung vorgeschlagen, die ich aber schon ausprobiert habe. Dort steht aber immerhin, dass es möglich ist, indem man halt gewissen Usern per dcomcnfg die nötigen Rechte erteilt.

http://support.microsoft.com/kb/288367/DE/

H.

H
haudi Themenstarter:in
30 Beiträge seit 2005
vor 18 Jahren

So, habs nun doch hinbekommen mit den Rechten:

Hab zunächst in
WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG\machine.config

unter: <processModel...
das Attribut userName="machine" in
username="SYSTEM".
umgestellt, und neugestartet .

Unter den einbezogenen Bibliotheken hab ich:

using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Word;

Dann ruf ich jetzt Word.Application jedesmal mit geneuerer Pfadangabe auf:
Microsoft.Office.Interop.Word.ApplicationClass newApp = new...

Unter DCOM die Identität auf mein aktuelles WinXP Konto (Adminrechte)...
Die Sicherheit-Einstellungen wie oben beschrieben!

Nun erstellt er mit ASP auf dem Server die Txt aus der Doc.

Leider kommt jetzt immer ein neuer Fehler, wenn ich versuch, die Txt-Datei auszulesen:
System.IO.IOException: Der Prozess kann nicht auf die Datei dat.doc.txt zugreifen, da sie von einem anderen Prozess verwendet wird...

Liegt das an dem newApp.Documents.Open ??
Ich hab newApp.Quit drin, muss ich da vielleicht noch was freigeben bevor ich die erstellte Txt Datei öffnen darf?

Gruß
H.

5.941 Beiträge seit 2005
vor 18 Jahren

Hallo Haudi

Natürlich musst du das Word Objekt wieder freigeben, sonst sind die Dateien ja noch in Benutzung.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

H
haudi Themenstarter:in
30 Beiträge seit 2005
vor 18 Jahren

Jo, die Frage war nur, wie, da er sich erst gesträubt hatte, bzw. ihm newApp.quit und Marshal.ReleaseComObject alleine nicht gereicht hatten...
So hats bei mir (vorerst) endlich geklappt:

.
.
.

Nach Erstellung des WordObjektes und den Verarbeitungsschritten

// for closing the application and let winword.exe die
newApp.ActiveDocument.Close(ref Unknown,ref Unknown,ref Unknown);
newApp.Quit(ref Unknown,ref Unknown,ref Unknown);
System.Runtime.InteropServices.Marshal.ReleaseComObject(newApp);
newApp = null;
GC.Collect();

H.