< < E-NEF > >
Prog. Perl | Art Roman | Voyager | Cartes ()
                  dragon                     e-nef                 Plan du Site
Contact
my.e-nef v0.1
  • Kernel Linux stable: 2.6
  • Perl: 5.8
  • Apache: 2.0
  • mod_perl: 2.0
  • postgres: 8.0


Rubriques


Recherche sur le Site





Bookmarks


Recommandation de Lecture


Questions ?
Dites nous ce que vous
avez pensé de cette page

 Excellent
 Vaut le coup de le lire
 Sans intérêt

 Pas assez technique
 Juste comme il faut
 Trop technique



Menu


Perl sous NT

english version

N.B. Ces pages ont été réalisées car il est actuellement très difficile (mi-1998) de trouver ces informations. L'idéal serait de faire un site sur Perl et NT. Si vous avez des commentaires ou souhaitez contribuer, n'hésitez pas à m'écrire

Installer Perl

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 mirroirs des CPAN (Comprehensive Perl Archive Network).

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... Ils ravaillent en ce moment à une émulation du fork sous NT et Mac à base de Threads.

Installer une variable d'environnement via la base de registre

Prenons par exemple l'ajout du chemin vers l'interpréteur Perl dans les variables de NT.

Cela se trouve dans SYSTEM\CurrentControlSet\Control\Session Manager\Environment, on ouvre donc cette clef:

$p="SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment";
$main::HKEY_LOCAL_MACHINE->Open($p,$srv)||die "open: $!";
et on lit la table de Hashage des valeurs:
$srv->GetValues(\%vals)||die "QueryValue: $!";
ensuite on vérifie si le chemin n'est pas déjà présent, si ce n'est pas le cas, on l'ajoute:
if (!($vals{'Path'}[2] =~/perl/i)) {
        $value=$vals{'Path'}[2];
        $srv->SetValueEx("Path",0,REG_SZ,"c:\\perl\\bin;$value");
}

Installer un Script Perl en tant que service

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: $!";
il faut 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)||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 (nota bene : 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:\tetmp\toto.out, on redirige la sortie erreur standard (StdERR sous perl, device 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 ...

Emuler 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.

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.

A 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") || warn "$0 $!";
et le tour est joué !

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 pour 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 profile de l'utilisateur courant; hors connection ou sous un autre login, il ne le sera plus, à moins que ce nouveau profile le mappe lui-même.

Envoyer un mail sous NT

Deux cas se présentent:

  • Outlook:
    Les Ressources Kit de NT fournissent un utilisatire appelé MAPISEND qui permet d'envoyer via un profile Outlook existant un Mail via Outlook. Il suffit alors d'utiliser la ligne de commande correspondante.

  • Serveur SMTP ou passerelle SMTP sous Exchange:
    Méthode plus standard, grâce à la libnet de Perl (non disponible sous ActiveWare, il faut alors créer les sockets ...) qui fournit via Net::SMTP toute l'interface à ce protocole;

    L'appel se fait par use Net::SMTP; , ensuite il faut ouvrir un serveur SMTP:
    $smtp = Net::SMTP->new("$MAILHOST");
    et dire qui émet:
    $smtp->mail("epierre\@mail.esiea.fr");
    et à qui ce mail est destiné:
    $smtp->to("$EMAIL");
    et après on envoit les données:
    smtp->data();
    $smtp->datasend("To: $EMAIL\n");
    $smtp->datasend("Cc: $CONTACT\n");
    $smtp->datasend("Subject: Perl sous NT, la galère ?\n");
    
    ici, on spécifie à nouveau à qui on écrit, puis on définit un CC (Carbon Copy, copie en double du mail vers quelqu'un d'autre), et enfin le sujet après le mot clef Subject. On continue à envoyer le contenu du mail par $smtp->datasend("") que l'on répète autant de fois que de ligne à émettre, et on ferme le mail par
    $smtp->dataend();
    $smtp->quit(); 
    
    Le mail est maintenant parti !

Utiliser une base Access via ODBC

Trois étapes sont nécessaires:

  1. Avoir le driver ODBC correspondant (Démarrer/Control Panel/ODBC 32/)
  2. Ajouter sa base au DSN Utilisateur (voir ODBC Home Page
  3. Y accéder
La dernière étape se fait via Perl:
  • la base dispose d'un nom alias via le DSN qui sert à l'appeler. On crée l'objet :
    $db = new Win32::ODBC($dsn);
  • on forme ensuite la requète SQL:
    $sql = "SELECT * FROM annuaire WHERE priorite <= $priorite2 
    ORDER BY nom,prenom ";
    par exemple.
  • on émet ensuite la commande:
    $db->Sql($sql);
  • on récupère le résultat (si plusieurs champs):
    while ($db->FetchRow()) {
  • et on met dans des variables le contenu de l'enregistrement:
    ($nom,$prenom,$tel)=$db->Data("nom","prenom","tel")
    }
  • on peut vérifier le code retour via:
    $db->Error();
  • et on ferme la connection à la base:
    $db->Close();
Simple, simple ... énormément oui !

Autres liens



Publicité

© Copyright 1998-2005 Emmanuel PIERRE. Libre reproduction sous Licence LLDDv1.
Pour tout commentaire, webmaster@e-nef.com
Dernière MaJ

Valid XHTML 1.0!

No Patents/