Laden...

UnAuthorizedAccessException im IIS beim Serialisieren von Objekten

Erstellt von Ploetzi vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.748 Views
Ploetzi Themenstarter:in
313 Beiträge seit 2006
vor 13 Jahren
UnAuthorizedAccessException im IIS beim Serialisieren von Objekten

Ich schreibe diverse serialisierte Objekte auf

C:\Program Files\myapp\test.xml
etc.

Dort erhalte ich eine UnAuthorizedAccessException beim IIS. Kann mir jemand sagen, wie ich das erlauben kann, dass er dort mit dem StreamWriter schreibt?
Das lesen klappt ja.

Bzw. Wo darf ich lesen und schreiben ?
Im eigenen BIN Ordner ist es schlecht, weil er dann laufend neu kompiliert,..

Grüsse,

Andreas

2.891 Beiträge seit 2004
vor 13 Jahren

Zitat von: Exemplarische Vorgehensweise: Anzeigen eines XML-Dokuments in einer Web Forms-Seite mithilfe von Transformationen
Wenn Sie die XML-Datei in den Ordner App_Data verschieben, verfügt sie automatisch über die erforderlichen Berechtigungen, damit ASP.NET die Datei zur Laufzeit lesen und in sie schreiben kann.Zusätzlich wird die Datei vor der Darstellung in einem Browser geschützt, da der Ordner App_Data als nicht durchsuchbar gekennzeichnet ist.

Ploetzi Themenstarter:in
313 Beiträge seit 2006
vor 13 Jahren

Dank!
Der ist auf gleicher Höhe wie der Bin ordner,.. oder??
Wie finde ich den Pfad hierhin?
Kann ich da alles reinschreiben?

2.891 Beiträge seit 2004
vor 13 Jahren

Du bekommt noch einen Screenshot von mir und den Hinweis auf MapPath.
Der Rest fällt unter [Hinweis] Wie poste ich richtig? Punkt 1.1

Ploetzi Themenstarter:in
313 Beiträge seit 2006
vor 13 Jahren

Hallo,

Herzlichen Dank, leider haben wir aneinander vorbeigeredet.
Den Ordner kannte ich bereits. Allerdings möchte ich z.b. mittels Streamwriter darauf schreiben und lesen.

mfg

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

den Pfad findest Du mit "~/App_Data/", Berechtigungen zum lesen und schreiben hast Du da i.d.R. automatisch.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

Ploetzi Themenstarter:in
313 Beiträge seit 2006
vor 13 Jahren

Das ist ja sehr eigenartig, normalerweise sind pfade unter windows ja mit

\

Das bedeutet der Streamwriter funktioniert auch mit einem /

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

so war's nicht gemeint. HTTP-Pfade werden ja im allgemeinen mit '/' angegeben.
Die Tilde (~) steht für das Root-Verzeichnis der aktuellen Anwendung (auch bei virtuellen Verzeichnissen). Um daraus den physikalischen Pfad zu erhalten, gibt es die MapPath-Methode in HttpServerUtility (eine instanz dieser Klasse steckt im Server-Property der Page)

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

Ploetzi Themenstarter:in
313 Beiträge seit 2006
vor 13 Jahren

Es handelt sich nur hierbei um keine Page, sondern um eine normale Klasse, die beim Start des Programmes XML aufruft. Das habe ich nicht erwähnt.

Die Klasse soll auf eine XML schreiben. Leider finde ich aber keinen Pfad wo ich die XML hingeben kann, damit er nicht unauthorized ist.

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo Ploetzi,

um was für eine Art Klasse handelt es sich denn, wenn sie im IIS gehostet wird?
Bzw. wie besteht bei Dir der Zusammenhang zwischen Klasse und IIS?
Irgendwo muss es doch eine Web-Anwendung geben...

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

Ploetzi Themenstarter:in
313 Beiträge seit 2006
vor 13 Jahren

Hallo Marsstein,
es ist im Endeffekt ein Singleton, welches beim Programmstart aufgerufen wird. Von der Global.ashx

Die Klasse, deserialisiert eine XML. Allerdings klappt das nicht, aufgrund des Pfades.
Wenn ich das ganze ausserhalb platziere kann ich lesen, aber nicht speichern.

Es geht um die loadSettings Methode.

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Collections;
using System.Collections.Generic;
namespace at.rctec.WebServerMobile
{
    public class Settings
    {
        public struct setting
        {
            public string name;
            public string value;
        }
        static Settings instance = null;
        public static Settings getInstance()
        {
            if (instance == null)
                instance = new Settings();
            return instance;
        }
        public List<setting> lsettings=new List<setting>();

        public Settings()
        { 
        }
        public void loadSettings()
        {
            

            string data = Functions.ReadFile(main.getInstance().app_path  +"\\Data\\settings2.xml");
            if (data.Length > 0)
            {
                lsettings = (List<setting>)ObjectSerializer.DeserializeObjectFromString(data, typeof(List<setting>));
               
            }
            else
            {
          System.Diagnostics.Debug.WriteLine( "Datei zu kurz,nicht vorhanden?:" + main.getInstance().app_path);
            }
            main.getInstance()._WriteLog("Anzahl der geladenen Settings:" + lsettings.Count.ToString(), "MyLoginHandler.loadrights()", "Info", "", 3);
         
        }
        public string getSetting(string settingbezeichnung)
        {
            if(lsettings.Count==0)
                loadSettings();
            for (int i = 0; i < lsettings.Count; i++)
            {
                if (lsettings[i].name == settingbezeichnung)
                {
                    System.Diagnostics.Debug.WriteLine("Setting:" + settingbezeichnung + "Wert:" + lsettings[i].value);
                    return lsettings[i].value;
                }
            }
            return "";
        }
        public bool setSetting(string settingbezeichnung,string value)
        {
            try
            {
                for (int i = 0; i < lsettings.Count; i++)
                {
                    if (lsettings[i].name == settingbezeichnung)
                    {
                        lsettings.RemoveAt(i);
                        setting x;
                        x.name = settingbezeichnung;
                        x.value = value;
                        lsettings.Add(x);
                        string content = ObjectSerializer.SerializeObjectToString(lsettings, new Type[] { typeof(List<setting>), typeof(setting) });
                        Functions.WriteFile(main.getInstance().app_path + "\\Data\\settings2.xml", content);
                        return true;
                    }
                }
                return false;
            }
            catch(Exception e)
            {
                System.Diagnostics.Debug.WriteLine("Exception beim Setzen:"+e.ToString());
                return false;
            }
        }


    }
}

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

in der Global.asax hast Du bereits Zugriff auf den HttpContext, ggf. über den statischen HttpContext.Current. Dieser enthält ebenfalls das Server-Objekt.
Du müsstest dort Deinen Pfad bestimmen und der Klasse bzw. Methode mitgeben.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

Ploetzi Themenstarter:in
313 Beiträge seit 2006
vor 13 Jahren

Nja, den Pfad kenn ich ja bereits, weil ja der App_data ordner real existiert, aber wenn ich den absolut eingebe, so kann ich zwar lesen aber nicht schreiben.

Kann man dem IIS bzw asp.net nicht einfach erlauben auf einen gewissen ordner zu schreiben?

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

hast du den App_Data-Ordner von Hand angelegt? Das würde ggf. die fehlende Berechtigung erklären.

Du kannst natürlich auch Schreibrechte vergeben, normalerweise läuft ASP.net unter dem Konto "Netzwerkdienst", oder unter "ASPNET" (vor Vista glaub ich).

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

Ploetzi Themenstarter:in
313 Beiträge seit 2006
vor 13 Jahren

Ok. Cool. Ich habe einen User namens ASPNET.
(Über net user herausgefunden)
Wenn ich diesem nun Adminrechte gebe, müsste alles klappen , oder?

Wie mache ich das?

2.891 Beiträge seit 2004
vor 13 Jahren

Ich habe einen User namens ASPNET.[...]Wenn ich diesem nun Adminrechte gebe, müsste alles klappen, oder?

Bist du verrückt? Du kannst dem ASPNET-Konto doch nicht einfach nen Blankoschein für den Zugriff auf dein gesamtes System geben.
Wie man einem bestimmten Benutzer Schreibrechte auf ein bestimmtes Verzeichnis gibt, sind nun aber wirklich Grundlagen.

Gruß,
dN!3L

V
162 Beiträge seit 2010
vor 13 Jahren

Argh,
Adminrecht?
Das geht sicher auch anders.

Das Leben ist schön!

Ploetzi Themenstarter:in
313 Beiträge seit 2006
vor 13 Jahren

Argh,
Adminrecht?
Das geht sicher auch anders.

Das ist mir schon bekannt, dass das ein Blankoscheck ist, wär nur eine Übergangslösung gewesen für eine interne intranetsoftware, bis ich das richtig hinbekomme.

Ploetzi Themenstarter:in
313 Beiträge seit 2006
vor 13 Jahren

Ich bekomme immer den Fehler:

2.891 Beiträge seit 2004
vor 13 Jahren

Ich bekomme immer den Fehler

Und deine Frage ist?
Hast du die Benutzerrechte gesetzt? Hast du auch spaßeshalber mal den IUSR-Benutzer angeguckt?

Und beachte bitte [Hinweis] Wie poste ich richtig? Punkt 6.1.

Gruß,
dN!3L