2009-06-06 20 views
5

Sto tentando di eseguire un visualizzatore di file su un percorso server utilizzando il servizio Windows. Sto utilizzando le credenziali di accesso di Windows per eseguire il servizio e sono in grado di accedere a questo "someServerPath" dal mio accesso. Ma quando lo faccio dal FileSystemWatcher getta:.FileSystemWatcher Non riesce ad accedere all'unità di rete

Il nome della directory \ someServerPath è valido eccezione"

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

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

Qualcuno può aiutarmi con questo

risposta

9

Ho progetti che utilizzano l'oggetto FileSystemWatcher che monitora i percorsi UNC senza problemi.

La mia ipotesi dall'esaminare l'esempio di codice potrebbe essere che si sta puntando l'osservatore alla condivisione radice del server (// nomeserver /) che potrebbe non essere una condivisione di file system valida? So che restituisce cose come stampanti, attività programmate, ecc. In Windows Explorer.

Puntare l'osservatore ad una quota al di sotto della radice - qualcosa come // servername/c $/sarebbe un buon esempio di prova se si dispone di diritti di amministrazione remoto sul server.

+0

Grazie. Questo sembra essere il problema qui. –

+1

Sembra non funzionare affatto con // tsclient/condivisioni sul desktop remoto. Non ci sono errori, ma quando i file cambiano, il monitor non preleva nulla. Se si tenta di mappare // tsclient/share su un'unità, viene eseguita correttamente, ma FileSystemWatcher genera un errore se si specifica la lettera dell'unità mappata. – Triynko

5

Con? Riguardo alla domanda aggiornata, concordo sul fatto che probabilmente è necessario specificare una condivisione valida, piuttosto che il nome del server remoto.

[Update] Risolto precedente domanda circa l'eccezione con questo:

specificare il nome come @"\\someServerPath"

L'\ è sfuggito come un singolo \

Quando prefisso la stringa con un simbolo @, si non elabora le sequenze di escape.

+0

Questo suona bene, ma vorrei assumere il percorso è in realtà una variabile che viene letta da un file di configurazione o un database. Forse dovrebbe mostrarci il codice vero ... – flipdoubt

+0

Ovviamente sto facendo lo stesso. Inoltre, sto usando @ "\\ percorso" prima della variabile che restituisce questo percorso. –

+0

Aggiornato il mio codice, spero di ottenere una soluzione migliore ora. –

0

C'è un motivo particolare non è in esecuzione il FileSystemWatcher sulla macchina fisica che ha la directory che si desidera guardare?

+0

È un servizio Windows eseguito su un server di posta e legge i file da una posizione diversa sulla rete. –

+0

edit: principale * Server –

+0

smusso avete gli altri server "inviare" appenderci file a quello principale? –

-2

Non è possibile utilizzare la directory watch su condivisioni di rete, si tratta di una limitazione del sistema operativo, non di .NET.

+0

Vuoi dire, file di watcher (a causa delle limitazioni del sistema operativo) non può vegliare su una directory che è fisicamente su alcuni altra macchina? –

+0

Ho utilizzato con successo il filewatcher su un percorso mappato della stessa macchina. Voglio dire, filewatcher che controlla "\\ server \ SharedFolder", mentre i filles sono in "C: \ serviceFolder \ SharedFolder". Questo caso funziona bene, la differenza è che entrambi puntano alla stessa macchina, a differenza dell'esempio sopra riportato. È questo il problema ?? –

+0

Sta cercando di darvi un suggerimento qui - solo perché si può ingannare l'avviso tramite unità mappate non significa che i vostri orologi sarà effettivamente * lavoro *. –

2

Anche se questo è già una risposta ho pensato di mettere nei miei due centesimi vale la pena becaus eyou può vedere questo stesso errore anche se si fornisce percorsi validi.

si otterrà lo stesso errore quando il processo in esecuzione l'osservatore non ha accesso alla condivisione remota. Ciò si verifica se l'osservatore si trova in un servizio in esecuzione con l'account di sistema e la condivisione viene creata da un utente. Il sistema non ha accesso a quella condivisione e non lo riconoscerà, dovrai impersonare l'utente per accedervi.

1

anche se è possibile utilizzare un FileWatcher in rete, si dovrà tenere conto di altri fattori, come la disconnessione della condivisione di rete. Se la connessione alla condivisione viene interrotta (manutenzione, ritardi, ripristino delle apparecchiature, ecc.) Non si avrà più un handle valido sulla condivisione nel filewatcher

2

Mi è stata appena posta questa domanda per quanto riguarda il codice FileSystemWatcher in esecuzione come servizio e il problema è permesso. Ho cercato e trovato questa domanda e risposta ma sfortunatamente nessuna delle risposte qui ha risolto il problema. Comunque, l'ho appena risolto, quindi ho pensato di inserire la soluzione qui per il prossimo che cerca e trova questa domanda.

La mappatura dell'unità come utente connesso ma il servizio è stato eseguito come LocalSystem . LocalSystem è un account diverso e non ha accesso alle unità mappate da un utente.

La correzione è o per:

  1. autenticazione prima (io uso un C# Class to establish a network connection with credentials)
  2. Eseguire il servizio come un utente che ha accesso alla condivisione.

È possibile verificare l'autenticazione LocalSystem utilizzando un prompt dei comandi LocalSystem, vedere How to open a command prompt running as Local System?

+0

La soluzione migliore potrebbe utilizzare l'account ** NetworkService ** con le giuste autorizzazioni sull'unità/cartella. Un collegamento sull'oggetto: [Utilizzo di NetworkService] (http://stackoverflow.com/questions/11978054/cannot-start-windows-service-in-networkservice-account) – Ethenyl

+1

Penso che questa sia la risposta corretta, I sto ottenendo lo stesso problema, se eseguo il servizio come app di console sta funzionando bene, altrimenti non è in grado di trovare il percorso di rete. – Draiden

Problemi correlati