2016-06-21 25 views
4

Ich habe ein seltsames Verhalten, wenn ich versuche, ein C# -Programm zu verwenden, um lokale Dateien auf einen Sharepoint Server zu kopieren Dateisystem. Zuallererst hat mein Benutzer alle Privilegien, um auf diesen spezifischen Sharepoint-Ordner zuzugreifen.Kopiere Datei zu Sharepoint-Freigabe fehlschlägt, wenn Benutzer zum Sharepoint Server zum ersten Mal verbindet

Dies ist, was im Grunde genommen mein Betrieb wie folgt aussieht:

string targetSharepointPath = @"\\[email protected]\DavWWWRoot\team\wmscompanydep\Software Releases\MyToolConfig" 
System.IO.File.Copy(sourcePath, targetSharepointPath, false); 

Diese mit einem Fehler fehlschlägt „Der Netzwerkpfad wurde nicht gefunden.“

Sobald ich den obigen Pfad kopieren und in Windows Explorer (nicht Internet Explorer, das ist einfach ein UNC-Pfad) einfügen, funktioniert alles.

Also meine Annahme ist, dass im Hintergrund Windows Explorer ein bisschen mehr tut. Aber was? Ich muss keine Zugangsdaten eingeben, der targetSharepointPath funktioniert einfach im Explorer, und sobald dieser einmal eingegeben wurde, funktioniert es auch in meinem C# -Programm. Bis ich mein System neu starte, muss ich diesen Schritt wiederholen. Warum und wie kann ich das programmatisch erreichen? Ich arbeite viel mit UNC-Pfaden auf "normalen" Windows-Servern und sobald der Benutzer Rechte hat, brauche ich keine zusätzliche Authentifizierung.

Antwort

5

Zum Verbinden mit einem Sharepoint benötigen Sie einen Windows-Dienst namens WebClient.

Wenn Sie diesen Link im Explorer öffnen, wird sichergestellt, dass der Dienst gestartet wird. Das könnte der Grund sein, warum Sie von Ihrer App aus auf die Sharepoint zugreifen können, nachdem Sie den Link im Explorer geöffnet haben.

Sie können sicherstellen, dass Ihre Kunden haben service automatisch gestartet, um es zu erreichen.

Oder Sie können versuchen, den Dienst von Ihnen Code auf diese Weise zu starten. (Sie könnten für diese Admin-Rechte benötigen)

using (ServiceController service= new ServiceController("WebClient")) 
    { 

     if (service.Status == ServiceControllerStatus.Stopped) 
     { 

      service.Start(); 
      service.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 15)); 
      //Check status here by calling service.Status and proceed with your code. 
     } 
     else 
     { 
      //proceed with your code as the service is up and running 
     } 
    } 
+2

ich denke, es sollte funktionieren ... + 1 – Ansari

+0

ich dies mehrmals verwendet jetzt, und es macht den Job, gute Antwort, danke! – Erik

+1

Das war genau das, was ich brauchte. Ich habe einen Netzwerkpfadfehler nicht gefunden. Eine Anmerkung zu dem obigen Code ist, dass es einen Verweis auf System.ServiceProcess.dll benötigt. https://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller(v=vs.110).aspx –