J'ai donc une petite application C# qui a besoin de vérifier périodiquement le contenu des répertoires sur plusieurs machines sur le réseau. Je pensais que je pouvais juste lire \ hostname \ C $ comme un chemin de répertoire, mais avec la classe Directory normale, il ne semble pas y avoir un moyen de s'authentifier sur les autres serveurs afin que vous puissiez accéder au partage caché. Je suis sûr qu'il y a un moyen facile de faire cela que j'ai oublié, mais pour le moment je suis un peu abasourdi.Lecture de partage caché en C#
Répondre
De http://bytes.com/forum/thread689145.html:
Tous les processus sont exécutés dans le cadre d'un compte utilisateur connecté. Si vous souhaitez ouvrir un fichier sur un autre ordinateur, votre application doit être en cours d'exécution dans le contexte d'un utilisateur ayant les autorisations pour ouvrir des fichiers sur cette machine. Vous pouvez le faire avec Usurpation d'identité.
La manière la plus simple semble être de donner à l'utilisateur actuel des droits appropriés sur les autres machines.
C'est également la meilleure approche, car cela éliminera le besoin de traiter l'authentification dans votre logiciel (ce qui est facile à corriger). – Luke
Êtes-vous à la recherche d'un moyen de définir l'utilisateur actuel au moment de l'exécution?
Sinon, tant que l'utilisateur exécutant le processus a accès à ces machines, cela fonctionnera pour vous:
DirectoryInfo di = new DirectoryInfo(@"\\machineName\c$\temp");
FileInfo[] files = di.GetFiles();
foreach (FileInfo f in files)
{
Debug.WriteLine(f.Name);
}
Authentifier avec une action à laquelle l'utilisateur exécutant le processus n'a pas la permission (ce qui est souvent le cas pour les actions administratives), essayez d'exécuter la commande net use:
net use SERVERNAME\IPC$ /user:USERNAME PASSWORD
essayez de lancer dans un processus séparé avant le code qui tente effectivement d'accéder au partage, par exemple:
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...
Ceci est utile s'il n'est pas approprié d'accorder l'autorisation au partage pour le compte d'utilisateur exécutant le processus, par ex. pour un modèle de sécurité où une application d'utilisateur final doit accéder à des données sur un partage auquel l'utilisateur lui-même ne devrait pas avoir un accès direct.
Cela devrait fonctionner. Quelle est l'exception que vous obtenez? –