FileSystemWatcher no puede acceder a la unidad de red

Estoy intentando ejecutar un vigilante de archivos sobre alguna ruta del servidor usando el servicio de Windows. Estoy usando mi credencial de inicio de sesión de Windows para ejecutar el servicio, y puedo acceder a este “algúnPasoServidor” desde mi inicio de sesión. Pero cuando hago eso desde el FileSystemWatcher arroja:

La excepción de nombre de directorio \ someServerPath no es válida.

var fileWatcher = new FileSystemWatcher(GetServerPath()) { NotifyFilter=(NotifyFilters.LastWrite|NotifyFilters.FileName), EnableRaisingEvents=true, IncludeSubdirectories=true }; public static string GetServerPath() { return string.Format(@"\\{0}", FileServer1); } 

¿Puede alguien ayudarme con esto?

Tengo proyectos que usan el objeto FileSystemWatcher que supervisa las rutas UNC sin ningún problema.

Supongo que al mirar el ejemplo de su código, ¿puede indicar que está apuntando al observador en la ubicación raíz del servidor (// servername /) que puede no ser un recurso compartido válido del sistema de archivos? Sé que devuelve cosas como impresoras, tareas progtwigdas, etc. en Windows Explorer.

Intente apuntar al vigilante a un recurso compartido debajo de la raíz; algo como // servername / c $ / sería un buen ejemplo de prueba si tiene derechos administrativos remotos en el servidor.

Con respecto a la pregunta actualizada, acepto que probablemente necesite especificar un recurso compartido válido, en lugar de solo el nombre del servidor remoto.

[Actualización] Se corrigió la pregunta anterior sobre la excepción con esto:

especifique el nombre como @"\\someServerPath"

El \ está siendo escapado como un single \

Cuando prefija la cadena con un símbolo @, no procesa las secuencias de escape.

Aunque esto ya está respondido, pensé que pondría mi granito de arena porque puede ver este mismo error incluso si proporciona rutas válidas.

Obtendrá el mismo error cuando el proceso que ejecuta el observador no tenga acceso al recurso compartido remoto. Esto sucederá si el observador está en un servicio que se ejecuta bajo la cuenta del Sistema y el recurso compartido es creado por un usuario. El sistema no tiene acceso a ese recurso y no lo reconocerá, deberá hacerse pasar por el usuario para obtener acceso.

Me acaban de hacer esta pregunta con respecto al código de FileSystemWatcher ejecutándose como un servicio y el problema son los permisos. Busqué y encontré esta pregunta y respuesta, pero desafortunadamente ninguna de las respuestas aquí resolvió el problema. De todos modos, simplemente lo resolví, así que pensé en arrojar la solución aquí para el siguiente tipo que busca y encuentra esta pregunta.

La unidad se asignó como un usuario conectado, pero el servicio se estaba ejecutando como LocalSystem . LocalSystem es una cuenta diferente y no tiene acceso a las unidades mapeadas por un usuario.

La solución es:

  1. Autenticar primero (uso una clase C # para establecer una conexión de red con credenciales )
  2. Ejecute su servicio como un usuario que tiene acceso al recurso compartido.

Puede probar la autenticación LocalSystem utilizando un símbolo del sistema LocalSystem, consulte ¿Cómo abrir un símbolo del sistema que se ejecuta como Sistema local?

aunque puede usar un FileWatcher en la red, tendrá que considerar otros factores, como la desconexión del recurso compartido de red. Si su conexión a la acción finaliza (mantenimiento, retraso, restablecimiento del equipo, etc.) ya no tendrá un control válido sobre el recurso compartido en su archivador

¿Hay alguna razón particular por la que no está ejecutando el FileSystemWatcher en la máquina física que tiene el directorio que desea ver?

No puede usar el control de directorios en los recursos compartidos de red, esto es una limitación del sistema operativo, no de .NET.