Frage

Ich habe auf einem ASP.NET-Projekt gearbeitet, die hochgeladenen Dateien auf eine Netzwerkfreigabe speichern wird. Ich dachte, ich könnte nur ein virtuelles Verzeichnis verwenden und in Ordnung sein, aber ich habe mit Berechtigungen für Directory.CreateDirectory zu kämpfen.

Ich war in der Lage, Dateien zu, damit ich alles in einem einzigen Verzeichnis zu platzieren beschlossen, meinen Code zu ändern, aber dies erfordert mich Verwendung von File.Exists um Duplikate zu vermeiden überschrieben wird.

Nun, da ich habe alle meine Code aktualisiert, Ich habe entdeckt, dass, egal was ich tue, File.Exists immer false zurückgibt (die Datei auf jeden Fall vorhanden ist), wenn ich testen gegen die Netzwerkfreigabe.

Irgendwelche Ideen? Ich komme zum Ende meines Seils mit Netzwerkfreigaben.

War es hilfreich?

Lösung

Ich arbeite gerade vor kurzem auf ein sehr ähnliches Projekt, bei dem ich Dateien auf eine Netzwerkfreigabe speicherte. Die beiden Computer sind im gleichen Subnetz, sind aber nicht von Domänencontroller gesteuert, so dass jeder Computer seiner eigenen Benutzer hat.

habe ich einen Benutzer mit demselben Benutzernamen und Kennwort auf beiden Computern. Dann habe ich eine Netzwerkfreigabe, und legen Sie den Ordner / Freigabeberechtigungen für den Benutzer Lese- und Schreibberechtigung zu ermöglichen.

Ich habe dann die folgende Klasse, um die Identitätswechsel zu verwalten:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Security.Permissions;
using System.Text;

namespace MyProject.Business.Web
{
    public class SecurityManager
    {
        #region DLL Imports
        [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public extern static bool CloseHandle(IntPtr handle);

        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);
        #endregion

        public string Domain { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }

        private WindowsImpersonationContext m_CurrentImpersonationContext;

        [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
        public void StartImpersonation()
        {
            const int LOGON32_PROVIDER_DEFAULT = 0;
            const int LOGON32_LOGON_INTERACTIVE = 2;

            IntPtr tokenHandle = IntPtr.Zero;
            IntPtr dupeTokenHandle = IntPtr.Zero;

            // obtain a handle to an access token
            bool wasLogonSuccessful = LogonUser(UserName, Domain, Password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref tokenHandle);

            if (!wasLogonSuccessful)
                throw new Exception(String.Format("Logon failed with error number {0}", Marshal.GetLastWin32Error()));

            // use the token handle to impersonate the user
            WindowsIdentity newId = new WindowsIdentity(tokenHandle);
            m_CurrentImpersonationContext = newId.Impersonate();

            // free the tokens
            if (tokenHandle != IntPtr.Zero)
                CloseHandle(tokenHandle);
        }
        public void EndImpersonation()
        {
            m_CurrentImpersonationContext.Undo();
        }
    }
}

Dann in der ASP.NET-Seite habe ich die folgenden:

SecurityManager sm = new SecurityManager();
sm.UserName = ConfigurationManager.AppSettings["UserFileShareUsername"];
sm.Password = ConfigurationManager.AppSettings["UserFileSharePassword"];
sm.StartImpersonation();

if (!Directory.Exists(folderPath)) Directory.CreateDirectory(folderPath);

File.Move(sourcePath, destinationPath);

sm.EndImpersonation();

Andere Tipps

File.Exist nicht wirklich überprüfen Existenz einer Datei. Es prüft stattdessen für Existance von Dateien, die Sie ein gewisses Maß an Zugang zu haben. Wenn Sie die Datei vorhanden ist wissen, ist das wahrscheinlich Problem, dass Sie keinen Zugriff darauf haben kann.

Vielleicht ist Ihr Code, der (das heißt ASP.NET-Server-Code) ausgeführt wird, läuft als Benutzer (zum Beispiel des IIS-Benutzer), die nicht über die Berechtigung, dass die Netzwerkfreigabe zugreifen zu können.

Ich denke, dass IIS nicht als hoch privilegierte Benutzer ausgeführt werden soll, die durch Standardberechtigungs Aktien auf anderen Maschinen zu betrachten hat.

habe ich viel den gleichen Code, hatte aber meine Klasse die IDisposable-Schnittstelle implementieren, und hinzugefügt, um die Undo () an die Methode Dispose (). Dieser Code funktioniert gut, wenn Sie den einzigen Entwickler sind es mit und Sie werden immer Dinge tun, den richtigen Weg, nicht wahr?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top