Comment écrire un script vbs dans un fichier .vbs en c# ?

Dodo299 Messages postés 11 Date d'inscription vendredi 1 juin 2007 Statut Membre Dernière intervention 23 février 2009 - 5 août 2008 à 22:09
Dodo299 Messages postés 11 Date d'inscription vendredi 1 juin 2007 Statut Membre Dernière intervention 23 février 2009 - 8 août 2008 à 00:34
Bonjour,

Je débute dans le c#.

Je suis en train de développer une application qui permettra de se connecter à ses répertoires personnels (Situés sur le serveur d'un domaine) sans se connecter au domaine, juste en se branchant au réseau.

Pour le faire, c'est super simple, il suffit d'écrire un petit script en .vbs puis de l'exécuter.
Seulement, pour plus de simplicité j'ai créé une application en C# avec des champs "Utilisateur", "Domaine", "Mot de Passe", "Serveur"... de façon à les remplir simplement, puis de cliquer sur un bouton pour lancer le script .vbs avec les informations précédemment entrés.

Le script, je l'ai et il fonctionne
L'application est terminée et fonctionne

Comme je l'ai dit plus haut, on rentre nos informations grâce à mon appli en C# puis, mon appli écrit un fichier en .vbs avec nos infos, (comme ça, pas besoin de trifouiller le script vbs à la main :) ). Pour le faire j'ai rentré le code vbs dans mon application, et intégré des variables pour remplacer les valeurs telles que "Utilisateur"... Mais le problème (Car il y en a bien un) c'est que Visual Studio interprète certaines parties du code vbs comme étant du code utilisable dans mon application. Alors que je veux seulement écrire ces valeurs sous forme de texte.

Le code :

private void execPrgm_Click(object sender, EventArgs e)
        {
            {
            string strUserName;
            string strPassword;
            if (userName.Text.Length  == 0)
            {
                strUserName = "nom";
            }
            else
            {
                strUserName = txtNom.Text; 
            }
            if (userPwd.Text.Length == 0)
            {
                strPassword = "mot de passe";
            }
            else
            {
                strPassword = txtPrgm.Text;
            }
            try
            {
                StreamWriter sw = new StreamWriter(Application.StartupPath + "\\map.vbs");
                sw.WriteLine("Dim objNetwork , UserObj, colDrives, i, strUserName");
                sw.WriteLine("Set objNetwork = WScript.CreateObject("WScript.Network")");
                sw.WriteLine("'Unmap existing drives");
                sw.WriteLine("Set colDrives = objNetwork.EnumNetworkDrives");
                sw.WriteLine("On Error Resume Next");
                sw.WriteLine("If colDrives.Count<>0 Then");
                sw.WriteLine("For i=0 To colDrives.Count-1 Step 2");
                sw.WriteLine("objNetwork.RemoveNetworkDrive colDrives(i),"True","True" ");
                sw.WriteLine("Next");
                sw.WriteLine("End If");
                sw.WriteLine("'Map Home Drive");
                sw.WriteLine("strUserName=objNetwork.UserName");
                sw.WriteLine("'");
                sw.WriteLine("'");
                sw.WriteLine("strUserName=" + strUserName + "");
                sw.WriteLine("strPassword=" + strPassword + "");
                sw.WriteLine("'");
                sw.WriteLine("strDomain=" + strDomain + "");
                sw.WriteLine("strServer=" + strServer + "");
                sw.WriteLine("'");
                sw.WriteLine("strGroup=" + strGroup + "");
                sw.WriteLine("strRessources=" + strRessources + "");
                sw.WriteLine("'");
                sw.WriteLine("'");
                sw.WriteLine("Set UserObj=GetObject("WinNT://"+strDomain+"/"+strUserName)");
                sw.WriteLine("objNetwork.MapNetworkDrive UserObj.HomeDirDrive+":",UserObj.HomeDirectory, True, strUserName, strPassword");
                sw.WriteLine("'");
                sw.WriteLine("'");
                sw.WriteLine("'Map Group Drive");
                sw.WriteLine("objNetwork.MapNetworkDrive "Q:" , "\"+strServer+""+strGroup, True, strUserName, strPassword");
                sw.WriteLine("objNetwork.MapNetworkDrive "V:" , "\"+strServer+""+strRessources, True, strUserName, strPassword");
                sw.WriteLine("'");
                sw.WriteLine("'");
                sw.WriteLine("WScript.Quit" );
                sw.Close();
                MessageBox.Show("Script initialisé", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            
            catch
            {
                MessageBox.Show("ERREUR.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Error );
            }
        }


Donc, certaines valaeurs ne plaisent pas au débuggeur. Comment puis-je faire pour écrire ce fichier .vbs ?

A moins qu'il n'existe une autre solution pour générer un script vbs avec des variables.

Merci beaucoup :)

14 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
5 août 2008 à 23:35
Salut

Pourquoi ne pas faire avec un process.start
ou
en ecrivant le code directement en c#

Bon coding
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
5 août 2008 à 23:42
Mouais effectivement, je ne sais pas si c'est la meilleure façon de faire...
Pour ton problème, il faut échapper les caractères spéciaux avec \ ou alors s'amuser avec [mailto:'@' '@'] (mettre devant les strings)

<hr />
-My Blog-
0
Dodo299 Messages postés 11 Date d'inscription vendredi 1 juin 2007 Statut Membre Dernière intervention 23 février 2009
6 août 2008 à 11:30
Bonjour ,

Le faire avec un proces.start, je veux bien, mais je veux modifier certaines données qui seront écrites dans le fichier.

Sinon, pour le @ ça ne change rien (A moins que je ne m'y prenne pas bien)

Les erreurs sont les mêmes qu'au début :/
Pour les \ je ne vois pas trop comment faire :/

Merci beaucoup :)
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
6 août 2008 à 11:56
J'avais meme pas vu que ton programme ecrivais seulement sur le disque.

Tu peux faire un truc du genre
   sw.WriteLine(@"Dim objNetwork , UserObj, colDrives, i, strUserName
               Set objNetwork = WScript.CreateObject("WScript.Network")
               Unmap existing drives
                Set colDrives = objNetwork.EnumNetworkDrives
                On Error Resume Next
                If colDrives.Count<>0 Then
              For i=0 To colDrives.Count-1 Step 2
                objNetwork.RemoveNetworkDrive colDrives(i),"True","True"
                Next
                End If  ...");

Pour gérer le l'ecriture avec le @

Ce que je penses c'est qu'il est possible de passer des parametres (ceux de l'IHM) a un process.start
et ton fichier vbs est generique sur ton dur pas besoin de le refaire a chaque fois

Et  le process Start lance l'application vbs.
Apres le plus dur c'est de récupérer les infos (erreurs + log dans la console ou autre) si il y a du script vbs.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
6 août 2008 à 12:27
Si mes souvenirs sont bons il faut doubler le guillemet =>> ""test""

<hr />
-My Blog-
0
Dodo299 Messages postés 11 Date d'inscription vendredi 1 juin 2007 Statut Membre Dernière intervention 23 février 2009
6 août 2008 à 21:40
Alors, j'ai testé le double " mais ça ne fonctionne pas.

A mon avis, parti comme je suis parti, ça ne fonctionnera pas, puisque j'écris des valeurs que l'interpréteur interprète (Bah, oui, c'est son boulot quand même :P ) comme des commandes C#, alors qu'il ne devrait pas en tenir compte, et simplement les écrire dans le fichier texte.

Donc, il me reste la solution de [auteur/NHERVAGAULT/84425.aspx nhervagault]qui est de faire appel à un fichier .vbs externe (Que j'aurais créé auparavant). Ok, pas de problème, je sais comment faire :)

Seulement, j'ai toujours mon problème de modification du nom d'utilisateur et du mot de passe (Et encore d'autres, mais si je sais modifier le nom d'utilisateur, ça ira nickel pour le reste :) )

Donc, je fais appel à un process.Start pour lancer mon .vbs mais il faut en modifier le contenu avant, de façon à y intégrer le nom de l'utilisateur et le mot de passe.

Donc, ce qu'il me faudrait, c'est pouvoir modifier une valeur précise d'une ligne précise dans mon fichier .vbs depuis mon application.

Donc, j'ai créé deux textBox dans mon application, "userName" et "userPwd". Il faut maintenant que je créé une fonction (en C#, naturellement lol :P ) qui entre dans mon fichier .vbs le contenu des deux textBox "userName" et "userPwd" à des endroits précis

( En l'occurence les deux valeurs nom et pass dans le script  :
strUserName="nom"
strPassword="pass"
)

Et c'est là que s'arrêtent mes connaissances :/

En cherchant avec l'aide de mon ami Google, j'ai vu que c'est possible avec le xml. Mais les fichiers texte ?

Vous avez une idée ?

Encore merci :)
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
6 août 2008 à 21:53
StreamWriter

sw =


new





StreamWriter

(Application.StartupPath +


"\\map.vbs"

);
sw.WriteLine(


"Dim objNetwork , UserObj, colDrives, i, strUserName"

);
sw.WriteLine(


@"Set objNetwork = WScript.CreateObject(""WScript.Network"")"

);
sw.WriteLine(


"'Unmap existing drives"

);
sw.WriteLine(


"Set colDrives = objNetwork.EnumNetworkDrives"

);
sw.WriteLine(


"On Error Resume Next"

);
sw.WriteLine(


"If colDrives.Count<>0 Then"

);
sw.WriteLine(


"For i=0 To colDrives.Count-1 Step 2"

);
sw.WriteLine(


@"objNetwork.RemoveNetworkDrive colDrives(i),""True"",""True"" "

);
...

Fonctionne sans problème.
Mais encore une fois, c'est probablement pas une bonne solution...


<hr />
-My Blog-
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
6 août 2008 à 21:56
Salut

Voila le post qui te manque

http://www.vbfrance.com/infomsg_LANCER-VBSCRIPT-PARTIR-VB-NET-SHELL_601130.aspx

Dim p As New Process

p.StartInfo.Arguments =
"/x /y...."  
'tes arguments
p.StartInfo.FileName =
"ton_fichier.vbs"
p.Start()

Il suffit de gerer  les arguments en entrée du vbs

set var = WScript.Arguments

et tu utilises var(i) pour accéder au i-ème argument

Voila
0
Dodo299 Messages postés 11 Date d'inscription vendredi 1 juin 2007 Statut Membre Dernière intervention 23 février 2009
6 août 2008 à 22:46
Ok ben je vais tester les deux solutions, je vous dit quoi au plus tôt :)

Merci ;)
0
Dodo299 Messages postés 11 Date d'inscription vendredi 1 juin 2007 Statut Membre Dernière intervention 23 février 2009
7 août 2008 à 19:22
Bonjour :)

Alors j'ai testé la première méthode (Celle de Bidou) qui fonctionne super. Mon script est généré, et exécutable.

Par contre, vous avez une méthode pour écrire en codage ANSI ? J'ai trouvé comment faire, mais le codage ANSI n'est pas supporté, et j'ai trouvé une manière, mais elle me parait un peu farfelue :/

Si vous avez une idée  Merci beaucoup

PS: Ne vous inquiétez pas, c'est la dernière question que je pose :lol: Mon appli est quasiment finalisée
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
7 août 2008 à 19:45
Avec un code du genre ca donnes quoi a toi de voir pour le bon encoding ;-)

StreamWriter swFromFileTrueUTF8Buffer =
new StreamWriter(fileName,
true, System.Text.Encoding.UTF8,512);
0
Dodo299 Messages postés 11 Date d'inscription vendredi 1 juin 2007 Statut Membre Dernière intervention 23 février 2009
7 août 2008 à 22:43
Béé ça fonctionne pour L'UTF8, UTF32, UTF7, Unicode, ASCII ...
mais les noms : System.Text.Encoding ; Encoding.... ne contiennent pas de définition pour "ANSI"

Donc ce que je comprends, c'est que ces méthodes ne permettent pas d'écrire en ANSI.

Faut que je trouve autre chose. Domage que mon script vbs doive être écrit en ANSI :/
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
7 août 2008 à 22:55
0
Dodo299 Messages postés 11 Date d'inscription vendredi 1 juin 2007 Statut Membre Dernière intervention 23 février 2009
8 août 2008 à 00:34
Oui, j'avais trouvé cette source, il y'en avait une autre du même auteur, d'ailleurs. Mais je ne me suis pas encore penché à fond dessus. Pour le moment je règles d'autres choses sur l'appli :)

Mais je vais m'y mettre :)
0
Rejoignez-nous