C# - Map Network drive aus Web-Service
Arbeiten wir an einer web-service hat, um eine 3rd-party-Prozess, der eine Interaktion mit einem zugeordneten Netzlaufwerk. Also müssen wir die Karte dieses Laufwerk programmgesteuert aus dem web-Dienst.
Habe ich schon eingepackt WNetAddConnection2, etc. schöner Klasse für ein anderes Projekt, so warf ich den code direkt in.
Unseren web-service läuft unter UltiDev Cassini (statt IIS) läuft unter dem System-Konto. Wir erhalten den Fehler-code für: "der angegebene Gerätename ist ungültig" jedes mal. Ich habe auch versucht, die Identität anderer Benutzer im web.config-Datei, mit dem gleichen Ergebnis.
Dem Laufwerk wird die Karte nur in Ordnung, wenn ich meinen code aus einer Konsole das Programm unter einem normalen Benutzer-account.
Habe ich auch versucht mit den entsprechenden "net use" - Befehl aus C# mit den genauen gleichen Ergebnisse, als Sie WNetAddConnection.
Weiß jemand, warum ein windows-Dienst oder System-Benutzer wäre nicht in der Lage, Netzwerklaufwerke?
Weiß jemand einen workaround? Einfach zuordnen des Laufwerks beim Systemstart wäre eine Lösung, aber wie konnte das system/imitierten Benutzer auf Sie zugreifen?
Link für UltiDev Cassini: UltiDev
LÖSUNG: ich den UltiDev Cassini-service für die Anmeldung als Administrator und alles funktioniert. Die ASP .Net-Identitätswechsel muss nicht funktionieren wie geplant.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem LOCAL_SYSTEM-account zeigt Anonyme Anmeldeinformationen auf dem Netzwerk. Sie könnte verwenden Sie einen UNC-Netzwerkfreigabe, um auf diese Informationen zuzugreifen, vorausgesetzt, dass anonymous (Jeder) Zugriff auf die Freigabe.
Können Sie auch installieren Cassini als windows-Dienst, die Sie konfigurieren können, um die Ausführung unter einem anderen Benutzer.
Wenn Sie das Lokale Systemkonto zu verwenden, dann glaube ich, es ist von Natur aus unfähig ist, den Zugriff auf Netzwerk, [foo]. Ich würde sagen, Identitätswechsel ist Ihre einzige gangbare Weg. Technisch könnte man reduzieren, steuert den Zugriff auf die Freigabe, bis zu dem Punkt, dass jeder konnte Lesen/schreiben auf der Freigabe, aber das bringt mehr Probleme als Lösungen.
Hatten wir das gleiche Problem. Das problem tritt auf, weil der account der code ausgeführt wird. Sie können dies umgehen, wie wir mit der folgenden Klasse. Sie haben die Karte der Fahrt in den gleichen code, die Sie verwenden, um den Zugriff/kopieren von Dateien. Das Muster, das wir verwenden, ist immer zu prüfen, t sehen, wenn das Laufwerk angeschlossen ist, ersten. wenn dem so ist, trennen wir es, und schließen Sie es dann wieder. falls nicht, schließen Sie es einfach. Es scheint klar, bis das Problem Sie beschreiben.
Statt eines zugeordneten Laufwerks, konnte Sie die Verbindung mithilfe des UNC-Freigabe?
Ich würde noch die Identität eines Benutzer, der Zugriff auf die Freigabe.
Habe ich eigentlich getan, bevor, aber es war eine SEHR lange Zeit-wie 1997 und Win NT 3.51 mit Delphi 2
Ich komme aus dem Gedächtnis, aber ich denke, es geht so etwas wie dieses:
Verwenden Sie die Win-API:
WNetAddConnection2()
Info auf den Anruf: http://msdn.microsoft.com/en-us/library/aa385413(VS.85).aspx
Können Sie die c# - Signatur aus pInvoke.net: http://www.pinvoke.net/default.aspx/mpr/WNetAddConnection2.html
Hinweis auf Konfiguration:
Ich denke, dass Sie benötigen, um ein Domänenkonto für den Dienst, und starten Sie den Dienst mit der Identität des Kontos anstelle des lokalen Systems. Ich denke, dass Sie übergeben Sie null als user-name und Passwort.
Du könnte ausführen können, um den Dienst als lokales system übergibt den Benutzernamen und das Kennwort eines Domäne-Kontos-ich weiß nicht, ob der system-account darf keine Netzwerk-Zugriff auf alle.
Dem Allgemeinen Konzept im Auge zu behalten ist, dass 'mapped drive letters' sind eine User-Konzept, nicht um ein System-Konzept. Also, wenn Joe meldet sich bei der Windows-Computer, zugeordnete Laufwerke sind an die Joe-Benutzerkonto aus. Wenn ein Windows-Dienst ausgeführt wird, in der Regel läuft es unter dem LOCAL_SYSTEM "Benutzer-Konto", was bedeutet, dass LOCAL_SYSTEM nicht weiß, über Joe ' s Laufwerk zugeordneten Buchstaben.
Daher UNC-Zugriff auf Netzwerk-shares sind der Weg zu gehen, wenn Sie versuchen, um Zugriff auf die remote-Ressource in einem Windows-Dienst. Beachten Sie, dass Sie den Windows-Dienst, der im Kontext der 'Joe' Benutzer-Konto, oder Sie können eine dummy-AD-Konto mit dem Namen so etwas wie "MyServiceAccount" und geben Sie diesem Konto Rechte auf den UNC -, oder könnten Sie Identitätswechsel verwenden und die Windows-Service-log-in auf der lokalen Arbeitsstation mithilfe der NetLogon () - Funktion mit einem Identitätswechsel Griff und dann Zugriff auf die UNC von dort.
Gibt es viele Möglichkeiten, es zu tun, aber die kommen alle bis auf User-accounts zugeordnet sind, Zugeordnete Laufwerke und UNC-Zugriff.
Glück, hoffe, diese information hilft!