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.

È stato utile?

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top