Blog

Déploiement d’imprimantes sur un domaine Windows

Dernière mise à jour le

Introduction

Dans une entreprise, il est courant de retrouver des imprimantes avec des interfaces réseau, ou du moins, connectées à des serveurs d’impression. Dès lors, il peut être interessant de prévoir l’installation des imprimantes et de leurs drivers sur tout ou partie des ordinateurs de l’entreprise.

Selon le nombre d’ordinateurs du domaine, cette tâche devient rapidement un enfer à exécuter manuellement, alors que Microsoft Windows Server, depuis la version 2003 R2, permet d’effectuer tout cela automatiquement et simplement.

Pour ma part, je trouve que l’utilisation de la console enfichable « Print Management » est tout à fait adapté à cette tâche, et est d’une installation et d’une configuration aisées.

Dans cet exemple, nous considèrerons que la console est installée directement sur le serveur d’impression. Dans un domaine en production, il est recommandé d’installer la console sur un client, afin de ne pas consommer des ressources du serveur.

La console « Print Management »

Pour installer la console sur votre serveur Microsoft Windows Server 2003 R2 ou suivants deux étapes sont nécessaires :
- Configurer le serveur en tant que serveur d’impression. C’est un rôle qui s’ajoute depuis le menu « Gérer votre serveur ». Celui-ci ne demande aucun paramètre de configuration.
- Installer les composants Windows nécessaires à la gestion de l’impression, depuis « Ajout/suppression de programmes », et cocher la ligne « Print Management Component ». Pour les clients, il est également possible de télécharger la console sur le site de Microsoft : télécharger.

La console peut être ouverte depuis les outils d’administration, ou grâce à une console MMC.

Dans l’arborescence de gauche, ajoutez vos serveurs d’impression (clic droit, ajouter) pour centraliser la gestion de ceux-ci. Dès à présent, vous verrez les imprimantes de votre réseau dans les listes d’imprimantes.

Afin de simplifier la recherche des imprimantes, je vous conseille de les lister dans l’Active Directory de votre domaine. Cependant, cette étape n’est pas obligatoire.

Déploiement des imprimantes par GPO

Il est maintenant temps de déployer les imprimantes, via des GPO, aux ordinateurs ou utilisateurs de votre réseau. Pour cela, il est d’abord nécessaire de créer une GPO grâce à la console GPMC, puis de la modifier :
- pour une GPO « ordinateur », dans les scripts de démarrage
- pour une GPO « utilisateur », dans les scripts de connexion

Il est nécessaire d’ajouter l’executable PushPrinterConnexions.exe dans les fichiers utilisés par cette GPO. Celui-ci se trouve généralement dans C:\Windows\PMCSnap. L’option -log peut être ajouter pour générer les fichiers journaux utiles en cas d’erreur de la GPO. La GPO doit être liée à une (ou plusieurs) OU de votre domaine.

Retourner sur la console « Print Management » pour choisir la ou les imprimantes à déployer grâce à votre GPO. Grâce à la fonction « Déployer avec les stratégies de groupes », vous pouvez rechercher la GPO que vous venez de créer, qui se chargera du déploiement.

Vos imprimantes sont maintenant prêtes à être déployées au prochain démarrage des ordinateurs ou à la connexion des utilisateurs de l’OU que vous aurez choisie. Vous pouvez les trouver dans l’arborescence « Imprimantes déployées ».

En cas d’erreur, vous pouvez consulter les fichiers journaux créés sur les ordinateurs :
- pour une GPO « ordinateur », dans %Windir%\Temp\ppcMachine.log
- pour une GPO « utilisateur », dans C:\Documents and Setting\%Username%\Local Settings\Temp\ppcUser.log

Le package DBMS_UTILITY

Dernière mise à jour le

Introduction

Le package DBMS_UTILITY fournit des fonctions et procédures plus ou moins complexes qui peuvent parfois aider lors de l’élaboration d’applications.
Nous allons traiter dans cet article quelques-unes des routines qu’il fournit.

Ce package existe depuis la version 7.3.4 d’Oracle Database et a subit de multiples modifications. On peut retrouver les entêtes de ce package dans le fichier suivant :

$ORACLE_HOME/rdbms/admin/dbmsutil.sql

Pour certains exemples, nous travaillerons avec le schéma HR, fournit par Oracle. D’autres nécessitant des privilèges plus importants, nous travaillerons avec SYS.

Dépendances

Exécutez le code suivant entant que SYS pour afficher la liste des objets dépendants du package DBMS_UTILITY et les objets qui y sont référencés.

SELECT name, type, ’Dépendant’ direction
FROM dba_dependencies
WHERE referenced_name = ’DBMS_UTILITY’
UNION
SELECT referenced_name, referenced_type, ’Référencé’
FROM dba_dependencies
WHERE name = ’DBMS_UTILITY’ ;

On peut y retrouver, entre autres, les packages DBMS_ALERT, DBMS_DATAPUMP, DBMS_DDL, DBMS_DESCRIBE, DBMS_STATS, OWA_UTIL qui sont dépendants de DBMS_UTILITY.

Procédure COMPILE_SCHEMA

Cette procédure permet de recompiler toutes les procédures, fonctions, packages et triggers d’un schéma spécifié.

dbms_utility.compile_schema(
schema         IN VARCHAR2,
compile_all    IN BOOLEAN DEFAULT TRUE) ;

schema est le nom du schéma sur lequel on souhaite travailler
compile_all spécifie que tous les objets valides ou non doivent être recompilés (TRUE) ou non (FALSE)

Exemple :

EXECUTE DBMS_UTILITY.COMPILE_SCHEMA(’HR’)

Après avoir exécuté cette procédure vous pouvez faire un SELECT sur la vue ALL_OBJECTS en recherchant les objets invalides.

SELECT object_name, object_type
FROM all_objects
WHERE status = ’invalid’ ;
Pour les objets restants invalides, vous pouvez utiliser la commande suivante :
SHOW ERRORS  
Vous pourrez ainsi corriger les erreurs associées à vos objets.

Attention, cette procédure est exécutée avec une limite sur le nombre d’objets pouvant être traités. Dans ce cas, une exception est levée (ORA-20002 : Maximum iterations exceeded. Some objects may not have been recompiled). Dans ce cas, vous n’avez qu’à relancer la procédure une nouvelle fois.

Fonction CURRENT_INSTANCE

Retourne le numéro de l’instance à laquelle nous sommes connectés. Retourne NULL quand l’instance est tombée.

dbms_utility.current_instance RETURN NUMBER

Exemple :

SELECT dbms_utility.current_instance
FROM dual ;

Pour retrouver plus d’informations sur cette instance :

SELECT *
FROM v$instance
WHERE instance_number = dbms_utility.current_instance ;

Procédure DB_VERSION

Retourne des informations sur la version de la base de données.

dbms_utility.db_version (
version       OUT VARCHAR2,
compatibility OUT VARCHAR2) ;

Exemple :

DECLARE
 ver    VARCHAR2(100) ;
 compat VARCHAR2(100) ;
BEGIN
  dbms_utility.db_version(ver, compat) ;
  dbms_output.put_line(’Version : ’ || ver ||’ Compatible : ’ || compat) ;
END ;

Le paramètre de compatibilité est déterminé dans le fichier init.ora (« compatible »). S’il ne l’est pas, cette procédure retourne NULL en deuxième argument.

Procédure EXEC_DDL_STATEMENT

Exécute l’ordre DDL envoyé en argument.

dbms_utility.exec_ddl_statement(parse_string IN VARCHAR2) ;

Fonction GET_CPU_TIME

Cette fonction retourne le temps CPU actuel en centième de secondes.

dbms_utility.get_cpu_time RETURN NUMBER ;

Exemple :

DECLARE 
 t1 NUMBER ;
 t2 NUMBER ;
 i  NUMBER ;
BEGIN
  t1 := dbms_utility.get_cpu_time ;
  SELECT COUNT(*) INTO i
  FROM all_tables t, all_indexes i
  WHERE t.tablespace_name = i.tablespace_name ;
  t2 := dbms_utility.get_cpu_time ;
  dbms_output.put_line(t2-t1) ;
END ;

Procédure GET_DEPENDENCY

Cette procédure retourne toutes les dépendances sur l’objet passé en paramètre. On précisera le type de l’objet, le schéma et son nom.

dbms_utility.get_dependency(
type   IN VARCHAR2,
schema IN VARCHAR2,
name   IN VARCHAR2) ;

Exemple :

EXEC dbms_utility.get_dependency(’TABLE’, ’ORACLE’, ’EMPLOYEES’)

Fonction GET_TIME

Retourne le nombre de centièmes de secondes écoulés depuis un instant, choisi arbitrairement.

dbms_utility.get_time RETURN NUMBER ;

Exemple :

DECLARE 
 t1 NUMBER ;
 t2 NUMBER ; 
BEGIN
  t1 := dbms_utility.get_time ;
  dbms_lock.sleep(2.4) ;
  t2 := dbms_utility.get_time ;
  dbms_output.put_line(t2-t1) ;
END ;

Fonction IS_CLUSTER_DATABASE

Retourne TRUE si la base de données fonctionne en mode cluster. Retourne FALSE sinon.

dbms_utility.is_cluster_database RETURN BOOLEAN ;

Exemple :

BEGIN
  IF dbms_utility.is_cluster_database THEN
    dbms_output.put_line(’You’’re running in cluster database mode.’) ;
  ELSE
    dbms_output.put_line(’You’’re not running in cluster database mode.’) ;
  END IF ;
END ;

Procédure NAME_RESOLVE

Résolution d’un nom d’objet, avec transposition des synonymes si nécessaire et contrôle des autorisations.

dbms_utility.name_resolve (
name          IN  VARCHAR2, 
context       IN  NUMBER,
schema        OUT VARCHAR2, 
part1         OUT VARCHAR2, 
part2         OUT VARCHAR2,
dblink        OUT VARCHAR2, 
part1_type    OUT NUMBER, 
object_number OUT NUMBER) ;

Le contexte est un entier entre 0 et 9 :
- 0 = table
- 1 = fonction, procédure, package
- 2 = séquence
- 3 = trigger
- 4 = java store
- 5 = java resource
- 6 = java class
- 7 = type
- 8 = java shared data
- 9 = index

Si aucun schéma n’est spécifié dans le nom de l’objet, alors il sera déterminé par la procédure.
L’argument part1 contient la première partie du nom de l’objet. On pourra récupérer le type avec part1_type :
- 5 = synonyme
- 7 = procédure
- 8 = fonction
- 9 = package
L’argument object_number est l’identifiant unique de l’objet sur la base de données.

Exemple :

DECLARE
 s  VARCHAR2(30) ;
 p1 VARCHAR2(30) ;
 p2 VARCHAR2(30) ;
 d  VARCHAR2(30) ;
 o  NUMBER(10) ;
 ob NUMBER(10) ; 
BEGIN
  dbms_utility.name_resolve(’GET_EMPLOYEE’, 1, s, p1, p2, d, o, ob) ;
  dbms_output.put_line(’Owner :  ’ || s) ;
  dbms_output.put_line(’Table :  ’ || p1) ;
  dbms_output.put_line(’Column : ’ || p2) ;
  dbms_output.put_line(’Link :   ’ || d) ;
  dbms_output.put_line(’Type :   ’ || o) ;
  dbms_output.put_line(’ID :   ’ || ob) ;
END ;

Procédure VALIDATE

Cette procédure permet de changer le statut des objets de « invalid » à « valid ».

dbms_utility.validate(
object_id      IN NUMBER) ;

object_id est l’identifiant unique de l’objet sur la base de données.

SELECT object_id, object_name
FROM user_objects
WHERE status = ’INVALID’ ;

Cette procédure valide un objet de la base de données en utilisant le même mécanisme que celui utilisé par la re-validation automatique. Aucun exception n’est retournée si l’objet n’existe pas, est déjà valide ou ne peut être validé. Les exceptions devront donc être levées manuellement.

Conclusion

Ce package appartenant au schéma de SYS a un synonyme public nous permettant de l’utiliser directement avec son nom plutôt qu’avec SYS.DBMS_UTILITY. Des droits ont également été donnés à public pour exécuter ce package. Cependant, certaines routines à l’intérieur nécessiteront des privilèges de DBA.

Ce package contient encore d’autres procédures et fonctions, souvent plus complexes, mais qu’il peut-être intéressant de découvrir.

Exceptions prédéfinies

Dernière mise à jour le

Avant de faire un article complet sur les exceptions en PL/SQL, je publie la liste des exceptions prédéfinies Oracle dont mes étudiants pourraient avoir besoin.

Parmi des milliers d’exceptions, il parait logique que seules les plus courantes soient nommées. Il reste possible d’en nommer d’autres si le besoin s’en fait ressentir.

Ces exceptions sont déclarées dans le package STANDARD qui permet, entre autre, de préparer un environnement PL/SQL. Le contenu de ce package est directement utilisable sans le référencer. C’est à dire que vous n’avez pas besoin de préfixer le nom de l’exception par le nom du package.

Exception prédéfinieErreur OracleSQLCODE
ACCESS_INTO_NULL ORA-06530 -6530
CASE_NOT_FOUND ORA-06592 -6592
COLLECTION_IS_NULL ORA-06531 -6531
CURSOR_ALREADY_OPEN ORA-06511 -6511
DUP_VAL_ON_INDEX ORA-00001 -1
INVALID_CURSOR ORA-01001 -1001
INVALID_NUMBER ORA-01722 -1722
LOGIN_DENIED ORA-01017 -1017
NO_DATA_FOUND ORA-01403 +100
NOT_LOGGED_ON ORA-01012 -1012
PROGRAM_ERROR ORA-06501 -6501
ROWTYPE_MISMATCH ORA-06504 -6504
SELF_IS_NULL ORA-30625 -30625
STORAGE_ERROR ORA-06500 -6500
SUBSCRIPT_BEYOND_COUNT ORA-06533 -6533
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 -6532
SYS_INVALID_ROWID ORA-01410 -1410
TIMEOUT_ON_RESOURCE ORA-00051 -51
TOO_MANY_ROWS ORA-01422 -1422
VALUE_ERROR ORA-06502 -6502
ZERO_DIVIDE ORA-01476 -1476

Changer l’éditeur par défaut de SQL*Plus

Dernière mise à jour le

Lors de l’utilisation de SQL*Plus ou de Oracle Client, nous avons souvent recours à la commande suivante :

EDIT

Cette commande, parfois ramenée aux simples deux lettres « ED » permet d’ouvrir notre buffer SQL (afiedt.buf) dans un éditeur de texte. Pour les utilisateurs de Windows, c’est le réputé mais peu pratique Bloc Notes qui s’ouvrira par défaut. Il est cependant possible de changer cet éditeur par défaut afin d’avoir, par exemple, la coloration syntaxique ou la numérotation des lignes qu’offre Notepad++.

Il est d’abord possible de changer cet éditeur pour la session en cours, directement via la commande suivante :

DEFINE _editor=’C :\Program Files\Notepad++\notepad++.exe’

Pour les utilisateurs de la version fenêtrée, cette commande revient au même que de cliquer sur Edit > Editor > Define Editor... et de rentrer l’adresse complète de l’éditeur de son choix.

Cependant, ces deux solutions doivent être réalisées à chaque changement de session. Il est donc possible de la lancer automatiquement lors du démarrage de SQL*Plus ou de l’ouverture de session. Pour cela, il faut modifier le fichier glogin.sql, le « Default Site Profile Script ». Le script est dans $ORACLE_HOME/sqlplus/admin/glogin.sql pour UNIX, et %ORACLE_HOME%\sqlplus\admin\glogin.sql dans Windows.

Il suffit ensuite de rajouter la commande suivante dans le corps du script :

— Define the default editor we want  
DEFINE _editor=’C :\Program Files\Notepad++\notepad++.exe’