FileSystemWatcher не удается получить доступ к сетевому диску


Я пытаюсь запустить наблюдатель файлов по некоторому пути к серверу, используя службу windows. Я использую свои учетные данные для входа в систему windows для запуска службы и могу получить доступ к этому "someServerPath" из моего имени входа. Но когда я делаю это из 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);              
}
Может ли кто-нибудь помочь мне с этим?
7 5

7 ответов:

У меня есть проекты, использующие FileSystemWatcher object monitoring UNC paths без каких-либо проблем.

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

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

Что касается обновленного вопроса, я согласен, что вам, вероятно, нужно указать допустимый общий ресурс, а не только имя удаленного сервера.

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

Укажите имя как @"\\someServerPath"

\ экранируется как один \

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

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

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

Исправление заключается в следующем:

  1. аутентификация первая (я использую класс C# для установления сетевого соединения с учетными данными )
  2. запустите службу от имени пользователя, имеющего доступ к общему ресурсу.

Вы можете проверить аутентификацию LocalSystem с помощью командной строки LocalSystem, см. Как открыть командную строку, работающую как локальная система?

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

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

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

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

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