Création d'un compte windows à distance sur X postes

Création d'un compte windows à distance sur X postes - Perl - Programmation

Marsh Posté le 28-04-2008 à 10:51:56    

Bonjour à tous,
 
Je me tourne une nouvelle fois vers cette communauté afin de m'aider à retrouver le sommeil  :sweat:  
 
Je tente de créer un même utilisateur sur une multitudes (+1000) de machines (Win XP).
 
Je me tourne logiquement vers les commandes Psexec (pour lancer la commande sur le poste distant) et net user (pour créer le compte localement).
 
Le programme doit :
#Récupérer les IPs des machines depuis un fichier (le fichier contient une IP par ligne)
#Créer l'utilisateur via la commande windows psexec \\IP net user NomUser MotDePasse /add
#Sortir le résultat dans un fichier.
 
Voici le programme Perl créé jusque là (non sans mal...débutant inside)
 

Code :
  1. #!C:\Perl\bin\perl
  2. #
  3. #
  4. open(IP, "C:\\IP.txt" ) || die "Erreur E/S:$!\n";
  5. open(LOG, ">>C:\\Log.txt" ) or die ("Erreur Creation Log.txt" );
  6. @ip=<IP>;
  7. foreach $ip (@ip){
  8. @dos = ` Psexec \\\\$ip NET USER NomUser MotDePasse /ADD `;
  9. foreach $cmd (@dos) {
  10. print LOG "$cmd \n";       #correction, mais ne marche toujours pas
  11. }
  12. }
  13. close(IP);
  14. close(LOG);


Ce programme lance bien les commandes sur les IP, mais ne crée aucun log : il crée le fichier Log.txt, mais celui ci est vide :(
 
Quelqu'un pourrait-il m'indiquer où se trouve mon erreur svp ?
 
 
Question bonus : afin d'analyser le résultat de la commande, je cherche à formater le fichier de sortie (Log.txt) de la manière suivante :

Code :
  1. 192.168.1.1 : OK
  2. 192.168.1.2 : HS


Sachant que si la commande s'est bien déroulée, l'invite de commande Dos renvoie
-La commande s'est terminée correctement.
ou
-Le compte existe déjà.
 
Et qui si la commande n'est pas passée, l'invite de commande DOS renvoie  
Couldn't access 192.168.1.1:
Le chemin rÚseau n'a pas ÚtÚ trouvÚ.
 
J'avais trouvé un filtre avec grep, mais le script doit être lancé depuis un windows...
 
Je vous remercie grandement de m'avoir lu, et encore plus si une éventuelle réponse est apportée. Je pense qu'un tel programme pourrait sauver la journée de plus d'un admin ;)
 
Mcadams


Message édité par mcadams le 28-04-2008 à 12:51:03
Reply

Marsh Posté le 28-04-2008 à 10:51:56   

Reply

Marsh Posté le 28-04-2008 à 12:13:44    

Code :
  1. foreach $cmd (@dos) {
  2.   print LOG "$cmd \n";
  3. }


 
C'est ça que tu veux faire ?

Reply

Marsh Posté le 28-04-2008 à 12:50:12    

Bonjour,
 
Autant pour moi : c'était comme ça dans mon fichier à l'origine, ça a sauté suite à une de mes tentatives.
 
Donc oui, c'était ça, et ça ne marche pas : Le fichier de sortie est créé, mais ne récupère pas les commandes passées ni les retours.
 
Merci quand même ! :)

Reply

Marsh Posté le 28-04-2008 à 13:31:44    

Code :
  1. #!C:\Perl\bin\perl
  2. #
  3. #
  4. open(IP, "C:\\IP.txt" ) || die "Erreur E/S:$!\n";
  5. open(LOG, ">>C:\\Log.txt" ) or die ("Erreur Creation Log.txt" );
  6. my @ip = <IP>;
  7. close(IP);
  8. foreach my $ip (@ip) {
  9.   push(@dos, `Psexec \\\\$ip NET USER NomUser MotDePasse /ADD`);
  10. }
  11. foreach my $cmd (@dos) {
  12.   print LOG "$cmd \n";
  13. }
  14. close(LOG);
 

Je dis pas que ça va corriger le problème, essaye juste de voir comment récupérer la sortie de ta commande :) Quitte à la mettre dans une variable pour ensuite faire un push dans ta liste @dos.


Message édité par SpN le 28-04-2008 à 13:37:56
Reply

Marsh Posté le 28-04-2008 à 13:40:48    

Je viens de tester avec une autre commande (netsh) qui a une sortie selon le résultat de son exécution, et mon log est bien renseigné :hello:

Reply

Marsh Posté le 28-04-2008 à 14:04:29    

SpN a écrit :

Je viens de tester avec une autre commande (netsh) qui a une sortie selon le résultat de son exécution, et mon log est bien renseigné :hello:


 
Rebonjour à toi,
 
Je te remercie vivement pour cette modification.
 
A partir de ton code, je n'ai toujours pas le fichier Log.txt renseigné via la commande Psexec. MAIS PAR CONTRE, il est bien renseigné si je tape une autre commande (ping dans mon cas) de la même manière j'imagine que ça fonctionne pour toi avec netsh.
 
Lorsque je fais un ping, rien ne s'affiche dans l'invite de commande, ce qui est normal vu que c'est redirigé dans le Log.txt.
Lorsque je fais le Psexec, le résultat s'affiche directement dans l'invite de commande... et non dans le Log.txt :(
 

Citation :

essaye juste de voir comment récupérer la sortie de ta commande :) Quitte à la mettre dans une variable pour ensuite faire un push dans ta liste @dos.


Ce n'est pas ce qu'est sensé faire le push(@dos, `Psexec \\\\$ip NET USER NomUser MotDePasse /ADD`); que tu proposes ? Il y a une autre méthode ?  
 
Pourquoi faut-il que je tombe sur LA commande qui refuse de marcher :x
 
Merci encore de l'aide que tu apportes.
 
édit :

Citation :

Si Psexec est un utilitaire d’administration de systèmes polyvalent, c’est bien parce qu’il est capable de rediriger l’entrée et la sortie des applications de console.


D'accord... je sens que ça va être compliqué. Je poursuis les recherches !


Message édité par mcadams le 28-04-2008 à 14:08:37
Reply

Marsh Posté le 28-04-2008 à 14:12:42    

Pourquoi tu fais pas un batch au faite ?

 

Tu as regardé les options de Psexec ?


Message édité par SpN le 28-04-2008 à 14:15:36
Reply

Marsh Posté le 28-04-2008 à 14:53:37    

J'suis encore plus nul en batch, et un ami m'a aidé en Perl, donc par la force des choses, je me suis retrouvé avec un Perl.
 

Citation :

Usage: psexec [\\computer[,computer2[,...] | @file][-u user [-p psswd]][-n s][-l
][-s|-e][-x][-i [session]][-c [-f|-v]][-w directory][-d][-<priority>][-a n,n,...
] cmd [arguments]
     -a         Separate processors on which the application can run with
                commas where 1 is the lowest numbered CPU. For example,
                to run the application on CPU 2 and CPU 4, enter:
                "-a 2,4"
     -c         Copy the specified program to the remote system for
                execution. If you omit this option the application
                must be in the system path on the remote system.
     -d         Don't wait for process to terminate (non-interactive).
     -e         Does not load the specified account's profile.
     -f         Copy the specified program even if the file already
                exists on the remote system.
     -i         Run the program so that it interacts with the desktop of the
                specified session on the remote system. If no session is
                specified the process runs in the console session.
     -l         Run process as limited user (strips the Administrators group
                and allows only privileges assigned to the Users group).
                On Windows Vista the process runs with Low Integrity.
     -n         Specifies timeout in seconds connecting to remote computers.
     -p         Specifies optional password for user name. If you omit this
                you will be prompted to enter a hidden password.
     -s         Run the remote process in the System account.
     -u         Specifies optional user name for login to remote
                computer.
     -v         Copy the specified file only if it has a higher version number
                or is newer on than the one on the remote system.
     -w         Set the working directory of the process (relative to
                remote computer).
     -x         Display the UI on the Winlogon secure desktop (local system
                only).
     -priority  Specifies -low, -belownormal, -abovenormal, -high or
                -realtime to run the process at a different priority. Use
                -background to run at low memory and I/O priority on Vista.
     computer   Direct PsExec to run the application on the remote
                computer or computers specified. If you omit the computer
                name PsExec runs the application on the local system,
                and if you specify a wildcard (\\*), PsExec runs the
                command on all computers in the current domain.
     @file      PsExec will execute the command on each of the computers listed
                in the file.
     program    Name of application to execute.
     arguments  Arguments to pass (note that file paths must be
                absolute paths on the target system).


 
...
 
D'accord ...
En faisant un "simple"  

Code :
  1. psexec @IP.txt net user NomUser MotDePasse -s 2>Log.txt


(j'ai trouvé le -s 2> sur un autre forum... je n'ai pas encore tout compris, mais ça marche)
 
Psexec balance les requêtes sur les IP fournies dans la liste IP.txt et crée le fichier de sortie Log.txt.
 
 
J'ai donc paumé un week end à tenter de coder (quoique j'ai appris un peu) et plus important je vous ai fait perdre un peu de temps sur mon code, et j'en suis désolé.
 
Me reste à trier le fichier de sortie qui ressemble à ça :

Citation :


PsExec v1.94 - Execute processes remotely
Copyright (C) 2001-2008 Mark Russinovich
Sysinternals - www.sysinternals.com
 
La syntaxe de cette commande estÿ:
 
 
NET USER  
[nom d'utilisateur [mot de passe | *] [options]] [/DOMAIN]
         nom d'utilisateur {mot de passe | *} /ADD [options] [/DOMAIN]
         nom d'utilisateur [/DELETE] [/DOMAIN]
 
Le chemin réseau n'a pas été trouvé.
Connecting to 152.141.66.192...
                                                                               
 
Starting PsExec service on 152.141.66.192...
                                                                               
 
Connecting with PsExec service on 152.141.66.192...
                                                                               
 
Starting net on 152.141.66.192...
                                                                               
 net exited on 152.141.66.192 with error code 1.
Connecting to 192.168.1.2...
                                                                               
Connecting to 192.168.1.2...
                                                                               
 
Couldn't access 192.168.1.2:
 
Make sure that the default admin$ share is enabled on 192.168.1.2.


 
C'est parti !
 
Encore merci, et pardon !

Reply

Marsh Posté le 28-04-2008 à 15:03:59    

Le > redirige la sortie ;)
 
Bye :hello:

Reply

Marsh Posté le 28-04-2008 à 15:05:43    

C'est le 2 qui m'intrigue en fait :)
 
Encore merci à toi !
 
J'espère être en mesure de te dépanner un jour.

Reply

Marsh Posté le 28-04-2008 à 15:05:43   

Reply

Marsh Posté le 28-04-2008 à 15:12:09    

Ca doit surement préciser quelle sortie rediriger :)

Reply

Sujets relatifs:

Leave a Replay

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