Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Doc zu Txt mit ASP?
haudi
myCSharp.de - Member



Dabei seit:
Beiträge: 30

Themenstarter:

Doc zu Txt mit ASP?

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Rene Paschold
myCSharp.de - Member

Avatar #avatar-1620.jpg


Dabei seit:
Beiträge: 385
Herkunft: BW->Enzkreis->Straubenhardt

beantworten | zitieren | melden

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/
private Nachricht | Beiträge des Benutzers
haudi
myCSharp.de - Member



Dabei seit:
Beiträge: 30

Themenstarter:

beantworten | zitieren | melden

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 ?
private Nachricht | Beiträge des Benutzers
haudi
myCSharp.de - Member



Dabei seit:
Beiträge: 30

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Rene Paschold
myCSharp.de - Member

Avatar #avatar-1620.jpg


Dabei seit:
Beiträge: 385
Herkunft: BW->Enzkreis->Straubenhardt

beantworten | zitieren | melden

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/
private Nachricht | Beiträge des Benutzers
ikaros
myCSharp.de - Member



Dabei seit:
Beiträge: 1787

beantworten | zitieren | melden

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).
private Nachricht | Beiträge des Benutzers
haudi
myCSharp.de - Member



Dabei seit:
Beiträge: 30

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
haudi
myCSharp.de - Member



Dabei seit:
Beiträge: 30

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Peter Bucher
myCSharp.de - Experte

Avatar #jVxXe7MDBPAimxdX3em3.jpg


Dabei seit:
Beiträge: 6141
Herkunft: Zentralschweiz

beantworten | zitieren | melden

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

- https://peterbucher.ch/ - Meine persönliche Seite
- https://fpvspots.net/ - Spots für FPV Dronenflüge
private Nachricht | Beiträge des Benutzers
haudi
myCSharp.de - Member



Dabei seit:
Beiträge: 30

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers