next up previous contents index
suivant: 11. Les références monter: perl précédent: 9. Fonctions avancées   Table des matières   Index

Sous-sections


10. Perl WIN32/NT

10.1 Présentation

La machine virtuelle de perl, plus que celle de Java, est portée et supportée sur de nombreuses plateformes.

De plus, perl intègre des librairies d'interface au système sur lequel il s'exécute, ce qui facilite son intégration.

Dans ce chapître, nous verrons comment utiliser les alternatives et extensions de perl pour WIN32

10.2 Installation

La meilleure façon d'avoir un perl à jour est de prendre la dernière version, qui porte le nom de perl5.xxxx-bindistxx-bc.zip disponible sur tous les miroirs CPAN dans ports/WIN32/. Le chemin le plus plausible pour installer perl est dans la racine, i.e. c:\perl.

Comme rares sont les NT fournis avec un compilateur C (à part les compilateurs commerciaux ou gratuits e.g. le portage de GCC par cygnus), à l'installation est demandé si vous voulez disposer des sources.

Pour cette raison, beaucoup de modules nécessitant la compilation sont livrés pré-compilés, les fonctions réseau libnet et LWP, l'interface Tk, Database Interface, HTML, HTTP, MIME, Graphic Device (GD), MD5 et bien-sûr Win32 (OLE, ODBC, ...).

De plus il vous est proposé d'avoir la documentation au format HTML, ce qui est plus pratique hors d'un environnement facilitant l'utilisation de la ligne de commande.

N.B. Les versions distribuées par ActiveWare semblent toujours en retard d'une version, et peu fournies en modules précompilés.

10.3 Utiliser la base de registre

10.3.1 Installer une variable d'environnement via la base de registre

Pour ajouter le chemin vers l'interpréteur perl dans les variables de NT, il faut accéder au fichier de registres via use WIN32;.

La valeur à ajouter se trouve dans
\begin{code}
SYSTEM\texttt{\symbol{92}}CurrentControlSet\texttt{\symbol{92}}Control\texttt{\symbol{92}}Session Manager\texttt{\symbol{92}}Environment
\end{code}
, on ouvre donc cette clef :

$p = "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment";
$main::HKEY_LOCAL_MACHINE->Open($p, $srv) or die "open: $!";

et on lit la table de hachage des valeurs :

$srv->GetValues(\%vals) or die "QueryValue: $!";

On peut vérifier si le chemin est déjà présent, sinon on l'ajoute :

if (!($vals{'Path'}[2] =~ /perl/i)) {
        $value=$vals{'Path'}[2];
        $srv->SetValueEx("Path", 0,REG_SZ, "c:\\perl\\bin;$value");
}

10.3.2 Installer un Script perl en tant que service (NT seulement)

Un service NT répond à un interfaçage de message pour le démarrage, la mise en pause et l'arrêt. Un script seul ne peut donc être installé.

Le NT Ressource Kit 3 fournit INSTSRV et ANYSRV, le premier installant le second qui est l'interface service.

Comme exemple on crée un service appelé PerlService :

`c:\\peliproc\\instsrv.exe PerlService c:\\peliproc\\srvany.exe`;

Cela installe une entrée dans la base de registres. Vous pouvez alors finir l'installation à la main comme spécifié dans la documentation de ces outils ou modifier via Win32::Registry les entrées :

$p = "SYSTEM\\CurrentControlSet\\Services\\PerlService";
$main::HKEY_LOCAL_MACHINE->Open($p,$srv)||die "open: $!";

et maintenant créer la clef Parameters contenant

Application
le chemin complet vers le script
AppParameters
les paramètres d'exécution
AppDirectory
le chemin d'où il sera lancé

ce que l'on fait ainsi :

$srv->Create("Parameters", $param) or die "Create: $!";
$param->SetValueEx("Application", 0, REG_SZ, "c:\\perlproc\\scan.cmd");
$param->SetValueEx("AppParameters", 0, REG_SZ, "2>c:\\temp\\toto.out");
$param->SetValueEx("AppDirectory", 0, REG_SZ, "c:\\perlproc\\");

On lance donc scan.cmd dans le répertoire c:\perlproc (N.B. :: il faut répéter le \ séparateur de répertoire sous NT, qui sert à 'échapper' i.e. utiliser les caractères spéciaux sous perl, donc pour avoir \ on le double: \\).

L'argument est 2>c:\temp\toto.out, on redirige la sortie erreur standard (STDERR sous perl, descripteur de fichier numéro 2 sous tout les O.S.) vers un fichier.

Maintenant il faut pouvoir démarrer le service.

`d:\\winnt\\system32\\net.exe start PerlService`;

La seule chose que cet exemple passe sous silence est que le service est démarré avec le compte SYSTEM qui sous NT a plus de priorités que les autres comptes, même Administrator. Il est possible en modifiant la base de Registres de spécifier un autre utilisateur, mais ... il faut rentrer un mot de passe, ce que je ne sais pas faire via la base de registres ...

10.4 Émuler une crontab sous NT

La commande at et son interface winat ne permettent que d'exécuter une tâche par jour, et ce sous le compte SYSTEM. Pour certaines tâches, cela est trop contraignant, e.g. scanner un répertoire toutes les 10 mn.

Pour cela, l'idéal est de créer un Service NT, et dans le script perl ajouter une boucle sans fin, et un sleep(600) pour 10 mn i.e. 10*60 secondes.

10.5 Accès disque et Serveurs de fichiers

10.5.1 Lire sur une ressource UNC sous NT

Cela se fait simplement en appelant la commande externe NET.

`d:\\winnt\\system32\\net.exe use \\serveur\ressource "mot_de_passe" /USER:"nom_d'utilisateur"'

L'idéal pour connaître la commande de retour est de rediriger avec 2> vers un fichier et le scanner après coup.

À partir de là, l'environnement courant a mémorisé l'autorisation d'accès à cette ressource, et pour y accéder ensuite, il suffit de spécifier le chemin comme un chemin normal :

open(FIC,"\\serveur\ressource\vol1\DD-XF-FF.080") or warn "$0 $!";

10.5.2 Mapper un lecteur sous NT

Mapper un lecteur c'est associer à une ressource sur un réseau, un device, i.e. lecteur, représenté de a: à z:.

Cela se fait de la même façon sous NT, mais l'utiliser en tant que service pose le problème que l'utilisateur peut déjà utiliser le nom de device (seulement 23 disponibles au minimum). Un lecteur mappé ne l'est que dans le profil de l'utilisateur courant ; hors connexion ou sous un autre login, il ne le sera plus, à moins que ce nouveau profil ne le mappe lui-même.


next up previous contents index
suivant: 11. Les références monter: perl précédent: 9. Fonctions avancées   Table des matières   Index
Olivier Aubert 2000-06-28