2009-06-06 2 views
5

Я пытаюсь запустить наблюдатель файлов по некоторому пути сервера, используя службу Windows. Я использую свои учетные данные для входа в систему для запуска службы и могу получить доступ к этому «someServerPath» из моего входа. Но когда я делаю что с FileSystemWatcher он бросает:.FileSystemWatcher Не удается получить доступ к сетевому диску

Имя каталога \ someServerPath недействителен»исключение

var fileWatcher = new FileSystemWatcher(GetServerPath()) 
    { 
     NotifyFilter=(NotifyFilters.LastWrite|NotifyFilters.FileName), 
     EnableRaisingEvents=true, 
     IncludeSubdirectories=true 
    }; 

public static string GetServerPath() 
{ 
    return string.Format(@"\\{0}", FileServer1);    
} 

Может кто-нибудь, пожалуйста, помогите мне с этим

ответ

9

У меня есть проекты с использованием объекта FileSystemWatcher, отслеживающего UNC-пути без каких-либо проблем.

Мое предположение, что вы смотрите на пример кода, может указывать на то, что вы указываете наблюдателя на корневой ресурс сервера (// имя_сервера /), который может быть недопустимым для файловой системы? Я знаю, что он возвращает такие вещи, как принтеры, запланированные задачи и т. Д. В Windows Explorer.

Попробуйте указать наблюдателя на общий ресурс под корнем - что-то вроде // servername/c $/будет хорошим тестовым примером, если у вас есть удаленные административные права на сервере.

+0

Спасибо. Это, по-видимому, проблема. –

+1

Кажется, что вообще не работает с // tsclient/share поверх удаленного рабочего стола. Ошибок нет, но когда файлы меняются, монитор ничего не подбирает. Если вы попытаетесь сопоставить // tsclient/share с диском, он отобразится отлично, но FileSystemWatcher выдает ошибку, если вы укажете букву сопоставленного диска. – Triynko

5

С? в отношении обновленного вопроса, я согласен с тем, что вам, вероятно, необходимо указать действительный ресурс, а не только имя удаленного сервера.

[Update] Fixed предыдущего вопроса об исключении с этим:

указать имя как @"\\someServerPath"

\ в настоящее время убежал как единый \

Когда префикс строки с символом @, это не обрабатывает escape-последовательности.

+0

Это один звучит хорошо, но я бы предположить, путь на самом деле это переменная, которая считывается из файла конфигурации или базы данных. Может быть, он должен показать нам фактический код ... – flipdoubt

+0

Ofcourse Я делаю то же самое. Кроме того, я использую @ "\\ путь" перед переменной, которая возвращает этот путь. –

+0

Обновлен мой код, надеюсь, что я получу лучшее решение. –

0

Есть ли какая-либо конкретная причина, по которой вы не используете FileSystemWatcher на физической машине, у которой есть каталог, который вы хотите посмотреть?

+0

Его служба Windows, которая работает на почтовом сервере и считывает файлы из разных мест по сети. –

+0

Редактировать: main * server –

+0

Не можете ли вы, чтобы другие серверы «отправили» файлы thier на главный? –

-2

Вы не можете использовать часы каталога по сетевым ресурсам, это ограничение ОС, а не .NET.

+0

, что вы хотите сказать, наблюдатель файлов (из-за ограничения ОС) не может наблюдать за каталогом, который физически находится на некоторых другая машина? –

+0

Я успешно использовал filewatcher по сопоставленному пути той же машины. Я имею в виду, файловый обозреватель просматривает «\\ сервер \ SharedFolder», в то время как заливки находятся в «C: \ serviceFolder \ SharedFolder». Этот случай отлично работает, разница в том, что оба указывают на одну и ту же машину, в отличие от приведенного выше примера. Это проблема? –

+0

Он пытается дать вам подсказку здесь - только потому, что вы можете обмануть предупреждение с помощью сопоставленных дисков, это не значит, что ваши часы действительно будут работать *. –

2

Даже если это уже ответили, я думал, что поставил бы свои два цента, потому что вы можете увидеть эту ошибку, даже если вы укажете допустимые пути.

Вы получите ту же ошибку, когда процесс, выполняющий наблюдателя, не имеет доступа к удаленному ресурсу. Это произойдет, если наблюдатель находится в службе, запущенной под учетной записью «Система», и общий ресурс создается пользователем. Система не имеет доступа к этому ресурсу и не распознает его, вам нужно будет выдавать себя за пользователя, чтобы получить к нему доступ.

1

, хотя вы можете использовать FileWatcher по сети, вам придется учитывать другие факторы, такие как отключение общего сетевого ресурса. Если ваше соединение с долей прекращено (обслуживание, запаздывание, сброс оборудования и т. Д.), У вас больше не будет действительного дескриптора на долю в файловом накопителе

2

Мне просто задали этот вопрос в отношении кода FileSystemWatcher, работающего как служба, и проблема - это разрешения. Я искал и нашел этот вопрос и ответ, но, к сожалению, ни один из ответов здесь не решил проблему. Во всяком случае, я просто решил это, поэтому я подумал, что брошу здесь решение для следующего парня, который ищет и находит этот вопрос.

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

Исправление либо:

  1. Аутентифицировать первый (я использую C# Class to establish a network connection with credentials)
  2. Запустите службу как пользователь, который имеет доступ к общему ресурсу.

Вы можете протестировать аутентификацию LocalSystem с помощью LocalSystem командной строки см How to open a command prompt running as Local System?

+0

Лучшим решением может быть использование учетной записи ** NetworkService ** с правильными разрешениями на диске/папке. Ссылка на эту тему: [Использование NetworkService] (http://stackoverflow.com/questions/11978054/cannot-start-windows-service-in-networkservice-account) – Ethenyl

+1

Я думаю, что это правильный ответ, я «Я получаю ту же проблему, если я выполняю службу, поскольку консольное приложение работает нормально, иначе оно не сможет найти сетевой путь. – Draiden

Смежные вопросы