2016-06-21 14 views
4

У меня странное поведение, когда я пытаюсь использовать программу C# для копирования локальных файлов на сервер Sharepoint с использованием путей UNC, предоставляемых Sharepoint, для доступа к файловая система. Прежде всего, мой пользователь имеет все привилегии, необходимые для доступа к этой конкретной папке Sharepoint.Скопировать файл в общий доступ Sharepoint, если пользователь не подключается к серверу Sharepoint в первый раз

Это то, что моя работа в основном выглядит следующим образом:

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

Это терпит неудачу с ошибкой «Сетевой путь не был найден.»

Как только я скопирую путь выше и вставьте его в WIndows File Explorer (не Internet explorer, это просто путь UNC), все работает.

Итак, мое предположение заключается в том, что в фоновом режиме Windows Explorer делает немного больше. Но что? Мне не нужно вводить какие-либо учетные данные, targetSharepointPath просто работает в проводнике, и как только он был введен один раз, он также работает в моей программе на C#. Пока я не перезапущу свою систему, я должен повторить этот шаг. Почему, и как я могу достичь этого программно? Я часто работаю с UNC-путями на «обычных» серверах Windows, и как только у пользователя есть права, мне не нужна дополнительная аутентификация.

ответ

5

Чтобы подключиться к Sharepoint, вам понадобится служба Windows под названием WebClient.

Когда вы откроете эту ссылку в Проводнике, она будет убедиться, что служба запущена. Возможно, именно поэтому вы можете получить доступ к Sharepoint из своего приложения после того, как вы открыли ссылку в Проводнике.

Вы можете убедиться, что у ваших клиентов есть то, что service было автоматически запущено для его достижения.

Или вы можете попробовать начать с вас код таким образом. (Вам может понадобиться права администратора для этого)

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

я думаю, что он должен работать ... + 1 – Ansari

+0

Я использовал это несколько раз теперь, и это делает работу, хороший ответ, спасибо! – Erik

+1

Это было именно то, что мне нужно. Я получил ошибку сетевого пути, не найденную. Одна нота вышеприведенного кода заключается в том, что ему нужна ссылка на System.ServiceProcess.dll. https://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller(v=vs.110).aspx –