Frage

Wir arbeiten an einem Web-Dienst, der einen 3rd-Party-Prozess, der mit einem zugeordneten Netzlaufwerk in Wechselwirkung laufen hat. Also müssen wir programmatisch von dem Web-Service dieses Laufwerk zugeordnet werden.

Ich habe bereits eingewickelt WNetAddConnection2 usw. in einer schöneren Klasse für ein anderes Projekt, so warf ich den Code direkt in.

Unser Web-Dienst unter UltiDev Cassini läuft (anstelle von IIS), die unter dem Systemkonto ausgeführt wird. Wir erhalten den Fehlercode für: „der angegebenen Gerätename ist ungültig“ jedes Mal. Ich habe auch versucht, andere Benutzer in der Datei web.config Identitätswechsel, mit dem gleichen Ergebnis.

Der Antrieb Karte nur gut, wenn ich meinen Code aus einem Konsolenprogramm unter einem normalen Benutzerkonto ausgeführt werden.

Ich habe auch versucht, das äquivalent „net use“ Befehl von C # mit den exakt gleichen Ergebnissen wie WNetAddConnection ausgeführt wird.

Wer weiß, warum ein Windows-Dienst oder System-Benutzer nicht in der Lage sein, Netzlaufwerke zuzuordnen?

Kennt jemand eine Abhilfe? Einfach Abbildung des Antriebs beim Systemstart eine Lösung sein würde, aber wie könnte das System / imitierten Benutzer Zugriff es?

Link für UltiDev Cassini: UltiDev

LÖSUNG: ich die UltiDev Cassini Dienst eingestellt unter Administrator anmelden und alles funktioniert. Der ASP-NET-Identitätswechsel darf nicht wie geplant funktionieren.

War es hilfreich?

Lösung

Das LOCAL_SYSTEM Konto stellt Anonymous Anmeldeinformationen auf dem Netzwerk . Sie könnten eine UNC-Netzwerkfreigabe verwenden, um auf diese Informationen zugreifen, vorausgesetzt, dass anonymer (Jedermann) Zugriff auf die Freigabe hat.

Sie können auch Cassini installieren als Windows-Dienst , die Sie könnten konfigurieren unter einem anderen Benutzer ausgeführt wird.

Andere Tipps

Wenn Sie das lokale Systemkonto verwenden, dann glaube ich, es ist von Natur aus nicht in der Lage den Zugriff auf Netzwerk [foo]. Ich würde sagen, Identitätswechsel Ihr einziger gangbarer Weg ist. Technisch gesehen könnten Sie Zugriffskontrollen auf dem Anteil an den Punkt reduzieren, dass jemand auf die Freigabe lesen konnte / schreiben, aber das bringt mehr Probleme als Lösungen.

Wir hatten das gleiche Problem. Das Problem tritt auf, weil das Konto der Code unter ausgeführt wird. Sie können dieses Problem umgehen, wie wir mit Hilfe der folgenden Klasse tat. Sie haben das Laufwerk im gleichen Code abzubilden Sie den Zugriff auf / Kopieren von Dateien verwenden. Das Muster, das wir verwenden, ist es, immer zu überprüfen t sehen, ob das Laufwerk angeschlossen haben. wenn ja, trennen wir es, und es dann wieder an. wenn nicht, wir verbinden Sie es einfach. Es scheint, das Problem zu klären, die Sie beschreiben.

public static class NetworkDrives
    {
        public static bool  MapDrive(string DriveLetter, string Path, string Username, string Password)
        {

            bool ReturnValue = false;

            if(System.IO.Directory.Exists(DriveLetter + ":\\"))
            {
                DisconnectDrive(DriveLetter);
            }
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.RedirectStandardOutput = true;

            p.StartInfo.FileName = "net.exe";
            p.StartInfo.Arguments = " use " + DriveLetter + ": " + '"' + Path + '"' + " " + Password + " /user:" + Username;
            p.Start();
            p.WaitForExit();

            string ErrorMessage = p.StandardError.ReadToEnd();
            string OuputMessage = p.StandardOutput.ReadToEnd();
            if (ErrorMessage.Length > 0)
            {
                throw new Exception("Error:" + ErrorMessage);
            }
            else
            {
                ReturnValue = true;
            }
            return ReturnValue;
        }
        public static bool DisconnectDrive(string DriveLetter)
        {
            bool ReturnValue = false;
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.RedirectStandardOutput = true;

            p.StartInfo.FileName = "net.exe";
            p.StartInfo.Arguments = " use " + DriveLetter + ": /DELETE";
            p.Start();
            p.WaitForExit();

            string ErrorMessage = p.StandardError.ReadToEnd();
            string OuputMessage = p.StandardOutput.ReadToEnd();
            if (ErrorMessage.Length > 0)
            {
                throw new Exception("Error:" + ErrorMessage);
            }
            else
            {
                ReturnValue = true;
            }
            return ReturnValue;
        }

    }

Statt einem zugeordneten Laufwerk, können Sie mit der UNC-Freigabe verbinden?

Ich würde noch einen Benutzer ausgeben, die den Zugriff auf die Freigabe hat.

Ich habe dies tatsächlich früher getan, aber es war eine sehr lange her - wie 1997 und Windows NT 3.51 mit Delphi 2

Ich bin aus dem Speicher ausgeführt wird, aber ich denke, es ist so etwas wie das geht: Sie verwenden den Win-API:

WNetAddConnection2 ()

Info auf den Anruf: http: // msdn .microsoft.com / en-us / library / aa385413 (VS.85) aspx

Sie können die c # Unterschrift von pInvoke.net erhalten: http: // www.pinvoke.net/default.aspx/mpr/WNetAddConnection2.html

Hinweis auf Konfiguration: Ich denke, dass Sie ein Domänenkonto für den Dienst einrichten müssen, und den Dienst mit der Identität des Kontos anstelle von lokalem System ausgeführt werden. Ich denke, dass Sie mit dem Benutzernamen und Kennwort null übergeben.

Sie Macht der Lage sein, den Dienst als lokales System übergeben Sie den Benutzernamen und das Kennwort eines Domänenkonto ausgeführt -. Ich weiß nicht, ob das System Konto überhaupt Zugang zum Netzwerk gewährt wird

Das allgemeine Konzept im Auge zu behalten ist, dass ‚abgebildet Laufwerksbuchstabe‘ sind ein Benutzerkonzept, kein Systemkonzept. Also, wenn Joe auf die Windows-Computer anmeldet, werden die zugeordneten Laufwerke auf den Joe Benutzerkonto gebunden. Wenn ein Windows-Dienst ausgeführt wird, in der Regel ist es unter dem LOCAL_SYSTEM ‚Benutzerkonto‘ ausgeführt wird, was bedeutet, dass LOCAL_SYSTEM nicht über Joes weiß abgebildet Laufwerksbuchstaben.

Daher UNC Zugriff auf Netzwerkfreigaben sind der Weg zu gehen, wenn jede Remote-Ressource aus einem Windows-Service zuzugreifen versuchen. Beachten Sie, dass Sie den Windows-Dienst im Kontext des Benutzerkontos ‚Joe‘ laufen können, oder Sie können ein Dummy-AD-Konto genannt etwas wie ‚MyServiceAccount‘ erstellen und geben das Konto Rechte an den UNC, oder könnten Sie Identitätswechsel verwenden und haben die Windows-Dienst anmelden, um die lokalen Arbeitsstation der NetLogon () Funktion mit einem Identitätswechsel Griff und anschließend die UNC-Zugriff von dort aus.

Es gibt viele Möglichkeiten, es zu tun, aber die alle kommen auf Benutzerkonten zugeordnet sind Mapped Drives und UNC-Zugriff.

Good Luck, hoffen, dass diese Informationen helfen!

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