Lettura della condivisione nascosta in C #
-
02-07-2019 - |
Domanda
Quindi ho una piccola app C # che deve controllare periodicamente il contenuto delle directory su più macchine in rete. Pensavo di poter leggere \ hostname \ C $ come percorso di directory, ma con la normale classe Directory non sembra esserci un modo per autenticarsi con gli altri server in modo da poter accedere alla condivisione nascosta. Sono sicuro che c'è un modo semplice per farlo che ho trascurato, ma al momento sono un po 'incantato.
Soluzione
Da http://bytes.com/forum/thread689145.html :
Tutti i processi vengono eseguiti nel contesto di a account utente registrato. Se lo desidera apri un file su un altro computer, il tuo l'applicazione deve essere in esecuzione in contesto di un utente che dispone di autorizzazioni per aprire i file su quella macchina. Puoi fallo con Impersonation.
Il modo più semplice sembra essere quello di dare all'utente l'utente i diritti appropriati sulle altre macchine.
Altri suggerimenti
Per eseguire l'autenticazione con una condivisione per la quale l'utente che esegue il processo non dispone delle autorizzazioni (come spesso accade per le condivisioni amministrative), provare a eseguire il comando net use:
net use SERVERNAME\IPC$ /user:USERNAME PASSWORD
Prova a eseguirlo in un processo separato prima del codice che tenta effettivamente di accedere alla condivisione, ad esempio:
ProcessStartInfo psi = new ProcessStartInfo(
"net", "use " + SERVERNAME + @"\IPC$ /user:" + USERNAME + " " + PASSWORD);
Process p = new Process();
p.StartInfo = psi;
p.Start();
p.WaitForExit();
p.Close();
// The code to access the share follows...
Ciò è utile se non è appropriato autorizzare la condivisione per l'account utente che esegue il processo, ad es. per un modello di sicurezza in cui un'applicazione dell'utente finale deve accedere ai dati su una condivisione a cui l'utente stesso non dovrebbe avere accesso diretto.
Stai cercando un modo per impostare l'utente corrente in fase di esecuzione?
In caso contrario, a condizione che l'utente che esegue il processo abbia accesso a tali macchine, questo funzionerà per te:
DirectoryInfo di = new DirectoryInfo(@"\\machineName\c$\temp");
FileInfo[] files = di.GetFiles();
foreach (FileInfo f in files)
{
Debug.WriteLine(f.Name);
}