Zugreifen auf eine freigegebene Datei (UNC) von einer nicht vertrauenswürdigen Remote-Domäne mit Anmeldeinformationen
Wir haben in eine interessante situation, die Bedürfnisse zu lösen, und meine Recherchen haben aufgedeckt nill. Ich rufe deshalb die öffentlichkeit um Hilfe.
Das Problem ist dieses: wir müssen den programmgesteuerten Zugriff auf eine freigegebene Datei, die nicht in unserer Domäne und nicht in einer vertrauenswürdigen externen Domäne über remote-file-sharing /UNC. Natürlich, wir müssen Anmeldeinformationen eingeben, um die remote-Maschine.
Normalerweise löst man dieses problem in einer von zwei Möglichkeiten:
- Anzeigen der Datei-Freigabe als Laufwerk und die Anmeldeinformationen an, die Zeit. Dies erfolgt in der Regel die
NET USE
Befehl oder die Win32-Funktionen, die doppelteNET USE
. - Auf die Datei mit einem UNC-Pfad, als ob der remote-computer auf die Domäne und sicherzustellen, dass das Konto, unter dem das Programm ausgeführt wird, wird verdoppelt (inklusive Passwort) auf dem remote-Rechner als lokale Benutzer. Im Grunde nutzen die Tatsache, dass Windows automatisch die Versorgung der Anmeldeinformationen des aktuellen Benutzers, wenn der Benutzer versucht, Zugriff auf eine freigegebene Datei.
- Don ' T verwenden remote-file-sharing. Verwenden Sie FTP (oder irgendeinem anderen Wege) zu übertragen Sie die Datei, arbeiten Sie vor Ort und übertragen Sie Sie anschließend wieder.
Für verschiedene und verschiedene Gründe, unsere security /Netzwerk Architekten abgelehnt haben die beiden ersten Ansätzen. Der zweite Ansatz ist offensichtlich ein Sicherheitsproblem; wenn der remote-computer kompromittiert wird, kann der lokale computer ist nun in Gefahr. Der erste Ansatz ist unbefriedigend, weil die neu eingehängten Laufwerk ist eine gemeinsame Ressource zur Verfügung, um andere Programme auf dem lokalen computer während der file-Zugriff durch das Programm. Obwohl es durchaus möglich ist, stellen Sie diese temporär, es ist immer noch ein Loch in Ihrer Meinung.
Sind Sie offen für die Dritte option, aber die remote-Netzwerk-admins bestehen auf SFTP statt FTPS und FtpWebRequest nur FTPS unterstützt. SFTP ist die mehr firewall-freundliche option und es gibt ein paar Bibliotheken, die ich benutzen könnte für diesen Ansatz, aber ich würde es vorziehen, zu reduzieren, meine Abhängigkeiten, wenn ich kann.
Habe ich gesucht, MSDN, entweder für eine verwaltete oder eine win32-Nutzung von remote-file-sharing, aber ich konnte nicht kommen mit etwas sinnvolles.
Und so Frage ich: gibt es einen anderen Weg? Habe ich einmal eine super-geheime win32-Funktion, die tut, was ich will? Oder muss ich verfolgen eine Variante von option 3?
InformationsquelleAutor der Frage Randolpho | 2009-03-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Weg, um Ihr problem zu lösen, ist die Verwendung eines Win32-API aufgerufen WNetUseConnection.
Verwenden Sie diese Funktion, um eine Verbindung zu einer UNC-Pfad mit Authentifizierung, NICHT um ein Laufwerk zuzuordnen.
Wird diese ermöglichen es Ihnen, eine Verbindung zu einem remote-Computer, auch wenn es nicht auf der gleichen domain, und selbst wenn er ein anderen Benutzernamen und Passwort.
Sobald Sie verwendet werden, WNetUseConnection Sie werden in der Lage sein, um den Zugriff auf die Datei über einen UNC-Pfad als ob Sie waren auf der gleichen domain. Der beste Weg ist wohl über die administrative gebaut in Aktien.
Beispiel: \\computername\c$\program files\Folder\file.txt
Hier einige Beispiel für C# - code, der verwendet WNetUseConnection.
Beachten Sie, für die NetResource, sollten Sie übergeben Sie null für die lpLocalName und lpProvider. Der dwType sollte RESOURCETYPE_DISK. Die lpRemoteName sollte \\ComputerName.
InformationsquelleAutor der Antwort Brian R. Bondy
Für Menschen auf der Suche nach einer schnellen Lösung, die Sie verwenden können, die
NetworkShareAccesser
ich vor kurzem geschrieben (basierend auf diese Antwort (vielen Dank!)):Verwendung:
WARNUNG: Bitte stellen Sie absolut sicher, dass
Dispose
desNetworkShareAccesser
genannt wird (auch wenn Sie die app stürzt ab!), ansonsten eine offene Verbindung bleibt auf Windows. Können Sie alle offenen verbindungen, die durch die öffnung dercmd
Eingabeaufforderung, und geben Sienet use
.Code:
InformationsquelleAutor der Antwort GameScripting
Ist, soweit ich weiß, brauchen Sie nicht zu Karte Sie den UNC-Pfad einen Laufwerkbuchstaben, um die Anmeldeinformationen für einen server. Ich benutzte regelmäßig batch-Skripte wie:
Jedoch jedes Programm läuft auf dem gleichen Konto wie das Programm können Sie immer noch Zugriff auf alles, was
username:password
Zugriff hat. Eine mögliche Lösung könnte sein, isolieren Sie Ihr Programm in seinen eigenen lokalen Benutzer-account (den UNC-Zugriff lokal auf dem Konto, genanntNET USE
).Hinweis: Mithilfe von SMB-auf-domains ist nicht ganz eine gute Nutzung der Technologie, IMO. Wenn Sicherheit wichtig ist, ist die Tatsache, dass die SMB-Verschlüsselung fehlt ist ein bisschen ein Dämpfer, ganz von selbst.
InformationsquelleAutor der Antwort Jacob
Während ich nicht mich kennen, würde ich sicherlich hoffen, dass #2 ist falsch...ich würde gerne glauben, dass Windows nicht AUTOMATISCH geben meine login-Daten (schon gar nicht mein Passwort!) auf jedem Rechner, geschweige denn eine, die nicht Teil der mein Vertrauen.
Unabhängig, Sie haben, erkundet Sie die Identitätswechsel-Architektur? Ihr code wird in etwa so Aussehen:
In diesem Fall, die
token
variable IntPtr. Um einen Wert für diese variable, Sie müssen rufen Sie die nicht verwaltete Windows-API-Funktion LogonUser. Eine schnelle Reise zu pinvoke.net gibt uns die folgende Signatur:Benutzernamen, die Domäne und das Kennwort sollte scheinen ziemlich offensichtlich. Haben Sie einen Blick auf die verschiedenen Werte, die übergeben werden kann, um dwLogonType und dwLogonProvider, um zu bestimmen, die, die am besten zu Ihren Bedürfnissen passt.
Dieser code ist nicht getestet worden, weil ich nicht haben eine zweite Domäne hier, wo ich überprüfen kann, dies sollte sich aber hoffentlich legen Sie auf die richtige Spur.
InformationsquelleAutor der Antwort Adam Robinson
Eher als WNetUseConnection, würde ich empfehlen,NetUseAdd. WNetUseConnection ist eine legacy-Funktion wurde abgelöst durch WNetUseConnection2 und WNetUseConnection3, aber alle diese Funktionen erstellen Sie ein Netzwerk-Gerät, das sichtbar in Windows Explorer. NetUseAdd ist das äquivalent zum Aufruf von net use in einer DOS-Eingabeaufforderung zur Authentifizierung auf einem remote-computer.
Wenn Sie rufen Sie NetUseAdd dann die nachfolgenden versuche auf das Verzeichnis zuzugreifen, das sollte gelingen.
InformationsquelleAutor der Antwort Adam Robinson
Meisten SFTP-Server-Unterstützung SCP als auch die viel leichter zu finden-Bibliotheken für. Man könnte auch einfach anrufen, einen bestehenden Kunden aus dem code wie pscp enthalten PuTTY.
Wenn der Dateityp mit dem Sie arbeiten, ist so etwas einfaches wie eine text-oder XML-Datei, man könnte sogar so weit gehen und schreiben Sie Ihre eigene client/server-Implementierung die Datei Bearbeiten, mit so etwas wie wird .NET Remoting oder web-services.
InformationsquelleAutor der Antwort Ryan Bolger
Ich gesehen habe option 3 implementiert, mit JScape tools in eine ziemlich direkte Art und Weise. Sie könnten es versuchen. Es ist nicht kostenlos, aber es macht seinen job.
InformationsquelleAutor der Antwort DreamSonic
Hier einen minimalen POC-Klasse w/alle Reste entfernt
Können Sie direkt
\\server\share\folder
w/WNetUseConnection
keine Notwendigkeit, entfernen Sie es, um\\server
Teil nur vorher.InformationsquelleAutor der Antwort wqw
Sah ich zu MS, die Antworten zu finden. Die erste Lösung setzt Voraus das Benutzerkonto ausführen der Anwendung Prozess hat Zugriff auf den freigegebenen Ordner oder das Laufwerk (Gleiche domain). Stellen Sie sicher, dass Ihre DNS aufgelöst wird oder verwenden Sie eine IP-Adresse. Tun Sie einfach Folgendes:
Wenn Sie möchten, über verschiedene Domänen hinweg .NET 2.0 mit Zugangsdaten Folgen diesem Modell:
InformationsquelleAutor der Antwort Kentonbmax