You are not logged in.

Announcement

 Téléchargez la dernière version stable de GLPI      -     Et vous, que pouvez vous faire pour le projet GLPI ? :  Contribuer
 Download last stable version of GLPI                      -     What can you do for GLPI ? :  Contribute

#1 2013-09-03 15:38:27

DukeFarell
Member
Registered: 2013-08-13
Posts: 63

aide developpement plugin

Bonjour,

je suis en train de développer un plugin (getofficekeys) pour gérer les infos des produits Microsoft Office, déjà récupérées par un plugin spécifique dans OCS Inventory.

J'ai créé les fonctions d'installation, de désinstallation, d'initialisation et de vérification de la configuration. J'ai deux soucis que je ne comprends pas, si une âme charitable de grand chemin pouvait m'éclairer sur ces points, je serais ravi smile

1 - Je possède la bonne structure de dossier (d'après le plugin "Example" et ce lien https://forge.indepnet.net/projects/plu … Convention ) mais mon plugin qui apparaît dans la liste GLPI est marqué à Non dans CSRF Compliance. Pourtant je n'ai encore aucun formulaire, et j'ai bien ajouté la ligne :

// CSRF compliance : All actions must be done via POST and forms closed by Html::closeForm();
   $PLUGIN_HOOKS['csrf_compliant']['getofficekeys'] = true;

dans la fonction plugin_init_getofficekeys() ou init_plugin_getofficekeys (au final je ne sais plus quel nom utiliser lol)
Comment être CSRF compliant dans ce cas ?

2- Lorsque j'installe mon plugin, il créé bien les tables nécessaires, mais le plugin n'apparaît jamais comme "installé". Je ne peux donc pas l'activer. Dois-je changer l'état manuellement dans la table GLPI_PLUGINS ?

Merci d'avance pour vos réponses, et à la communauté GLPI wink


http://www.fortisfio.com/
Blog d'échange de connaissances et d'informatique

Offline

#2 2013-09-03 18:28:43

DukeFarell
Member
Registered: 2013-08-13
Posts: 63

Re: aide developpement plugin

Bon, je pense que le plus simple serait de laisser libre accès aux sources, ou que je décrive ici l'architecture de mon plugin.

Voici la structure de mon repertoire /plugins/getofficekeys :

- front
     - config.form.php (formulaire de configuration)
     - plugin_getofficekeys.profile.form.php (formulaire de définition de droits)
     - plugin_getofficekeys.profile.php

- inc
     - config.class.php (classe de configuration)
     - profile.class.php (classe de définition de droits)

- locales (rien pour le moment)
 
- pics (des images ...)
     - ...

hook.php (description plus bas)
index.php ( vide pour le moment)
setup.php (description plus bas)
LICENCE

hook.php : les fonctions

function plugin_getofficekeys_changeprofile() {

   $plugin = new Plugin();
   if ($plugin->isActivated("getofficekeys")) {
      if (Session::haveRight("logs", "r") || Session::haveRight("ocsng", "w")) {
         $PLUGIN_HOOKS['menu_entry']['getofficekeys'] = true;
      } else {
         $PLUGIN_HOOKS['menu_entry']['getofficekeys'] = false;
      }
   }
}
function plugin_change_profile_getofficekeys() {

   // For example : same right of computer
   if (Session::haveRight('computer','w')) {
      $_SESSION["glpi_plugin_getofficekeys_profile"] = array('getofficekeys' => 'w');

   } else if (Session::haveRight('computer','r')) {
      $_SESSION["glpi_plugin_getofficekeys_profile"] = array('getofficekeys' => 'r');

   } else {
      unset($_SESSION["glpi_plugin_getofficekeys_profile"]);
   }
}

Dans des exemples j'ai vu ces deux titres pour cette fonction, du coup je ne sais pas lequel il faut utiliser. Si j'ai bien compris, change_profile permet de définir les droits de l'utilisateur actif sur le plugin défini.

Il y a évidemment d'autres fonctions, mais je ne les utilises pas pour le moment.

setup.php :

function plugin_getofficekeys_init() 
{
    global $PLUGIN_HOOK, $CFG_GLPI;

   // Params : plugin name - string type - ID - Array of attributes
   Plugin::registerClass('PluginGetOfficeKeysDropdown');

   $types = array('Central', 'Computer', 'ComputerDisk', 'Notification', 'Phone','Preference', 'Profile', 'Supplier');
   
   Plugin::registerClass('PluginGetOfficeKeys',
                         array('notificationtemplates_types' => true,
                               'addtabon'                    => $types));

   Plugin::registerClass('PluginGetOfficeKeys',
                         array('rulecollections_types' => true));

   // Display a menu entry ?
   if (isset($_SESSION["glpi_plugin_getofficekeys_profile"])) { // Right set in change_profile hook
      $PLUGIN_HOOKS['menu_entry']['getofficekeys'] = 'front/plugin_getofficekeys.profile.php';

      $PLUGIN_HOOKS['submenu_entry']['getofficekeys']['options']['optionname']['title'] = "Synchroniser GLPI et OCS";
      $PLUGIN_HOOKS['submenu_entry']['getofficekeys']['options']['optionname']['page']  = '/plugins/getofficekeys/front/plugin_getofficekeys.profile.php';
      $PLUGIN_HOOKS['submenu_entry']['getofficekeys']['options']['optionname']['links']['search'] = '/plugins/getofficekeys/front/plugin_getofficekeys.profile.php';
      $PLUGIN_HOOKS['submenu_entry']['getofficekeys']['options']['optionname']['links']['add']    = '/plugins/getofficekeys/front/plugin_getofficekeys.profile.form.php';
      $PLUGIN_HOOKS['submenu_entry']['getofficekeys']['options']['optionname']['links']['config'] = '/plugins/getofficekeys/index.php';
      $PLUGIN_HOOKS['submenu_entry']['getofficekeys']['options']['optionname']['links']["<img  src='".$CFG_GLPI["root_doc"]."/pics/menu_showall.png' title='".__s('Show all')."' alt='".__s('Show all')."'>"] = '/plugins/getofficekeys/index.php';
      $PLUGIN_HOOKS['submenu_entry']['getofficekeys']['options']['optionname']['links'][__s('Lien de test', 'getofficekeys')] = '/plugins/getofficekeys/index.php';

      $PLUGIN_HOOKS["helpdesk_menu_entry"]['getofficekeys'] = true;
   }

   // Config page
   if (Session::haveRight('config','w')) {
      $PLUGIN_HOOKS['config_page']['getofficekeys'] = 'front/config.form.php';
   }

   // Init session
   //$PLUGIN_HOOKS['init_session']['getofficekeys'] = 'plugin_init_session_getofficekeys';
   // Change profile
   $PLUGIN_HOOKS['change_profile']['getofficekeys'] = 'plugin_change_profile_getofficekeys';
   // CSRF compliance : All actions must be done via POST and forms closed by Html::closeForm();
   $PLUGIN_HOOKS['csrf_compliant']['getofficekeys'] = true;
}
function plugin_version_getofficekeys() {

   return array('name'           => 'Get Office Keys',
                'version'        => '1.0',
                'author'         => 'Moi',
                'license'        => 'GPLv2+',
                'homepage'       => 'https://forge.indepnet.net/projects/getofficekeys',
                'minGlpiVersion' => '0.83'); // For compatibility / no install in version < 0.80
}
function plugin_getofficekeys_check_config($verbose=true) {
   if (version_compare(GLPI_VERSION,'0.83','lt')) { // Your configuration check
        echo "Le plugin getofficekeys requiert GLPI version 0.83 ou supérieure";
        return false;
   } 
   if ($verbose) {
     _e('Installé / Non configuré', 'getofficekeys');
   }
   return true; 
} 
function plugin_getofficekeys_install() {

    global $DB;
    $migration = new Migration(100);
    
   // création de la table de stockage GLPI/OCS des données office
    if (!TableExists("glpi_plugin_getofficekeys_officepack")) {
        $query = "CREATE TABLE `glpi_plugin_getofficekeys_officepack` (
                  `id` int(11) NOT NULL auto_increment,
                  `hardware_id` int(11) NOT NULL,
                  `product` varchar(255),
                  `officeversion` int(11) NOT NULL default '0',
                  `officekey` varchar(255) NOT NULL default '0',
                  `is_deleted` tinyint(1) NOT NULL default '0',
                PRIMARY KEY (`id`)
               ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";

        $DB->query($query) or die("Erreur lors de la creation de la table glpi_plugin_getofficekeys_officepack". $DB->error());
    }
    
    // requete de création de la table des droits sur le plugin 
    if (!TableExists("glpi_plugin_getofficekeys_profiles")) {
        $query = "CREATE TABLE `glpi_plugin_getofficekeys_profiles` (
               `id` int(11) NOT NULL default '0',
               `right` char(1) collate utf8_unicode_ci default NULL,
               PRIMARY KEY  (`id`)
             ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";

        $DB->query($query) or die("Erreur lors de la création de la table glpi_plugin_getofficekeys_profiles". $DB->error());
    }
    
    // requete de création de la table de la table des parametres
    if (!TableExists("glpi_plugin_getofficekeys_configs")) {
      $query = "CREATE TABLE `glpi_plugin_getofficekeys_configs` (
                  `id` int(11) NOT NULL auto_increment,
                  `solutionmandatory` tinyint(1) default '0',
                  `is_activated` tinyint(1) default '0',
                  `check_conflict` tinyint(1) default '0',
                  PRIMARY KEY (`id`)
                ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";

      $DB->query($query) or die("Erreur lors de la création de la table glpi_plugin_getofficekeys_configs". $DB->error());

      //$query = "INSERT INTO `glpi_plugin_getofficekeys_configs` (`id`, `solutionmandatory`) VALUES (NULL, '0')";
    }

    //creation du premier accès nécessaire lors de l'installation du plugin
  
    //PluginGetOfficeKeysProfile::createAdminAccess($_SESSION['glpiactiveprofile']['id']);
    $cron = new CronTask;

    // creation du cron - param = duree de conservation
    CronTask::Register('PluginGetOfficeKeysThread', 'CleanOldThreads', HOUR_TIMESTAMP,array('param' => 24));
    // To be called for each task the plugin manage
    // task in class
    //CronTask::Register('PluginGetOfficeKeys_Synchro', 'Sample', DAY_TIMESTAMP, array('param' => 50));
   
    echo "<center> Plugin <b>getofficekey</b> correctement install&eacute ".
         "<br><br> <a href='".GLPI_ROOT."/front/plugin.php' name='home_plugins'>    Revenir aux plugins </a> </center>";
         
    $migration->executeMigration();
    return true;
}

Ici, à quoi sert la fonction executeMigration() ? Désolé de toutes ces questions xD

function plugin_getofficekeys_uninstall() {
   global $DB;
    
    //tableau contenant les tables à supprimer
   $table = array ("glpi_plugin_getofficekeys_officepack",
                   "glpi_plugin_getofficekeys_profiles",
                   "glpi_plugin_getofficekeys_configs");
    // supprimer les tables de la version actuelle
   foreach ($table as $crow) {
      $query = "DROP TABLE IF EXISTS `$crow`;";
      $DB->query($query) or die("Erreur à la suppression de la table $crow");
   }
   
   $notif = new Notification();
   $options = array('itemtype' => 'Ticket',
                    'event'    => 'plugin_getofficekeys',
                    'FIELDS'   => 'id');
   foreach ($DB->request('glpi_notifications', $options) as $data) {
        $notif->delete($data);
   }
   
   $cron = new CronTask;
   if ($cron->getFromDBbyName('PluginGetOfficeKeysThread','CleanOldThreads')) {
      // creation du cron - param = duree de conservation
      CronTask::Unregister('getofficekeys');
   }

   echo "<center> Plugin <b>getofficekey</b> correctement d&eacutesinstall&eacute </center>";
   return true;
}

Dans ces fonctions, je souhaiterais déjà savoir si elles ont le bon nom pour fonctionner avec GLPI 0.83.
Et dans les quelques exemples que j'ai trouvés sur le net, ainsi que dans le petit tuto sur le Wiki, les fonctions d'installation/désinstallation sont placées dans hook.php, or si moi je ne les place pas dans setup.php, les liens "Installer" et "Desinstaller" ne s'affichent pas dans le tableau des plugins.

Je n'ai toujours pas trouvé réponse à mes questions du premier post ...
Merci à quiconque m'éclairerait sur un de ces points, j'avoue être confus.


http://www.fortisfio.com/
Blog d'échange de connaissances et d'informatique

Offline

#3 2013-09-04 09:29:17

DukeFarell
Member
Registered: 2013-08-13
Posts: 63

Re: aide developpement plugin

Bon j'ai trouvé pour deux choses :
- Le check_config ne passait pas (j'ai la version 0.83.91 mais il n'a pas l'air d'aimer ...) donc j'ai mis simplement return true; pour le moment, et quand j'installe le plugin, je suis maintenant redirigé sur la page et le bouton installé n'est plus disponible.

- le nom de la fonction init qui doit se trouver dans setup.php est finalement plugin_init_getofficekeys() ou getofficekeys est le nom de mon plugin.


http://www.fortisfio.com/
Blog d'échange de connaissances et d'informatique

Offline

#4 2013-09-04 13:48:51

yllen
GLPI-DEV
From: Sillery (51)
Registered: 2008-01-14
Posts: 15,273

Re: aide developpement plugin

C'est pour la 0.84, mais le principe est le même en 0.83, seules les fonctions peuvent changer
https://forge.indepnet.net/projects/plu … /Fr_Create


CentOS 6.5 - CentOS 7.x
PHP 5.6 - PHP 7.x - MySQL 5.6  - MariaDB 10.2 + APC + oOPcache
GLPI from 0.72 to dev version
Certifiée ITIL (ITV2F, ITILF, ITILOSA)

Offline

#5 2013-09-04 13:56:28

DukeFarell
Member
Registered: 2013-08-13
Posts: 63

Re: aide developpement plugin

Yep merci j'avais trouvé ce lien utile smile


http://www.fortisfio.com/
Blog d'échange de connaissances et d'informatique

Offline

#6 2013-09-05 08:58:09

DukeFarell
Member
Registered: 2013-08-13
Posts: 63

Re: aide developpement plugin

Bonjour,

Bon je suis bloqué pour deux choses, et si quelqu'un peux m'aider, je lui en serait reconnaissant big_smile

- Mon plugin est bien installable, désinstallable, activable et désactivable, mais il n'est pas "CSRF Compliant", or, j'aurais aimé savoir quels fichiers il vérifie afin de déterminer cela (j'ai qu'un formulaire en POST et finit par Html::close() donc ...

- Lorsque je l'active, je n'ai pas de menu_entry qui se rajoute dans l'onglet "Plugins", pourtant je pense l'avoir bien définit dans la fonction init du plugin :

// Add menu entry : GO !
   if (Session::haveRight("ocsng", "w"))
   {
        //config page
        $PLUGIN_HOOKS['config_page']['getofficekeys'] = 'front/config.form.php';
        
        $plugin = new Plugin;
        if ($plugin->isActivated("getofficekeys"))
        {
                   echo "<script> alert('is activated ok'); </script>";
          $PLUGIN_HOOKS['menu_entry']['getofficekeys'] = 'front/config.php';
        }
        
        /*if (Session::haveRight("logs", "r")) {
            $PLUGIN_HOOKS['menu_entry']['getofficekeys'] = 'front/config.php';
        }*/
    }

Pourtant j'ai inséré une alerte javascript dans la fonction, et elle s'affiche bien que quand le plugin est activé ! Ma page existe également ...

EDIT : J'ai trouvé ces deux documents : http://www.maje.biz/downloads/glpi-plugin.pdf  et http://code.google.com/p/qbplugin-rapid … ar_Pluging . Dommage qu'ils soient un peu outdated, car dans le premier lien je vois que $PLUGIN_HOOKS['menu_entry']['plugin_name'] est un BOOLÉEN, qui permet d'afficher ou non le lien de config dans l'onglet "Plugins". Malheureusement je n'ai toujours pas réussi à afficher ce lien, même en me calquant sur des plugins de ma version ... pétage de plombs

Last edited by DukeFarell (2013-09-05 11:53:09)


http://www.fortisfio.com/
Blog d'échange de connaissances et d'informatique

Offline

#7 2013-09-05 15:49:24

DukeFarell
Member
Registered: 2013-08-13
Posts: 63

Re: aide developpement plugin

Je parle presque tout seul, mais ca pourra servir à quelqu'un un jour ... peut-être ...

Malgré le fait que j'ai copié coller la base des fichiers hook et setup.php, j'ai remarqué avec des yeux ronds, que dans ma déclaration de variable globale

global $PLUGIN_HOOK

il manquait un "S"

global $PLUGIN_HOOKS

.

J'ai eu envie de pleurer, mais maintenant ça va mieux smile Je continue dans ma lancée.


http://www.fortisfio.com/
Blog d'échange de connaissances et d'informatique

Offline

#8 2013-09-06 15:17:24

orthagh
Administrator
From: TECLIB - CAEN
Registered: 2010-11-30
Posts: 662
Website

Re: aide developpement plugin

pour le "CRSF compliant".
Il faut effectivement que les formulaire soit tous bien fermés par Html::close()

et ajouter dans le setup.php et la fonction plugin_init... le hook suivant :
$PLUGIN_HOOKS['csrf_compliant']['nomsystemduplugin']= true;

c'est tout

Offline

#9 2013-09-11 09:05:19

DukeFarell
Member
Registered: 2013-08-13
Posts: 63

Re: aide developpement plugin

Du coup il me reste deux choses à faire avant qu'il soit fini. Je dois afficher un onglet supplémentaire pour l'élément ordinateur, et synchroniser le tout dans une tâche cron.

Pour l"onglet je rajoute 2 fonctions dans hook.php :

function plugin_getofficekeys_get_headings($type, $withtemplate)
{
    switch($type)
    {
        case COMPUTER_TYPE: return array( 1 => "Cl&eacute;s office"); break;
    }
    return false;
}

et

function plugin_getofficekeys_headings_actions($type)
{
    switch($type)
    {
        case COMPUTER_TYPE: return array( 1 => "plugin_getofficekeys_display"); break;
    }
    return false;
}

La première servant à ajouter un onglet aux ordinateurs, et la seconde définit les fonctions à appeler lors du choix de l'onglet. Ensuite, dans la fonction plugin_getofficekeys_init(), je place les deux HOOKS suivants :

$PLUGIN_HOOKS['headings']['getofficekeys']         = 'plugin_getofficekeys_get_headings';
   
   $PLUGIN_HOOKS['headings_action']['getofficekeys']  = 'plugin_getofficekeys_headings_actions';

Mais aucun nouvel onglet n’apparait, est-ce que je vérifie le bon type dans le switch() de mes fonctions ? (COMPUTER_TYPE?)

Pour le cron maintenant, je met ceci dans la fonction d'installation :

$cron = new CronTask;

if (!$cron->getFromDBbyName('PluginGetOfficeKeys','SynchronizeOCS'))
{
     CronTask::Register('PluginGetOfficeKeys', 'SynchronizeOCS', HOUR_TIMESTAMP,array('param' => 24));
} 

Je vois bien la tâche dans la liste des actions automatiques, mais quand je clique dessus je lis "Plugin désactivé" or mon plugin est activé ! Et j'ai lu quelque chose, qui est peut-être déprécié, qui dit de rajouter un HOOK "cron" comme ceci :

PLUGIN_HOOKS['cron']['getofficekeys'] = "cron_plugin_getofficekeys"; // nom de la fonction à éxécuter par le cron

Merci beaucoup d'avance pour vos remarques et vos conseils ! smile


http://www.fortisfio.com/
Blog d'échange de connaissances et d'informatique

Offline

#10 2013-09-11 09:33:23

DukeFarell
Member
Registered: 2013-08-13
Posts: 63

Re: aide developpement plugin

Pour afficher l'onglet si l'objet selectionné est un ordinateur, j'ai trouvé, j'utilise la fonction "get_Class()" :

function plugin_getofficekeys_get_headings($type, $withtemplate)
{
    switch(get_Class($type))
    {
        case 'Computer' : return array( 1 => "Cl&eacute;s office"); break;
    }
    return false;
}

http://www.fortisfio.com/
Blog d'échange de connaissances et d'informatique

Offline

#11 2013-09-11 15:16:24

DukeFarell
Member
Registered: 2013-08-13
Posts: 63

Re: aide developpement plugin

Bon mon plugin est bientôt terminé, il vaut ce qu'il vaut mais il a le mérite de fonctionner et d'être a peu près bien optimisé niveau opérations sur BDD. Je n'ai pas intégré l’utilisation des locales dedans, tout le texte est en dur en français.
De mon temps perso, si j'ai du temps libre (lol ?) je vais essayer de recoder proprement avec le langage et intégrer l'anglais.

Il ne me reste qu'une chose à faire (sans compter la résolution de bugs ultérieurs si j'en constate, et l'optimisation du code) : l'action automatique.

Je me demande pourquoi il me dit que mon plugin est désactivé lorsque je clique sur l'action automatique que j'ai créée ...

EDIT : trouvé ! Le nom du cron au moment du "register" doit être composé ainsi : PluginMonpluginAction. Ou "Monplugin" est le nom du plugin avec une majuscule, et "Action" est un mot quelconque avec une majuscule.

Je marquais PluginGetOfficeKeys et je n'avais aucune erreur, mais j'ai remarqué qu'il cherchait le plugin "Get". Je me suis dit que y'avais un soucis avec le nom du coup -_-

Manque plus qu'a trouver comment nommer et ou placer la fonction qu'il va exécuter périodiquement smile

Last edited by DukeFarell (2013-09-11 15:53:51)


http://www.fortisfio.com/
Blog d'échange de connaissances et d'informatique

Offline

#12 2013-11-05 17:45:02

xavier.debonte
Member
Registered: 2013-11-05
Posts: 1

Re: aide developpement plugin

Bonjour,
Avez-vous avancer sur ce plug-in qui m'a l'air intéressant?
Ça me plairait pas mal de pouvoir l'intégrer à notre couple GLPI/OCS...
Je récupère déjà les licences Office dans OCS sans pb et je voudrai pouvoir les gérer dans GLPI directement.
D'avance merci.

Offline

#13 2013-12-06 10:14:01

DukeFarell
Member
Registered: 2013-08-13
Posts: 63

Re: aide developpement plugin

Bonjour,

Oui désolé je ne vais pas souvent sur ce forum, effectivement j'ai terminé mon plugin mais il comporte quelques bugs et il n'est pas optimisé. En revanche il fait son boulot smile

Je l'utilise maintenant avec la version 0.83 donc je ne sais pas si il est compatible avec une autre ... je peux vous donner un lien de téléchargement ce soir si vous voulez. La seule chose que je demande est que le crédit de mon plugin soit conservé, mais vous pouvez le modifier à votre guise (licence GPLv2 si je ne m'abuse)

++


http://www.fortisfio.com/
Blog d'échange de connaissances et d'informatique

Offline

#14 2013-12-14 17:46:41

serv.deb3477
Member
Registered: 2011-01-27
Posts: 32

Re: aide developpement plugin

Bonjour,
Votre plugin est très intéressant.
Comment fonctionne t-il? y a t-il un lien avec OCS ou est-il indépendant?
Ce plugin ne pourrait-il pas être disponible dans le catalogue des plugins afin d'en faire profiter le plus grand nombre?
Pensez-vous le faire évoluer pour de futures versions de GLPI?
Cordialement.


Prod CentOS 6.7 64 - Apache 2.2.15 - PHP 5.4.45 - MySQL 5.1.73 - GLPI 0.85.5
Préprod CentOS 6.7 64 - Apache 2.2.15 - PHP 5.4.45 - MySQL 5.1.73 - GLPI 0.90.2

Offline

#15 2014-01-02 12:08:07

DukeFarell
Member
Registered: 2013-08-13
Posts: 63

Re: aide developpement plugin

Bonjour,

Je peux effectivement mettre en ligne sur le catalogue mon plugin, mais la seule chose qui me retient est probablement le fait que ce plugin est mal fini. Il n'est pas très bien optimisé et parfois il se désactive pour une raison que je ne connait pas. Du coup en un clic c'est réglé on le réactive et on ne perd aucune donnée. mais c'est un petit bug quand même.

Et le fait que je ne sois pas développeur php et que j'ai actuellement d'autres tâches qui vont m'occuper pour un moment m'empêche de certifier que je le tiendrais à jour.

Au niveau du fonctionnement, il récupère les informations stockées dans une table de la base d'OCS et les place dans 2 tables que je créé avec le plugin pour GLPI. Puis j'ajoute un onglet dans la section ordinateur, qui s'appelle Clés Office. On va sur l'onglet et on peut voir les clés offices utilisées par poste et voir si elles sont utilisées plusieurs fois, si oui le nombre de fois correspondant. Ceci implique d'avoir le plugin dans OCS qui récupère les clés Office. (c'est un plugin léger qui fonctionne avec un petit script VB)


http://www.fortisfio.com/
Blog d'échange de connaissances et d'informatique

Offline

Board footer

Powered by FluxBB