Comment acceder un fichier sur le reseau avec un programme exe

Comment acceder un fichier sur le reseau avec un programme exe - C#/.NET managed - Programmation

Marsh Posté le 18-06-2007 à 16:16:16    

Slt,
 
Avec un programme C#, je dois ouvrir et lire le contenu d'un fichier ()fichier texte ini) se trouvant sur une autre machine que celle ou est le programme .exe. Le probleme est que le programme .exe n'arrive pas à trouver ce fichier quand il souhaite le lire.
 
Quand j'utilise la fonction Exists, elle me dit que le fichier n'existe pas. Voici le bout de code:
 

Code :
  1. this.iniFilePath = "\\\\my-server\\d$\\partage\\fichier.ini";
  2. File.Exists(iniFilePath)
  3. {
  4. // File exists
  5. }
  6. else
  7. {
  8. // File does not exist
  9. }


 
Pourtant, si je vais dans Demarrer -> Executer et que je tape \\\\my-server\\d$\\partage\\fichier.ini, le fichier est bien ouvert sans probleme.
 
Ma question est donc comment acceder un fichier avec un programme .exe lorsque ce fichier n'est pas sur la meme machine que l'executable?
 
Merci d'avance
 
a+

Reply

Marsh Posté le 18-06-2007 à 16:16:16   

Reply

Marsh Posté le 19-06-2007 à 14:14:48    

il manque un "if" quelque part là :o
 
sinon, à partir du moment où le user qui lance le programme à les droits nécessaires pour accéder au répertoire réseau, y'a pas de raison pour que tu ne puisses pas y accéder.
 
a noter tout de même que :
1/ tu peux modifier le compte utilisateur avec lequel tourne ton programme (regarde dans le namespace "Security" )
2/ visiblement, c'est un fichier de configuration de ton programme ? alors passe pas un net use dans ton letlogon.bat ce sera plus propre...

Reply

Marsh Posté le 19-06-2007 à 16:51:07    

Slt MagicBuzz,
 
Oui il manque un if, copier/coller trop rapide
 
Pour les droits d'user je suis tout a fait d'Accord avec toi, cependant je ne vois pas d'explication, pourquoi je peux acceder mon fichier de configuration avec l'explorateur Windows (\\my-server\d$\partage\fichier.ini) mais que mon programme que j'execute sous mon compte n'y arrive pas ( File.Exists(\\\\my-server\\d$\\partage\\fichier.ini) )
 
Pour ta première idée, modifier le compte utilisateur avec lequel tourne ton programme, je ne sais pas du tout comment faire ca en C#. Je vais regarder sur le net comment on fait ca. Si tu as des liens, exemples de code etc. je suis preneur.
 
Pour ta deuxième idée, oui cèst bien un fichier de configuration utilisé par mon programme. Par contre, je ne connais psa du tout le fichier netlogon.bat ni a quoi il sert. Cependant, je ne pense pas que ce soit la solution a mon probleme car, d'une part ce programme doit etre intallé sur plusieurs serveurs, et de l'autre, les administrators ne voudront jamais modifier des fichiers de configuration de Windows juste pour un seul programme.
 
Si ta des autres idées  :)  
 
Merci
++

Reply

Marsh Posté le 19-06-2007 à 17:15:59    

netlogon.bat est un batch qui se trouve dans le répertoire partagé SYSVOL du contrôleur de domaine.
 
il est exécuté au démarrage d'une session sur le domaine sur n'importe quel PC du domaine.
 
on s'en sert généralement justement pour monter des répertoires réseau, de façon à ce qu'ils soient systématiquement présents chez tout le monde, et avec les mêmes noms.
 
PS : on peut l'améliorer en le paramétrant de façon plus ou moins évoluée en fonction des groupes de travail, du login, etc.

Reply

Marsh Posté le 19-06-2007 à 17:17:12    

Genre on va y trouver ce genre de code :
 

Code :
  1. net use f: \\serveur1\drivers
  2. net use g: \\serveur1\biblosuite
  3. net use h: \\serveur1\boietch
  4. net use i: \\serveur1\syl-jér
  5. rem net use j: \\serveur\tous
  6. rem net use s: \\srvbci\sage
  7. net use w: \\srvgnxtrt\generix
  8. call .\login2.bat


 
PS : il ne s'appelle pas forcément "netlogon.bat", ça se configure sur le CPD.

Reply

Marsh Posté le 19-06-2007 à 17:21:27    

Voilà où on configure le truc sur le CPD :
http://img516.imageshack.us/img516/6302/netlogonmd0.png
 
Le nom du script est en mode "relatif" par rapport au répertoire réseau "\\cpd\sysvol\domaine.ext\"

Reply

Marsh Posté le 20-06-2007 à 10:08:20    

Slt,
 
Merci pour toutes ces explications.
Peut etre que je nai pas bien compris comment ca fonctionne, mais est ce que je peux avec le fichier netlogon.bat ou son equivanlent dans le repertoire SYSVOL, dire que  je veux que mon partage \\my-server-1\dossier_de_config\ soit créé uniquement pour les serveurs serveur-alpha et serveur-beta et non pour toutes les machines?
 
Autre ptite question, si je fais net use f: \\my-server-1\dossier_de_config\, dans mon programme C#, pour utiliser le contenu du dossier \my-server-1\dossier_de_config\fichier_ini\, j'utilise  \\my-server-1\f$ , c 'est ca?
 
A+

Reply

Marsh Posté le 20-06-2007 à 10:46:31    

Normalement, oui, chaque PC sur un domaine à un compte. Tu devrais pouvoir leur coller un script aussi (à vérifier).
 
Sinon, avec un bat tu récupères le host et ça te permet de monter ou non le lecteur selon des tests sur ce nom.
 
Y'a pas mal d'exemple dans la MSDN de scripts d'admin de ce genre.

Reply

Marsh Posté le 20-06-2007 à 10:47:54    

non, si tu fais un "net use f: \\my-server-1\dossier_de_config\" tu as un lecteur F: qui apparait sur ton ordinateur comme si c'était un disque dur local, mais c'est un disque réseau.
et l'accès à de tels disques est parfaitement identique à celui d'un disque local, donc plus de problème normalement.

Reply

Marsh Posté le 20-06-2007 à 11:12:29    

Bon jai demande a ladmin, et on peut pas modifier le logon batch
Le seul truc qui m|a dit, on peut creer un partage pour ton repertoire distant, et apres je peux lacceder avec par exemple \\my-server-1\share\

Reply

Marsh Posté le 20-06-2007 à 11:12:29   

Reply

Marsh Posté le 20-06-2007 à 11:15:26    

déjà ce sera mieux en effet.

Reply

Marsh Posté le 20-06-2007 à 11:16:15    

ps : vous avez pas un sgbd qui se balade sur le réseau ? pkoi ne pas strocker les infos de ton ini dans une table de paramétrage, et y acceder avec une connection sql ? au moins ça résoudra le problème :D

Reply

Marsh Posté le 20-06-2007 à 11:45:30    

A vrai dire, jai pas pense a l idee de la bdd. Cependant ce fichier ini ne sert pas juste a lire des parametres. Une autre application modifie ce fichier pour modifier les parametres.
 
De plus, l utilisation dune bdd risque detre assez lourd a gerer car ce fichier peut etre installe sur des serveurs de domaine different, au US et Europe par exemple.
 
Merci pour l info

Reply

Marsh Posté le 20-06-2007 à 12:23:31    

Un WebService alors [:magicbuzz]

Reply

Marsh Posté le 20-06-2007 à 17:17:50    

Bon, alors ce que j'ai fait. Créé un share pour le repertoire ou se trouve le fichier ini, et mis tous les droits dessus pour tout le monde. Avec ca le programme .exe arrive a lire et ecrire dans le fichier ini.
 
Je ne pense pas que ce soit la meilleur solution, mais au moins j'ai une solution qui marche, maintenant on verra si ca plaira au boss.
 
a+

Reply

Marsh Posté le 20-06-2007 à 17:35:38    

Ben maintenant que t'as cette solution, tu peux tenter de l'affiner, jusqu'à trouver ce qui ne marche pas.
 
Notamment, ton programme ne fait que lire non ?
Dans ce cas, supprime tous les droits en modification sur le partage :)

Reply

Marsh Posté le 21-06-2007 à 17:54:45    

Bon ya du changement, apparemment les personnes de l'autre cote de l'atlantique se sont decidées pour utiliser finalement un net use f: ......
Mais bon le truc c'est qu'ils veulent pas que se soit fait automatiquement avec le netlogon.bat par exemple.
 
En gros, je cree un batch file, je fais le net use, puis j'execute le .exe et enfin je fais le rem net use.
 
Un peu bizarre comme truc, je sais pas si ca va marcher

Reply

Marsh Posté le 21-06-2007 à 17:58:57    

sisi ça va marcher :)
 
start /wait application.exe

Reply

Marsh Posté le 22-06-2007 à 09:27:11    

hum, comment tu fais le rem net use dans le batch file? parce que la commande rem correspond au commentaire en batch :S
donc du coup rem net use donne rien

Reply

Marsh Posté le 22-06-2007 à 09:29:10    

rem ? remove ?
 
net stop lecteur:

Reply

Marsh Posté le 22-06-2007 à 09:29:47    

ps : n'oublie pas de lancer ton appli comme je t'ai dit, avec un start /wait, sinon ça va la démarrer en mode asynchrone et donc démonter le lecteur tout de suite

Reply

Marsh Posté le 22-06-2007 à 09:32:47    

Slt,
 
sur cette page: http://www.ss64.com/nt/net_use.html il dise
 

Citation :

in a script, to map a drive and wait until the mapping has completed before continuing:
START /wait NET USE [driveletter:] \\ComputerName\ShareName


 
donc je mets un start pour le net use et aussi quand je lance mon .exe?


Message édité par cervantes le 22-06-2007 à 09:33:13
Reply

Marsh Posté le 22-06-2007 à 09:34:19    

ah oui et sinon l'option /persistent yes ou no, je m'en sers ici ou pas a ton avis?

Reply

Marsh Posté le 22-06-2007 à 09:36:10    

non, ne te sert pas de persistent, sinon le lecteur sera toujours présent au rédémarrage, ce qu'il ne faut pas faire.
 
oui, tu peux mettre un /wait si ton application nécessite un accès à ce lecteur dès le début. si au contraire elel va lire le fichier sur le réseau qu'après un certain temps d'utilisation, ça sert à rien, un lecteur réseau ça met vraiment un rien de temps à se monter.

Reply

Marsh Posté le 22-06-2007 à 09:37:10    

ok, je fais des tests
 
je te tiens au courant.
 
thx

Reply

Marsh Posté le 22-06-2007 à 09:49:42    

Un ptit test de
 

Citation :

net use t: \\server_name\configuration


 
dans un shell, me renvoie
 

Citation :

System error 67 has occurred.
 
The network name cannot be found.


 

Reply

Marsh Posté le 22-06-2007 à 09:51:46    

t'as vraiment un problème toi.
et j'ai pas l'impression que ce soit un problème de droit...
 
on dirait que t'accède pas au dns ni au wins du réseau...


Message édité par MagicBuzz le 22-06-2007 à 09:52:14
Reply

Marsh Posté le 22-06-2007 à 09:55:59    

c'est bizarre, car si je teste aussi
 

Citation :

net share


 
j'ai ca
 

Citation :

System error 5 has occurred.
 
Access is denied.

Reply

Marsh Posté le 22-06-2007 à 09:56:44    

t'es sûr que le protocole de partage réseau est actif sur ton pc ? :o

Reply

Marsh Posté le 22-06-2007 à 10:26:37    

Je sais pas, c est possible car je viens de tester sur une autre machine et ca passe, voici mon script:
 

Code :
  1. START /WAIT net use t: \\%prod_admin_server%\d$\%relative_path%
  2. START /WAIT /B t:\PCR_Automatic\pcr_automatic.exe
  3. net use t: /delete


 
 
Ca ne marche pas encore tres bien, car j'ai ce message.
 

Citation :


There are open files and/or incomplete directory searches pending on the connect
ion to t:.
 
Is it OK to continue disconnecting and force them closed? (Y/N) [N]: Argument mi
ssing.
Usage: pcr_automatic.exe server_name portal_area1 portal_area2 ...


 
Je ne sais pas pourquoi, mais d'apres l'ordre des messages, on dirait que le programme .exe est executé apres la commande pour retirer le mapping.
 
J'ai donc essayé sans les starts, et la tout s'execute dans l'ordre sans probleme.
 
Cependant,  quoi qu'il en soit, en utilisant la solution du net use ....., puis de l'execution du programme, j'ai de nouveau mon probleme d'acces au fichier de configuration ini. Une fois le mapping fait, le programme n'arrive pas a acceder au fichier ini t:\params.ini, pourtant j'arrive a y acceder manuallement avec la commande "Demarrer -> executer -> t:\pcr.ini", et ceci avec ou sans partage du dossier ou se trouve le fichier ini.
Ce que je comprends pas. Le fichier batch execute le programme exe a distance, sans probleme d'acces (t:\PCR_Automatic\pcr_automatic.exe ou \\server_name\pcr_automatic.exe marche), mais dans le code du programme, que je fassse t:\param.ini ou \\\\server_name\pcr.ini pour lire ce fichier, le programme n'arrive pas a acceder au fichier ini.
 
Il est ou le probleme ici?  
 
 
 
Je tourne en rond  :pt1cable:


Message édité par cervantes le 22-06-2007 à 11:40:52
Reply

Marsh Posté le 22-06-2007 à 13:28:09    

Jài fait plusieurs tests dans tous les sens. J'arrive a ceci.
 
J'ai copié mon programme .exe et le script batch sur le meme serveur ou se trouve le fichier ini. J'ai aussi un share de cree pour ce dossier "D:\Dossier\".
 
Si j'execute ceci avec le batch file:
 

Code :
  1. D:\Dossier\pcr_automatic.exe


 
Le programme arrive a lire mon fichier ini avec ce path:    

Code :
  1. \\server_name\share\params.ini


 
Par contre, tout en ayant les memes fichiers sur le meme serveur, si je teste ceci:

Code :
  1. \\server_name\share\pcr_automatic.exe


 
le programme .exe est bien executé mais le fichier ini (\\server_name\share\params.ini) n'est cette fois-ci plus accessible  :heink:
 
On dirait que parce que le programme .exe est execute avec un remote path, il n'arrive pas plus a acceder a aucun path, aussi bien les remote path que les locaux. Donc en gros, apparemment l'execution en local marche, que ce soit avec un appel du fichier iniavec un local ou remote path, par contre avec une execution en remote, quelque soit le type de path utilisé pour le fichier ini, celui-ci reste inaccessible


Message édité par cervantes le 22-06-2007 à 13:40:25
Reply

Marsh Posté le 22-06-2007 à 13:47:20    

Peut être une question de droits sur le serveur?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 22-06-2007 à 14:34:52    

Qu'est ce que tu veux que je mette comme droit sur le serveur? Les fichiers sont en full permission pour tous et mon compte a lui meme tous les droits (donc normalement le programme que jexecute les a aussi).

Reply

Marsh Posté le 22-06-2007 à 15:09:24    

Sinon, juste une ptite question a propos de la commande start, quand je l'utilise et que j'utilise le parametre /WAIT, je dois appuyer sur entrer pour que le script se termine, y a t-il un moyen pour que le script se termine tout seul?
 
++

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed