2010-06-23 5 views
7

Ich habe einen freigegebenen Netzwerkordner einem Laufwerksbuchstaben zugeordnet, auf den über den Windows Explorer sowohl von der Eingabeaufforderung als auch von meiner WinForms-Anwendung zugegriffen werden kann. Es ist auch über meinen Windows-Dienst mit einem UNC-Pfad erreichbar.Zugriff auf Dateien auf freigegebenen Laufwerksfreigaben über einen Windows-Dienst nicht möglich

Wenn ich jedoch versuche, mit einem zugeordneten Laufwerksbuchstaben des Windows-Dienstes auf diesen Netzwerkspeicherort zuzugreifen, schlägt der Zugriff fehl. Der Windows-Dienst ist so konfiguriert, dass er meine persönlichen Anmeldeinformationen für das Konto verwendet, die in allen oben genannten Fällen identisch sind. Ich bin Administrator.

Viele Kundenwebsites verwenden Laufwerkbuchstaben für Netzwerkfreigaben, und ich kann dies nicht immer steuern und sie stattdessen zwingen, UNC-Pfade anzugeben. Ich muss auf Netzwerkfreigaben zugreifen können, die Laufwerksbuchstaben von einem Windows-Dienst verwenden.

Was muss ich tun, um meinen Windows-Dienst einzurichten, damit er auf freigegebene Netzwerkordner zugreifen kann, die Laufwerksbuchstaben zugeordnet sind? Mein Windows-Dienst ist in C# geschrieben.

Antwort

9

Entschuldigung; you can't access mapped drives from Windows services. Wie Sheng vorgeschlagen hat, können Sie einen UI-Prozess verwenden, um den UNC-Pfad von einem zugeordneten Laufwerk abzurufen und dann an den Dienst zu übergeben, der den UNC-Pfad verwenden muss.

+0

Vielen Dank für den Artikel. Microsoft macht deutlich, dass man von einem Windows-Dienst nicht auf gemappte Laufwerke zugreifen darf. – Elan

+0

Der zitierte Artikel besagt nur, dass Dienste keine Laufwerkszuordnungen verwenden oder ändern dürfen, was bedeutet, dass dies nicht möglich ist.In dem MS KB-Artikel bedeutet es sogar als solches, wenn es besagt: "Daher können umgeleitete Laufwerke nicht zwischen Prozessen geteilt werden, die unter anderen Benutzerkonten ausgeführt werden." Mit anderen Worten, die Anmeldesitzung und der Dienst müssen unter denselben Anmeldeinformationen ausgeführt werden. Es kann getan werden. – Garen

+0

@Garen: Jede Hauptversion von Windows erhöht die Trennung zwischen Diensten und Desktop-Code aus Sicherheitsgründen. Es gibt * Möglichkeiten, es jetzt zum Arbeiten zu zwingen. Es gab auch Möglichkeiten, es auf früheren Windows-Versionen zu erzwingen, die nicht mehr funktionieren. Es wird nicht unterstützt; Sie würden nur ein Produkt erstellen, das bei einer zukünftigen Windows-Version beschädigt werden könnte. (Ich spreche aus Erfahrung ...) –

4

zugeordnete Laufwerke sind Objekte pro Sitzung. Jede interaktive Sitzung hat also eine eigene Zuordnung und die Dienstsitzung hat eine andere Laufwerkzuordnung. Um den richtigen UNC-Pfad eines zugeordneten Laufwerks zu erhalten, müssen Sie WNetGetConnection in der richtigen Sitzung aufrufen.

Sie alle inter-Sitzung Kommunikationsmethoden verwenden können, um die Anforderung zu initiieren und das Ergebnis in dem Dienst, wie WCF zu erhalten, Named Pipe, Steckdosen etc.

+0

Vielen Dank. Ich konnte den Laufwerksbuchstaben mit Hilfe von pinvoke und WNetGetConnection in den UNC-Pfad konvertieren! – Elan

0

hallo elan konfrontiert ich das gleiche Problem in meinem Projekt und ich fand eine Lösung

und Arbeit erwartet meine Schritte

    if (api.Docusign_download(strDocuSignUserName, strDocuSignPassword, strDocuSignIntegratorKey, EnvelopeID, Environment.ExpandEnvironmentVariables("%temp%")) == true) 
        { 
         if (m_streamWriter1 != null) 
         { 
          m_streamWriter1.WriteLine(" This envelop id is Downloaded and update the table" + EnvelopeID + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString() + "\n"); 
         } 

         fpath1 = Environment.ExpandEnvironmentVariables("%temp%") + '\\' + EnvelopeID + '1' + ".pdf"; 
         fpath2 = Environment.ExpandEnvironmentVariables("%temp%") + '\\' + EnvelopeID + '2' + ".pdf"; 
         if (System.IO.File.Exists(fpath1)) 
         { 
          fso = new FileSystemObject(); 
          // fso.CopyFile(fileLoc, "\\\\Tech-Pro-01\\D\\", true); i download the file in temp folder and copy file to unc path ur expected work on reverse like access file to unc path he does not work directly but work in in direct access like temp folder to services 
          fso.CopyFile(fpath1, UNC, true); 
          fso.CopyFile(fpath2, UNC, true); 
          fso.DeleteFile(fpath1, true); 
          fso.DeleteFile(fpath2, true); 
          //System.IO.File.Move(fileLoc, fileLocMove); 

im nur mit Legacy-Anwendung Skript in vb Objekt fso Dateisystem folgen

1, stellen Sie sicher, dass Ihre Karte Weg Zugang in IUser und Netzwerk-Service-Zugang ermöglichen, die Maschine bereitgestellt abgebildet 2, wobei sich die Referenzsystem Scripting

3 und UNC-Pfad Beispiel \ Computername \ sharedname \ Ordner \ Dateiname 4, nur fso.copyfile (uncpath, tempfoler, true) 5, u Zugriff auf eine Datei in Ihrem temporären Ordner er Zugang zu erwarten ist und perfekt

arbeiten

der temporäre Ordner Zugriff „c: \ windows \ temp da proceess die Windows-Temp-Ordner nehmen nur

Hoffnung u elan er Arbeit perfekt

dank ist und in Bezug auf

Jagadeesh Govindaraj Pillai [email protected]

Verwandte Themen