Winexe : un outil PsExec-like pour Unix ou Linux
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 \\host
où host
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.
Compilation et installation de Winexe sur NetBSD
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 , ça se passe bien et on obtient un binaire amd64
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)
i386
; sur adm64
, la compilation échoue (pas encore cherché la raison).
Utilisation de Winexe
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…).
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.