SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Upload Dokument über C#-Formular: Rechte Problem

Unbeantwortet Dieser Beitrag hat 10 Antworten

Ohne Rang
47 Beiträge
BenjaminG erstellt 18 Juli 2014 13:20
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich habe ein Formular, wo Dateien in eine Dokumentenbibliothek hochgeladen werden kann. In dieser Bibliothek hat der Benutzer keine Rechte. Nur das Formular darf Dokumente in die Bibliothek hochladen. Deswegen lasse ich den Upload in der Funktion

SPSecurity.RunWithElevatedPrivileges(delegate() { }

ausführen.

Leider funktioniert dies nicht! Kann es sein, dass es evtl. daran liegt, dass der System-Benutzer keine Rechte auf die Laufwerke des Benutzers hat? Wie kann ich dies umsetzen?

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 18 Juli 2014 13:37
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Du mußt Dir sämtliche Objekte ausgehend von SPSite innerhalb von RunWithElevatedPriviledges neu holen, sonst wirkt das nicht. Also ungefähr so:

using (SPSite elevatedSite = new SPSite(currentSite.ID)) {
using (SPWeb elevatedWeb = elevatedSite.OpenWeb(currentWeb.ID)) {
SPList elevatedLibrary = elevatedWeb.Lists["Library"];
// jetzt kannst Du mit elevatedLibrary arbeiten
}
}

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
47 Beiträge
BenjaminG Als Antwort am 18 Juli 2014 14:29
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich verstehe es nicht.

Ich habe Datei auf einem lokalen PC, diese soll auf Sharepoint ohne Berechtigung des Benutzers hochgeladen werden.

 

Code für Datei einlesen, usw.

SPSecurity.RunWithElevatedPrivileges(delegate()
{

using (SPSite elevatedSite = new SPSite(currentSite.ID)) {
using (SPWeb elevatedWeb = elevatedSite.OpenWeb(currentWeb.ID)) {
SPList elevatedLibrary = elevatedWeb.Lists["Library"];

}

}

});

 

Dann erhalte ich aber die Fehlermeldung: "The security validation for this page is invalid.".

Kannst du mir das näher erklären?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 18 Juli 2014 14:45
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Sorry, habe vergessen, daß Du ja in der Elevated Site etwas verändern möchtest. Baue direkt nach dem using SPWeb folgendes ein:

elevatedWeb.AllowUnsafeUpdates = true;

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
47 Beiträge
BenjaminG Als Antwort am 18 Juli 2014 15:24
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Jetzt funktioniert es!

Aber leider nicht von Netzlaufwerken, sondern nur von den Laufwerken eines PCs/ Laptops. Idee?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 18 Juli 2014 16:00
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich dachte die Dateien werden hochgeladen? Beim Server kommt in dem Fall nur eine Folge von Bytes an und es ist ihm völlig egal woher die stammen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
47 Beiträge
BenjaminG Als Antwort am 21 Juli 2014 07:24
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ja genau, die Dateien werden hochgeladen.

Wie wäre der Code dazu?

Ohne Rang
47 Beiträge
BenjaminG Als Antwort am 21 Juli 2014 08:29
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Der Code habe ich bis jetzt wie folgt:
                FileStream fStream = File.OpenRead(sFilePath);
                byte[] aContents = new byte[fStream.Length];
                fStream.Read(aContents, 0, (int)fStream.Length);
                fStream.Close();

                SPSecurity.RunWithElevatedPrivileges(delegate()
                {
                    using (SPSite oSite = new SPSite(this.sUrlSiteCollection))
                    {
                        using (SPWeb oWeb = oSite.OpenWeb())
                        {
                            oWeb.AllowUnsafeUpdates = true;

                            SPFileCollection oFileCollection = oWeb.Folders[sDocumentLib].Files;
                            SPFile currentFile = oFileCollection.Add(sFileNameForLib, aContents, oMetaData, true);

                            oWeb.AllowUnsafeUpdates = false;
                        }
                    }
                });

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 21 Juli 2014 08:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Fast genauso, wie Du es auch in einer normalen ASP.NET-Anwendung machen würdest ;-)

Das FileUpload-Control liefert Dir über seine PostedFile-Eigenschaft Informationen über die hochgeladene Datei. PostedFile.InputStream liefert Dir den Inhalt der Datei als Stream. Damit lädst Du die Datei in ein Byte-Array und dieses wiederum kannst Du direkt verwenden, um eine Datei anzulegen (SPFileCollection.Add)

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
47 Beiträge
BenjaminG Als Antwort am 21 Juli 2014 11:19
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich habe einen Mehrfachupload. Wie kann ich dies umsetzen?

Wie wird dies in Sharepoint 2010 umgesetzt?

Habe es bis jetzt so umgesetzt:

Auswahl der einzelnen Datei über FileUpload. Danach Buttonklick auf Hinzufügen, dann wird der Eintrag zur einer Listbox (nur Adresse der Datei) hinzugefügt.

Sobald auf Speichern geklickt wird, geht dieser durch die Liste durch und lädt die Datei hoch.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 21 Juli 2014 11:51
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="BenjaminG"]Ich habe einen Mehrfachupload.[/quote]

Sag das doch gleich - das ist um einiges komplizierter...

Das FileUpload-Control behält die datei nicht über mehrere Postbacks hinweg und das heißt Du mußt die Dateien iirgendwo auf dem Server zwischenspeichern. Also nach jeder Datei diese einlesen und irgendwo parken, z.B. im Temp-Ordner des Servers. Und natürlich dafür sorgen, daß der Temp-Ordner nicht überquillt, d.h. auch bei einem vorzeitigen Abbruch die Dateien wieder entfernen.

Viele Grüße
Andi
af @ evocom de
Blog