Question

J'ai donc une petite application C # qui doit vérifier périodiquement le contenu des répertoires sur plusieurs ordinateurs du réseau. Je pensais pouvoir simplement lire \ hostname \ C $ comme chemin de répertoire, mais avec la classe Directory normale, il ne semble pas y avoir de moyen de s’authentifier auprès des autres serveurs pour vous permettre d’accéder au partage caché. Je suis sûr qu'il y a un moyen facile de faire cela que j'ai négligé, mais pour le moment je suis un peu gêné.

Était-ce utile?

La solution

De http://bytes.com/forum/thread689145.html :

  

Tous les processus s'exécutent dans le contexte d'un   compte d'utilisateur connecté. Si tu veux   ouvrir un fichier sur un autre ordinateur, votre   l'application doit être en cours d'exécution dans le   contexte d'un utilisateur qui a des autorisations   d'ouvrir des fichiers sur cette machine. Vous pouvez   faites cela avec l'emprunt d'identité.

Le moyen le plus simple semble être de donner à l'utilisateur actuel les droits appropriés sur les autres machines.

Autres conseils

Pour vous authentifier avec un partage sur lequel l'utilisateur qui exécute le processus n'a pas d'autorisation (ce qui est souvent le cas pour les partages administratifs), essayez d'exécuter la commande net use:

net use SERVERNAME\IPC$ /user:USERNAME PASSWORD

Essayez d'exécuter cette opération dans un processus séparé avant le code qui tente réellement 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'autoriser le partage pour le compte d'utilisateur exécutant le processus, par exemple. pour un modèle de sécurité dans lequel 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.

Recherchez-vous un moyen de définir l'utilisateur actuel au moment de l'exécution?

Sinon, tant que l'utilisateur qui exécute 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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top