Le but recherché est de lancer des commandes sur des systèmes Windows, depuis un shell Unix et ce sans rien installer sur N systèmes Windows (N grand). Il existe bien cmdat(1) (cf. Gérer des systèmes Windows depuis Unix, outil fournit avec Samba 4) mais il est clairement supplanté par Winexe1), outil libre2) qui s'utilise à la manière de PsExec.

PsExec fait partie des SysInternals Tools, une suite logicielle de petits outils admin-friendly qui se lancent — sans s'installer — depuis un site Web, une clef USB ou un partage réseau par exemple. Cet ensemble d'outils comprend les PsTools, dédiés aux processus. On trouve par exemple un ps(1)-like appelé PsInfo. Ces outils prennent en argument \\hosthost est le système sur lequel la commande doit être appliquée3). PsExec est le couteau suisse de l'administrateur de parc Windows, il lui permet de se connecter via le partage administratif ADMIN$ à ses systèmes comme il le ferait avec rsh(1) ou ssh(1) sur des systèmes Unix. PsExec utilise le protocole SMB : si les partages administratifs sont activés (ce qui est généralement le cas), il n'y a rien à installer ni à configurer sur les clients pour utiliser les PsTools.

Exemple :

U:\pstools>PsExec.exe \\192.168.1.61 ipconfig
 
PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com
 
 
 
Configuration IP de Windows
 
 
Carte Ethernet Connexion au réseau local:
 
        Suffixe DNS propre à la connexion : local.net
        Adresse IP. . . . . . . . . . . . : 192.0.2.61
        Masque de sous-réseau . . . . . . : 255.255.255.0
        Passerelle par défaut . . . . . . : 192.0.2.254
ipconfig exited on 192.168.1.61 with error code 0.

Winexe est basé sur le code de Samba 4 et permet la même chose : lancer à distance des commandes via les partages administratifs. De même que pour les PsTools, si ces partages sont activés, il n'y a rien à faire sur les clients pour utiliser Winexe.

Télécharger la dernière version (1.00 actuellement) de Winexe. Les outils de développement classiques sont nécessaires :

Extraire les fichiers puis générer et lancer le script de configuration des sources (configure) :

$ cd winexe-1.00/source4
$ ./autogen.sh
...
$ ./configure
...

Compiler le binaire à partir des sources nouvellement configurées pour notre système (noter au passage l'utilisation de GNU Make et non pas le BSD make(1) fournit avec le système) :

$ gmake basics
...
$ gmake idl
...
$ gmake bin/winexe
...

C'est complètement overkill et on devrait pouvoir abréger en :

$ gmake proto
...
$ gmake bin/winexe
...

mais plusieurs bugs en cascade empêchent la compilation ; la flemme a été plus forte que la curiosité jusqu'à maintenant ;-)

Sur NetBSD 5.1_STABLE i386 et amd64, ça se passe bien et on obtient un binaire bin/winexe :

$ ldd bin/winexe                    
bin/winexe:
        -lz.1 => /usr/lib/libz.so.1
        -lc.12 => /usr/lib/libc.so.12
        -lintl.0 => /usr/lib/libintl.so.0
        -lcrypt.0 => /usr/lib/libcrypt.so.0

Pour information, sur Debian GNU/Linux Lenny i386 on obtient :

$ ldd bin/winexe
        linux-gate.so.1 =>  (0xb7fc9000)
        libsasl2.so.2 => /usr/lib/libsasl2.so.2 (0xb7f98000)
        libgpg-error.so.0 => /usr/lib/libgpg-error.so.0 (0xb7f94000)
        libgcrypt.so.11 => /usr/lib/libgcrypt.so.11 (0xb7f2b000)
        libgnutls.so.26 => /usr/lib/libgnutls.so.26 (0xb7e8e000)
        libz.so.1 => /usr/lib/libz.so.1 (0xb7e79000)
        libresolv.so.2 => /lib/i686/cmov/libresolv.so.2 (0xb7e65000)
        libpopt.so.0 => /lib/libpopt.so.0 (0xb7e5c000)
        libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7e58000)
        libcrypt.so.1 => /lib/i686/cmov/libcrypt.so.1 (0xb7e25000)
        libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7cca000)
        libtasn1.so.3 => /usr/lib/libtasn1.so.3 (0xb7cba000)
        /lib/ld-linux.so.2 (0xb7fca000)
Testé uniquement sur i386 ; sur adm64, la compilation échoue (pas encore cherché la raison).

:!: En travaux

Au lancement, s'affiche :

$ winexe 
Unknown enumerated value 'domain' for 'security'
winexe version 1.00
This program may be freely redistributed under the terms of the GNU GPLv3
Usage: winexe [-?] [-?] [-?] [-?NP] [-?NPV] [-?|--help] [--usage] [-d|--debuglevel DEBUGLEVEL]
        [--debug-stderr] [-s|--configfile CONFIGFILE] [--option=name=value]
        [-l|--log-basename LOGFILEBASE] [--leak-report] [--leak-report-full]
        [-R|--name-resolve NAME-RESOLVE-ORDER]
        [-O|--socket-options SOCKETOPTIONS] [-n|--netbiosname NETBIOSNAME]
        [-S|--signing on|off|required] [-W|--workgroup WORKGROUP]
        [--realm=REALM] [-i|--scope SCOPE] [-m|--maxprotocol MAXPROTOCOL]
        [-U|--user [DOMAIN/]USERNAME[%PASSWORD]] [-N|--no-pass]
        [--password=STRING] [-A|--authentication-file FILE] [-P|--machine-pass]
        [--simple-bind-dn=STRING] [-k|--kerberos STRING] [-V|--version]
        [--uninstall] [--reinstall] [--system]
        [--runas=[DOMAIN\]USERNAME%PASSWORD] [--runas-file=FILE]
        [--interactive=0|1] [--ostype=0|1|2] //host command

Pour reprendre l'exemple précédent :

$ winexe -U user%monpasswordquilestbeau //192.168.1.61 ipconfig     

Configuration IP de Windows


Carte Ethernet Connexion au réseau local:

        Suffixe DNS propre à la connexion : local.net
        Adresse IP. . . . . . . . . . . . : 192.168.1.61
        Masque de sous-réseau . . . . . . : 255.255.255.0
        Passerelle par défaut . . . . . . : 192.168.1.1

On peut même s'offrir le luxe d'une connexion interactive :

$ winexe -U user%monpasswordquilestbeau //192.168.1.61 cmd
Microsoft Windows XP [version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\WINDOWS\system32>ipconfig
ipconfig

Configuration IP de Windows


Carte Ethernet Connexion au réseau local:

        Suffixe DNS propre à la connexion : local.net
        Adresse IP. . . . . . . . . . . . : 192.168.1.61
        Masque de sous-réseau . . . . . . : 255.255.255.0
        Passerelle par défaut . . . . . . : 192.168.1.1

mais l'édition de commandes reste limitée (je ne connais pas l'équivalent de stty(1) s'il existe…).

Noter que le répertoire de travail lors de la connexion est C:\\Windows\System32. Il faut prendre l'habitude de commencer par changer de répertoire avant de lancer quoi que ce soit ; ainsi, on évitera de polluer le répertoire — voire de supprimer malencontreusement un binaire indispensable.

Bon, la belle affaire, il peut se connecter à des systèmes Windows depuis son shell Unix me direz-vous. Certes mais je peux surtout scripter des commandes sur plusieurs systèmes. Voici un exemple trivial de changement du serveur NTP sur les postes d'une salle de TP :

#!/bin/ksh
 
for i in $(seq 1 24); do
   ping -c 2 -w 1 ${1}.${i} >/dev/null 2>&1
   if [[ $? -ne 0 ]]; then
      echo "${1}.${i} is out of control, halted?"
   else
      winexe -W DOMAIN -Uuser%$2 \\${1}.${i} net time /setsntp:ntp.eila.univ-paris-diderot.fr
      winexe -W DOMAIN -Uuser%$2 \\${1}.${i} net stop w32time
      winexe -W DOMAIN -Uuser%$2 \\${1}.${i} net start w32time
   fi
done

Pour changer le serveur NTP sur la salle dont les postes dans 172.17.3.0/27 il suffit alors de lancer le script avec deux arguments :

$ ./win/ntp.sh 172.17.3 monpasswordquilestbeau
...

On trouvera moult idées de scripts en fouillant les sites AppDeploy.com et WPKG.org ou en relisant Windows Inside Out et les Resource Kit.


1)
Voir aussi la page Wikipédia Winexe.
2)
Winexe est distribué sous licence GPLv3.
3)
On peut aussi les utiliser localement mais ça n'est pas ce qui nous préoccupe ici.
  • user/pc/sysadmin/winexe_psexec_pour_unix.txt
  • Dernière modification : 2011/08/22 13:27
  • de pc