kovi22
Goto Top

ASP Fehlermeldung - Erlaubnis Verweigert

Hallo!
Kurz zu mir, da ich neu auf dieser Seite bin. Mein Name ist Markus, 19, und komme aus Österreich.
Ich bin auf dem Gebiet "Programmierung mit VBScript" noch relatvi neu und sitze seit einigen Monaten an meinem ersten Projekt, ein kleiners Programm. Da hat mir schon die ein oder andere Fehlermeldung zu schaffen gemacht face-smile

Jetzt zum eigentlichen Problem:

Im Browser bekomme ich folgende Fehlermeldung:

..."Laufzeitfehler in Microsoft VBScript Fehler "800a0046'
...Erlaubnis verweigert.
.../helpdesk/auslesen_in_txt.asp, Zeile 20 "


Hier mein Code:

<%
' FileSystemObject objFs oeffnen
Set objFs= CreateObject("Scripting.FileSystemObject")

' Dateiname festlegen
strDateiname = Server.MapPath("/testdatei.txt")

' Einen Textstream (objTextStream) zur Textdatei oeffnen
Set objTextStream = objFs.CreateTextFile(strDateiname, True) 'Zeile 20

' Inhalt fuer Datei in String strWriteString speichern:
strWriteString = "Text fuer die Datei"

' String in Datei schreiben:
objTextStream.Write strWriteString

' Objekte schliessen
objTextStream.Close
Set objTextStream = Nothing
Set objFs = Nothing

Response.Write "Der folgende Inhalt wurde in die Datei "
Response.Write strDateiname & " geschrieben:<BR>"
Response.Write Replace(Server.HTMLEncode(strWriteString) , _
vbCrLf,"<BR>" & vbCrLf)
%>

Kann an den Berechtigungen liegen (sagt zumindest Google) obwohl ich schon so ziemlich volle Berechtigungen vergeben habe.


Ich benutze einen Windows Server 2008 mit IIS7 und hoffe auf eure Hilfe.


MfG
Kovi

Content-ID: 184245

Url: https://administrator.de/contentid/184245

Ausgedruckt am: 25.11.2024 um 09:11 Uhr

Arano
Arano 29.04.2012 um 13:26:40 Uhr
Goto Top
Hi Kovi,

Ich habe zwar keinen Schimmer vom IIS, ASP und VBScript (verwende Apache und PHP) aber die Funktionsnamen haben mich etwas stutzig werden lassen.
Folgender Abschnitt:
' Dateiname festlegen  
strDateiname = Server.MapPath("/testdatei.txt")  

' Einen Textstream (objTextStream) zur Textdatei oeffnen  
Set objTextStream = objFs.CreateTextFile(strDateiname, True) 'Zeile 20  

Server.MapPath() ...
  1. Warum den ganzen Aufwand, nur um einen Dateinamen vorzugeben ? Da kann doch auch eine normale Zeichenkette reichen !
  2. "Server.MapPath" klingt auch gaaanz anders als das vorhaben einen Dateinamen zu definieren: "Server binde Pfad ein" - Laufwerke werden doch eingebunden, "gemappt".

Und siehe da, einfach in der MSDN nachgeschlagen: MSDN - Server.MapPath

Zudem, __und das ist der Auslöser der Fehlermeldung__, gibt dieses Funktion nichts zurück !
strDateiname ist also LEER !
So kann das Vorhaben in Zeile 20, eine Datei zu erstellen, auch nicht funktionieren !


Tipp:
Oft findet man Fehler schon, wenn man sich in einem Fehlerfall ALLE beteiligten Variablen und Objekte ausgeben/anzeigen lässt...
So wäre hier aufgefallen das "strDateiname" eine leere Variable ist ;)


Viel Erfolg weiterhin
~Arano
Kovi22
Kovi22 29.04.2012 um 14:24:23 Uhr
Goto Top
Hallo und danke für die Antwort!

Was ich allerdings komisch finde, ist, dass es unter VIsta mit IIS funktioniert ohne Mänchen zu machen.

Aber auf dem Virtual Server 2008 nicht. Da kommt die Fehlermeldung, also glaube ich eher weniger, dass es am Code selbst liegt, sondern an irgendeiner Einstellung.


Btw.: Wie meinst du hätte ich es einfacher lösen sollen? So nebenbei, den Code habe ich mir aus dem Internet zusammengestöpselt. (Habe gedacht, solangs funktioniert, warum nicht)

Schönen Sonntag!
LG
Kovi
Arano
Arano 29.04.2012 um 15:20:21 Uhr
Goto Top
Hi.

Hm.. das wusste ich natürlich nicht !
Aber auch dafür kann ich mir zur Erklärung etwas "ausdenken" :P
Etwas, das mir vorher schon ähm... aufgefallen war.

  • Woher weist du, ob die Datei wirklich erstellt wurde ?
  • Wie kannst du dir sicher sein, das wirklich in die Datei geschrieben wurde ?
Und da hängen auch gleich weitere Fragen dran:
  • Was soll passieren wenn die Datei nicht erstellt werden konnte ? (z.B. fehlende Rechte)
  • Was soll passieren wenn nicht in die Datei geschrieben werden konnte ? (z.B. volle Datenfestplatte)

Das sind Dinge die man eigentlich beim Programmieren mit überlegen und behandeln sollte:
z.B.
Wenn die Datei nicht erstellt werden kann. dann macht es wenig Sinn zu versuchen etwas hinein zu schreiben - das wird logischerweise auch in die Hose gehen. Es werden weiterhin unschöne Fehlermeldungen generiert und in deinem Fall würde sogar die Endausgabe einfach falsch sein weil ja nichts geschrieben werden konnte - ohne existierender Datei.

Aber ich habe dazu nichts gesagt weil ich das als Anfänger nicht anders gemacht habe, Hauptsache das was ich will funktioniert JETZT SOFORT :D

Okay, mal wieder zurück zu deinem Problem.
Warum ich das alles nun doch aufgelistet habe ist folgendes.
Was passiert, wenn die Fehlermeldung des fehlgeschlagenen Versuches eine Datei zu erstellen auf dem Vista-Rechner einfach ignoriert/unterdrückt wurde... (IIS- oder ASP-Konfiguration, da habe keine Ahnung, nur diese Vermutung)
Richtig ! Man bekommt die Anzeige das etwas in die Datei geschrieben wurde ABER ob das tatsächlich der Fall war, das weiss man so nicht !

Probiere doch mal folgendes:
  1. Kommentiere ALLES unter strDateiname = ... aus und lasse dir den Inhalt von dieser Variabel ausgeben Response.Write "Variable: ###-" & strDateiname &"-###"
    (Durch die Rauten-Bindestrich-Kombination sieht man genau wo der Inhalt der Variabel stehen sollte - falls er fehlt oder falsch ist)
  2. Ersetze den angegebenen Dateinamen durch eine absolute Pfadangabe (C:\pfad_zur\Datei.ext)
  3. Probiere den relativen und den absoluten Dateipfad direkt in Zeile 20 CreateTextFile()

Ich bin mir allerdings ziemlich sicher, das die Ausgabe von "strDateiname" leer sein wird, das sagt ja auch die Methodenbeschreibung im MSDN. So ist es dann nur logisch, das das Erstellen der Datei fehlschlägt - ohne gültigen Dateinamen.

strDateiname = Server.MapPath(...)
' speicher den Rückgabewert von MapPath() in die Variable "strDateiname"  
' was gibt die Method zurück ? Rückgabewert = NICHTS !  
' strDateiname = NICHTS  

Set objTextStream = objFs.CreateTextFile(strDateiname, True)
' speicher den Rückgabewert von CreateTextFile() in die Variable "objTextStream"  
' was gibt die Method zurück ? Rückgabewert = i/o-Stream auf die Datei "strDateiname" !  
' was gibt die Method zurück ? Rückgabewert = i/o-Stream auf die Datei NICHTS !  
' objTextStream = i/o-Stream auf die Datei NICHTS  
' Wobei es dabei logischerweise zu einer Fehlermeldung kommen MUSS, denn eine Datei "NICHTS" kann niemals erstellt, geöffnet, beschrieben, geschlossen, umbenannt, verschoben oder gelöscht werden.  

Also wenn der Inhalt der Variable "strDateiname" nun wirklich leer ist, definiere die Variabel erneut mit dem Wert des Dateipfades:
strDateiname = "/testdatei.txt"
und dann sollte es schon wieder funktionieren (sofern es nicht weitere Fehler gibt, z.B. die von die erwähnten Dateirechte)


~Arano
Kovi22
Kovi22 29.04.2012 um 15:48:45 Uhr
Goto Top
Hallo Arano! Danke nochmal.

Ich muss mich allerdings wiederholen: unter Vista hat ALLES geklappt. Die Datei wurde erstellt und "Text fuer die Datei" wurde in die Datei geschrieben. Genau so, wie es sein soll.

Jetzt werd ich erstmal deine Ratschläge durchprobieren und weitertüffteln und mir auch einiges davon für die Zukunft merken face-smile

Ich meld mich später wieder.

LG
Kovi
Kovi22
Kovi22 29.04.2012 um 17:19:04 Uhr
Goto Top
EDIT:

So, also strDateiname ist NICHT leer. Sie gibt den physikalischen Pfad der "testdatei.txt" aus. Also in etwa C:\inetpub\wwwroot\testdatei.txt
Deine anderen Vorschläge führen leider auch zu keiner Lösung des Problems.


Was ich gerade entdeckt habe: Bei der Rechtevergabe kann ich bei ERSTELLER-BESITZER keine Veränderung vornehmen. Wenn ich also den Haken reinsetze und auf übernehmen drücke, springt er wieder raus. Logischerweise kann das doch garnicht funktionieren, wenn also ich bzw. das Skript der Ersteller ist und daher keine Schreibrechte hat. Sehe ich das richtig?
Arano
Arano 29.04.2012 um 17:30:43 Uhr
Goto Top
Aber, aber, aber...

Hier gleich noch ein Tipp: Richtig lesen !
In der MSDN steht:
Return values:
This method has no return values.
Was für mich ziemlich eindeutig ist.
Allerdings musste ich mich ja gerade eines besseren belehren lassen und habe noch mal nachgelesen und siehe da:
Parameter:
path
...the MapPath method __returns a path__ as if Path were a full, virtual path. If Path doesn't start with a slash, the MapPath method __returns a path__ relative to the directory of the .asp file being processed.


Gut, dann lag es doch nicht daran, entschuldige soweit für die falschen Infos, mein Fehler.
So ein Mist aber auch, ich war mir so sicher, sonst hätte ich mich auch gar nicht erst beteiligt


Dann sind es vielleicht doch die Dateirechte.
Wie es beim IIS mit Windows ist weis ich wie gesagt nicht aber beim Apache mit Linux ist es so das der Webserver seinen eigenen Benutzer hat (z.B. "www-run"). Dieser muss natürlich entsprechende Berechtigungen für den Ordner besitzen um in ihm arbeiten zu können. Hier wäre das deinem Beispiel nach der Ordner "C:\inetpub\wwwroot". Entweder der Ordner gehört dem Webserver-User, er gehört zu der Webserver-Gruppe oder er ist komplett für alle freigegeben.

Steht vielleicht mehr in den Logfiles des IIS ? (oder ist das bei Windows das Event-/Systemlog)


~Arano
Edi.Pfisterer
Edi.Pfisterer 30.04.2012 um 11:01:38 Uhr
Goto Top
Hallo!
Das Problem liegt daran, dass Vista IIS 6.x verwendet, Server 2008 IIS 7.x
Und unter IIS 7 sind "übergeordnete Pfade" standardmäßig deaktiviert...

hier ein Lösungsansatz:
http://learn.iis.net/page.aspx/566/classic-asp-parent-paths-are-disable ...

oder in der Commandshell:
appcmd set config /section:asp /enableParentPaths:True

gutes Gelingen,
lg