Services Windows et Domaines d application



Documents pareils
TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Le MSMQ. Version 1.0. Pierre-Franck Chauvet

Déploiement et monitoring

Guide de démarrage IKEY 2032 / Vigifoncia

SQL Server Installation Center et SQL Server Management Studio

WinTask x64 Le Planificateur de tâches sous Windows 7 64 bits, Windows 8/ bits, Windows 2008 R2 et Windows bits

Présentation du logiciel Cobian Backup

Tutorial Terminal Server sous

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

Déployer une application cliente avec le Framework.NET 3.5 Client Profile

Guide d'installation. Release Management pour Visual Studio 2013

Préconisations Techniques & Installation de Gestimum ERP

Manuel d'installation de GESLAB Client Lourd

Messages d'erreurs. Redémarrez votre PC en cliquant sur Démarrer, en sélectionnant ensuite Arrêter puis en cochant Redémarrer

Microsoft Application Center Test

Guide d'installation sous Windows

LOGICIEL KIPICAM : Manuel d installation et d utilisation

Procédure d installation Smart Map 3

COUR D APPEL DE LYON PROCEDURE INFORMATIQUE IMPRIMANTES. Imprimantes SAR de Lyon / Novembre 2007 Page 1 sur 14

Sommaire. Promo 39 B WINDOWS 2003 SERVER PART 1

1 - EXCHANGE Installation

Certificats Electroniques sur Clé USB

TD/TP 1 Introduction au SDK d Android

STATISTICA Version 12 : Instructions d'installation

Guide de l utilisateur. Synchronisation de l Active Directory

MEGA Web Front-End Installation Guide MEGA HOPEX V1R1 FR. Révisé le : 5 novembre 2013 Créé le : 31 octobre Auteur : Noé LAVALLEE

Symantec Backup Exec 12.5 for Windows Servers. Guide d'installation rapide

Windows Internet Name Service (WINS)

Préparation à l installation d Active Directory

Service Informatique et Télématique (SITEL), Emile-Argand 11, 2009 Neuchâtel, Tél ,

KAJOUT WASSIM INTERNET INFORMATION SERVICES (IIS) 01/03/2013. Compte-rendu sur ISS KAJOUT Wassim

MISE A JOUR : 04 FEVRIER 2011 PROCÉDURE D INSTALLATION. Cegid Business COMMENT INSTALLER CEGID BUSINESS V9 SOUS WINDOWS XP, VISTA ET 7

Installation d'un Active Directory et DNS sous Windows Server 2008

contact@nqicorp.com - Web :

Installation et configuration de base de l active Directory

AD FS avec Office 365 Guide d'installation e tape par e tape

Certificats Electroniques sur Clé USB

Fiche Technique. MAJ le30/03/2011

Comment autoriser un programme à communiquer avec Internet sous Vista?

INSTALLATION DES SERVICES DE DOMAINE ACTIVE DIRECTORY Windows Server 2008 R2

Qlik Sense Desktop. Qlik Sense Copyright QlikTech International AB. Tous droits réservés.

< Atelier 1 /> Démarrer une application web

Microsoft OSQL OSQL ou l'outil de base pour gérer SQL Server

CARPE. Documentation Informatique S E T R A. Version Août CARPE (Documentation Informatique) 1

Gestion des licences et activation des logiciels : déploiement d'un logiciel à l'aide de Symantec Ghost

Procédure d installation

UserLock Guide de Démarrage rapide. Version 8.5

Cours 420-KEG-LG, Gestion de réseaux et support technique. Atelier No2 :

SQL Data Export for PS/PSS

Configurer un réseau domestique. Partager ses fichiers, ses dossiers et ses imprimantes sur tous ses PC.

PROCÉDURE D AIDE AU PARAMÉTRAGE

Guide d utilisation WEBPORTAL CPEM Portail d Applications Web CPEM

La double authentification dans SharePoint 2007

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Guide d'installation du connecteur Outlook 4

CA Desktop Migration Manager

Guide d'utilisation du Serveur USB

Installation FollowMe Q server

COMMENT INSTALLER LE SERVEUR QIPAIE

Tester ses applications

Procédure d'installation complète de Click&Decide sur un serveur

Créer et partager des fichiers

NAS 206 Utiliser le NAS avec Windows Active Directory

SOMMAIRE. Chapitre 1 - principe 3 Téléphonique 4 PC/Configuration logicielle 4 PC/Configuration matérielle: 4 Pabx 4

Gestion d Active Directory à distance : MMC & Délégation

Sharpdesk V3.3. Guide d installation Push pour les administrateurs système Version

À propos du Guide de l'utilisateur final de VMware Workspace Portal

DOCUMENT D ACCOMPAGNEMENT POUR L INSTALLATION DU LOGICIEL ESTIMACTION

TAGREROUT Seyf Allah TMRIM

VERITAS Backup Exec TM 10.0 for Windows Servers

Installation de TeamLab sur un serveur local Ce guide est destiné aux utilisateurs ayant des connaissances de base en administration Windows

Pré-requis pour les serveurs Windows 2003, Windows 2008 R2 et Windows 2012

9 - Installation RDS sur 2008R2 SOMMAIRE. Chapitre 1 Mise en place RDS sous Windows 2008 R2 2

Objet du document. Version document : 1.00

Sommaire. 2. L accès aux modules. 1. Aspects techniques. 1.1 Le matériel requis 2

Sauvegarde et restauration d'un système d'exploitation Clonezilla

Certificats Electroniques sur Clé USB

Stellar Phoenix Outlook PST Repair - Technical 5.0 Guide d'installation

INSTALLATION ET PRISE EN MAIN

IBM SPSS Statistics Version 22. Instructions d'installation sous Windows (licence nominative)

Assistance à distance sous Windows

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Guide Expert Comptable Production Coala

GUIDE DE DÉMARRAGE RAPIDE

Guide d'installation

avast! EP: Installer avast! Small Office Administration

ContactForm et ContactFormLight - Gestionnaires de formulaire pour Prestashop Edité par ARETMIC S.A.

Guide d installation des licences Solid Edge-NB RB

Windows 8 Installation et configuration

Guide de déploiement

Sage 50 Version 2014 Guide d installation. Sage Suisse SA

Manuel utilisateur (Manuel_utilisateur_version pdf) Manuel Reprise des données (Manuel_Reprise_donnees_version

Module SMS pour Microsoft Outlook MD et Outlook MD Express. Guide d'aide. Guide d'aide du module SMS de Rogers Page 1 sur 40 Tous droits réservés

Formateur : Jackie DAÖN

Qu'est-ce que c'est Windows NT?

Utiliser Net Support School (NSS Version ) Philippe Cailleretz Er-Tice Avion mars 2011.

Un peu de vocabulaire

Rafraichissement conditionné d'une page en.net

Transcription:

1 Sommaire... 1 1 Introduction... 2 2 Les services Windows... 3 2.1 Création et mise en place d un service pas à pas... 4 2.1.1 Créer un service... 4 2.1.2 Gérer son service Windows... 12 2.2 Exemple pratique... 15 3 Les domaines d application... 20 3.1 Notions de bases... 20 3.2 Les règles de sécurité d un domaine... 27 4 Conclusion... 30

2 1 Introduction Jusqu ici nous exécutions des applications indépendamment les unes des autres, sans vraiment les faires interagir. Dans ce chapitre nous allons voir deux manières de rendre vos applications plus riches. Tout d abord nous allons parler des services Windows, qui vont nous permettre de lancer des applications en tâche de fond afin de créer par exemple des applications de monitoring, ou des application serveur discutant avec une application client. Dans un deuxième temps, nous verrons le principe des domaines d application qui permettent d exécuter des assemblies à partir d une application, et ce dans un contexte totalement configurable. Ce procédé permet donc d'exécuter des applications dans de bonnes conditions de sécurité.

3 2 Les services Windows Les services Windows s exécutent en tâche de fond dès qu ils sont lancés et ce jusqu à que l on quitte le système d exploitation. Ils peuvent être soit démarrés automatiquement au lancement du système d exploitation, soit démarrés manuellement. On peut également désactiver les services, qui ne se lanceront pas lors de la session courante, même si l utilisateur en fait la demande manuellement. Il faudra d abord reconfigurer leur type de démarrage (manuel ou automatique) et redémarrer la machine pour que les changements soient opérationnels. De part ces particularités, les services Windows conviennent très bien à des applications nécessitant de s exécuter en continu sans intervention d un quelconque utilisateur, et ce quelque soit l utilisateur. En effet les services démarrés automatiquement se lancent avant même qu un utilisateur se connecte. Quand vous installez Microsoft Windows, celui-ci installe par défaut de nombreux services afin de gérer les rouages du système, et également quelques services supplémentaires comme par exemple les services réseaux permettant le partage de fichier. Il est évident que par son fonctionnement différent, développer un service et le déployer ne se fera pas de la même manière que d habitude. Tout d abord, il faut savoir qu un service doit obligatoirement être installé pour être lancé, il en résulte qu il est impossible de débuguer un service de la même façon qu'un programme courant. Il est toutefois possible de débuguer un service, je vous renvoie pour plus d information vers un guide proposé par MSDN. Pour déployer un service, vous allez devoir implémenter un installateur spécifique aux services. Les services tournent dans une session différente de celles de l utilisateur, et ce notamment pour des questions de sécurité. Aucun lien entre la session de l utilisateur logué et celle des services ne peut être faite, il n y a aucun moyen d afficher une fenêtre ou d afficher un message d erreur. Le service va écrire tous ses messages d erreurs dans les logs du système d exploitation. Les services pouvant être lancés avant même qu un utilisateur se connecte à sa session, il faut faire particulièrement attention à la sécurité du système. Votre service peut avoir des permissions beaucoup plus élevée qu un utilisateur lambda, et créer de nombreux soucis. Vous devez régler les permissions de chaque service et faire attention à qui peut lancer le service lorsqu il est sensible.

4 2.1 Création et mise en place d un service pas à pas Nous allons maintenant entrer dans le vif du sujet, et suivre pas à pas le processus de création, d implémentation et de déploiement d un service. Nous n allons pas produire beaucoup de code dans cette partie, elle reste très théorique. Note : Les opérations étant similaires en VB.NET, elles ne seront pas détaillées pour ce langage ; sauf si elles sont différentes. 2.1.1 Créer un service Pour créer un service, il faut créer un nouveau projet de type Service Windows, donnez lui un nom puis validez. Visual Studio va alors créer un projet Service Windows contenant deux classes : En C#, la classe principale Program.cs contient la fonction Main et permet d initialiser toutes les classes de service du projet grâce à la méthode Run. //C# static void Main() ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] new Service1() ; ServiceBase.Run(ServicesToRun);

5 Une classe Service1.cs qui représente un composant Service Windows. Ce composant propose des outils permettant de faciliter l implémentation du service. Votre composant Service Windows est basé sur la classe ServiceBase, vous pouvez donc surcharger les méthodes de cette classe. Vous pouvez dors et déjà renommer votre Service grâce aux propriétés, pour cela ouvrez le «Designer» du composant en double cliquant sur Service1.cs, puis faîtes F4 pour donner le focus à la fenêtre des propriétés. Vous allez pouvoir ainsi configurer plus finement votre Service. Nous allons simplement changer le nom de notre service : Vous pouvez en plus de cela configurer les propriétés suivantes dans l explorateur de propriétés : Propriétés Description CanStop A True indique que le service peut être stoppé, à False il est impossible d arrêter le service CanShutdown A True, le service reçoit une notification lors de l arrêt du système. CanPauseAndContinue A True, le service acceptera les demandes de redémarrage ou de suspension. CanHandlePowerEvent A True le service reçoit les notifications du système indiquant les changements d état de l alimentation (Mise en veille par exemple). AutoLog A True permet d enregistrer dans le journal des évènements Windows les actions du service. En mettant à True ces propriétés, vous pouvez utiliser certaines méthodes de ServiceBase dans votre service, vous devrez les surcharger pour les implémenter. Par exemple, nous allons mettre à True CanShutdown. Cela va nous permettre d utiliser la méthode OnShutdown qui se lancera à chaque notification d arrêt du système.

6 'VB Public Class MonService Public Sub New() InitializeComponent() End Sub Protected Overrides Sub OnStart(ByVal args() As String) End Sub Protected Overrides Sub OnStop() End Sub Protected Overrides Sub OnShutdown() 'Divers traitements... MyBase.OnShutdown() End Sub End Class //C# public partial class MonService : ServiceBase public MonService() InitializeComponent(); protected override void OnStart(string[] args) protected override void OnStop() protected override void OnShutdown() //Divers traitements... base.onshutdown(); Par défaut, le composant ne contient que les méthodes OnStart et OnStop qui permettent d effectuer des traitements au démarrage et à l extinction du service. Une fois votre Service configuré comme vous le souhaitez, vous allez devoir lier un installateur au composant. Pour cela ouvrez le designer du composant Service1 et faites clic droit dans l arrière plan du designer puis Ajouter le programme d installation.

7 Vous pouvez également cliquer sur le lien en bas de la fenêtre des propriétés : Un nouveau composant est alors ajouté à votre projet, il se nomme par défaut ProjectInstaller.cs (ou.vb en VB.NET). Cette classe centralise tous les composants de Service Windows à installer. Ainsi, si vous rajoutez un nouveau service, que vous lui ajoutez un programme d installation, un nouveau composant est ajouté à ProjectInstaller.cs plutôt que de créer un nouveau composant d installation. Il n est généralement pas nécessaire de modifier ProjectInstaller, mais sachez que vous pouvez le configurer. Nous vous conseillons de suivre ce lien pour en savoir plus. Veillez toutefois à modifier la propriété Account du composant serviceprocessinstaller1, changez sa valeur de User à LocalService, sinon au moment de l installation, une fenêtre d authentification vous demandera le nom d utilisateur et le mot de passe de la session sur laquelle installer le service. Attention : Il faut à tout prix que le nom de votre Service (que l on a modifié tout à l heure) soit identique à la propriété ServiceName du composant d installation. Si vous changez le nom de votre service vérifiez que la propriété ServiceName a également changé.

8 Note : Vous pouvez modifier le StartType par défaut de votre projet dans l installeur. Ici nous choisissons Manual. Ensuite vous pouvez maintenant générer votre service. N utilisez pas le raccourci F5, mais la barre d outils : Générer -> Générer «Nom de votre projet» (raccourci Maj + F6) Maintenant que nous avons configuré et créé notre Service mais aussi lié un programme d installation, nous pouvons installer notre service. Cette opération peut se faire de deux manières différentes : Installer le service manuellement Pour installer le service manuellement vous devez ouvrir l invite de commande de Visual Studio et utiliser la commande : Installutil MonService.exe Le service est maintenant installé sur votre système d exploitation, nous le vérifierons plus loin dans cette partie. Pour désinstaller le service, la commande est la suivante : installutil /u MonService.exe Note : Vous devez être sur un compte administrateur pour effectuer ces actions. Installer le service avec un projet d installation Vous pouvez plutôt que d utiliser l invite de commande de Visual Studio créer un projet d installation. Cela permet d installer votre service sur une machine ne possédant pas Visual Studio. Ajoutez donc un nouveau projet à votre solution de type «Projet d installation» :

9 Ensuite vous devez lier la sortie de votre projet de service vers le projet d installation. Bien plus facile que cela en a l air, il vous suffit de faire un clic droit sur votre projet d installation dans l explorateur de solution, puis Ajouter -> Sortie de projet. Choisissez le projet de votre Service, l option Sortie principale et validez. Enfin nous devons ajouter une action au projet d installation qui va nous permettre d installer notre service. Premièrement faites un clic droit sur votre projet d installation, affichage et enfin actions personnalisées :

10 S ouvre alors un éditeur d actions. Faites un clic droit sur Actions personnalisées puis sur Ajouter une action personnalisée : Dans la fenêtre nouvellement ouverte, vous allez devoir choisir l exécutable à installer, pour cela nous allons indiquer que nous souhaitons utiliser la sortie du projet de notre service comme exécutable à installer. Sélectionnez Dossier d application dans la liste déroulante «Regarder dans :» puis Sortie principale de votre service. Validez avec ok. L action est ajoutée aux quatre actions à savoir Installer, Valider, Restaurer et Désinstaller. Il ne vous reste plus qu à générer le projet d installation. Celui-ci va créer un fichier Setup.exe (par défaut) vous permettant d installer votre service. Note : Vous devez être sur un compte administrateur pour effectuer ces actions.

11 Pour le désinstaller, relancez Setup.exe et utiliser l option Supprimer. Vous pouvez aussi utiliser le gestionnaire d ajout et de suppression de programmes de Windows. Astuce : S il vous est impossible de supprimer le service, vous pouvez utiliser cette commande dans l'exécuteur de commandes (Touches Windows + R): sc delete MonService

12 2.1.2 Gérer son service Windows Maintenant que nous avons installé notre service, nous aimerions voir comment le gérer, pour cela, nous allons utiliser le gestionnaire de service fournit avec Windows. Plusieurs moyens de la lancer. Note : Vous devez être sur un compte d administrateur pour effectuer ces actions. Utilisez la zone de recherche de Vista et écrivez services.msc puis validez : Ou bien lancez la fenêtre d exécution (Raccourci : Touche Windows + R) et tapez services.msc : Enfin, faites un clic droit sur Poste de Travail (XP) / Ordinateur (Vista), puis Gérer. Déroulez «Services et Applications» puis ouvrez Services.

13 Vous avez maintenant accès à tous les services installés sur votre machine. Vous pouvez configurer le type de démarrage, Démarrer, Arrêter, Suspendre et Reprendre le Service (si vous l avez permit en configurant le service). Sachez que les options que l on trouve dans ces onglets peuvent être paramétrées en modifiant votre Service dans Visual Studio. Sachez que vous pouvez accéder également certaines options de votre Service en ligne de commande grâce à la commande Net : C:\Users\Paul>Net start MonService Le service MonService démarre. Le service MonService a démarré. Enfin, le Framework.NET fournit également un espace de nom spécialisé dans le contrôle des services : System.ServiceProcess Note : Il faut ajouter la référence à l espace de nom dans votre projet Voici un court exemple de fonctionnement de cet espace de nom. Nous allons suspendre notre Service pendant 5 secondes puis le Reprendre.

14 'VB Sub Main() Dim controleur As ServiceController = New ServiceController("MonService") Console.WriteLine("Mise en pause du service pendant 5 secondes") controleur.pause() Thread.Sleep(5000) Console.WriteLine("Le service est relancé") controleur.continue() End Sub Console.Read() //C# static void Main(string[] args) ServiceController controleur = new ServiceController("MonService"); Console.WriteLine("Mise en pause du service pendant 5 secondes"); controleur.pause(); Thread.Sleep(5000); Console.WriteLine("Le service est relancé"); controleur.continue(); Console.Read();

15 2.2 Exemple pratique Nous avons vu comment créer et configurer son service, mais nous avons peu écrit de lignes de codes, je vous ai donc préparé un petit exemple pratique très simple. Notre service va tout simplement loguer ses changements d état dans le journal des évènements de Windows, et nous allons utiliser le code vu précédemment, dans une version légèrement étoffée pour contrôler le service. Tout d abord, commençons par rajouter un composant à notre service, rendez-vous sur le designer de votre service, et ouvrez la toolbox (Affichage -> Boite à outils). Ensuite dans l onglet composant, sélectionnez le composant Eventlog et déplacez-le sur la zone du designer. Ensuite veillez à désactiver la propriété AutoLog de votre service. AutoLog permet d enregistrer chaque changement d état du service dans le journal des évènements. Comme nous souhaitons reproduire la même chose, nous le désactivons pour éviter les doublons. Pour l'exemple, nous activerons également la propriété CanPauseAndContinue. Editez maintenant le code du service :

16 'VB Public Class MonService Public Sub New() InitializeComponent() If (Not System.Diagnostics.EventLog.SourceExists("MonService")) Then System.Diagnostics.EventLog.CreateEventSource("MonService", "Application") End If EventLog1.Source = "MonService" EventLog1.Log = "Application" End Sub Protected Overrides Sub OnStart(ByVal args() As String) EventLog1.WriteEntry("Le service est démarré") End Sub Protected Overrides Sub OnStop() EventLog1.WriteEntry("Le service est arreté") End Sub Protected Overrides Sub OnPause() EventLog1.WriteEntry("Le service est mit en pause") End Sub Protected Overrides Sub OnContinue() EventLog1.WriteEntry("Le service est relancé") End Sub End Class

17 //C# public partial class MonService : ServiceBase public MonService() InitializeComponent(); if (!System.Diagnostics.EventLog.SourceExists("MonService")) System.Diagnostics.EventLog.CreateEventSource("MonService", "Application"); eventlog1.source = "MonService"; eventlog1.log = "Application"; protected override void OnStart(string[] args) eventlog1.writeentry("le service est démarré"); protected override void OnStop() eventlog1.writeentry("le service est arreté"); protected override void OnPause() eventlog1.writeentry("le service est mit en pause"); protected override void OnContinue() eventlog1.writeentry("le service est relancé"); Dans le constructeur, après avoir initialisé les composants, nous vérifions si la source «MonService» existe dans le journal d évènement. Si elle n existe pas, nous la créons dans le journal Application. Ensuite nous assignons à l instance du composant EventLog la source qui représente notre application dans le journal des évènements et le journal dans lequel doivent être écrits les évènements. Enfin dans chaque méthode exécutée lors d un changement d état, nous inscrivons dans le journal une nouvelle entrée. Note : Nous verrons plus en profondeur le fonctionnement des journaux d évènements dans un prochain chapitre.

18 Ensuite avec notre projet chargé de contrôler le service, nous allons changer les états du service : 'VB Sub Main() Dim controleur As ServiceController = New ServiceController("MonService") Console.WriteLine("Démarrage du service, mise en pause dans 1 seconde") controleur.start() Thread.Sleep(1000) Console.WriteLine("Mise en pause du service pendant 5 secondes") controleur.pause() Thread.Sleep(5000) Console.WriteLine("Le service est relancé, il sera arreté dans 5 secondes") controleur.continue() Thread.Sleep(5000) Console.WriteLine("Arret du service") controleur.stop() End Sub Console.Read() //C# static void Main(string[] args) ServiceController controleur = new ServiceController("MonService"); Console.WriteLine("Démarrage du service, mise en pause dans 1 seconde"); controleur.start(); Thread.Sleep(1000); Console.WriteLine("Mise en pause du service pendant 5 secondes"); controleur.pause(); Thread.Sleep(5000); Console.WriteLine("Le service est relancé, il sera arreté dans 5 secondes"); controleur.continue(); Thread.Sleep(5000); Console.WriteLine("Arret du service"); controleur.stop(); Console.Read(); Démarrage du service, mise en pause dans 1 seconde Mise en pause du service pendant 5 secondes Le service est relancé, il sera arreté dans 5 secondes Arret du service

19 Le code parle de lui-même, nous instancions le contrôleur de type ServiceController pointant sur le service «MonService» puis nous changeons quatre fois son état : Démarrage, Pause, Reprise, Arrêt. Nous mettons en pause le thread principal entre les actions afin de laisser le temps au service de changer d état. Ouvrons maintenant le journal des évènements, soit en exécutant la commande eventvwr.msc, soit en allant dans Panneau de Configuration -> Outils d administration -> Observateur d évènements. Ensuite ouvrez l onglet de gauche Journaux Windows et sélectionnez le journal Application. Lancez maintenant l application de contrôle et regardez le journal se remplir.

20 3 Les domaines d application 3.1 Notions de bases Dans la première partie de ce chapitre, nous avions vu comment créer des tâches de fond : Les services. Dans cette partie-ci, nous allons voir ce que sont les domaines d'applications. Les domaines d'applications sont un peu comme des capsules englobant le processus d'exécution de nos applications ainsi que tous leurs sous-processus éventuels. Ils permettent de séparer les ressources utilisées entre chaque application et d'y appliquer des règles de sécurité particulières. En.NET, lorsque nous exécutons un assembly, la CLR va créer un domaine d'application. Ce procédé nous permet (entre autre) d'exécuter d'autres assemblies soit dans le même domaine, soit dans un domaine différent que la CLR aura pris soin de créer pour nous. De la même façon que la CLR, vos applications peuvent très bien héberger un domaine d'application qui leur est propre afin de pouvoir y exécuter une ou plusieurs assembly. Le schéma ci-dessous nous montre ce procédé : Pour gérer les domaines d'application, le.net Framework utilise la classe AppDomain de l'espace de nom System. Voici les différents membres de cette classe :

21 Propriétés ActivationContext ApplicationIdentity ApplicationTrust BaseDirectory CurrentDomain DomainManager DynamicDirectory Evidence FriendlyName Id RelativeSearchPath SetupInformation ShadowCopyFiles Description Contient un objet ActivationContext indiquant le contexte d'activation du domaine d'application. Contient un objet ApplicationIdentity indiquant l'identité de l'application dans le domaine d'application. Contient un objet ApplicationTrust indiquant les droits accordés à l'application pour s'exécuter et son niveau de confiance. Contient le dossier utilisé pour la recherche des assemblies à charger. Propriété statique contenant le domaine d'application courant pour le thread qui en fait l'appel. Contient un objet AppDomainManager indiquant le gestionnaire de domaine utilisé lors de l'initialisation du domaine d'application. Contient le dossier utilisé pour la recherche des assemblies créées de façon dynamique. Contient un objet Evidence indiquant la stratégie de sécurité utilisée. Contient le nom de domaine utilisé par le domaine d'application concerné. Le nom de domaine par défaut est identique au fichier exécuté. Contient l'identifiant numérique unique du domaine d'application au sein du processus. Contient le dossier (à partir du dossier de base) dans lequel rechercher les assemblies privées. Contient un objet AppDomainSetup indiquant la configuration du domaine d'application. Indique si toutes les assemblies chargées dans le domaine d'application sont des copies fantôme. Méthodes ApplyPolicy CreateComInstanceFrom CreateDomain CreateInstance CreateInstanceAndUnwrap CreateInstanceFrom CreateInstanceFromAnd Unwrap DefineDynamicAssembly DoCallBack ExecuteAssembly Description Retourne le nom complet d'une assembly après application des règles de sécurité. Créé un nouvel objet COM (Component Object Model) 1 de type défini en paramètre. Méthode statique permettant de créer un nouveau domaine d'application. Crée une nouvelle instance d'un type défini dans l'assembly spécifiée. Crée une nouvelle instance d'un type spécifique. Identique à CreateInstance mais en partant d'un fichier d'assembly Identique à CreateInstanceAndUnwrap mais en partant d'un fichier d'assembly. Défini une assembly dynamique dans le domaine d'application. Exécute du code identifié par un pointeur de fonction dans un autre domaine d'application. Lance l'exécution d'une assembly contenue dans le fichier

22 spécifié. ExecuteAssemblyByName Lance l'exécution d'une assembly. GetAssemblies Retourne un objet Assembly contenant l'ensemble des assemblies chargées dans le contexte du domaine d'application. GetCurrentThreadId Retourne l'identifiant du thread courant. GetData Retourne les données stockées dans le domaine et identifiées par le nom passé en paramètre. InitializeLifetimeService Défini une durée de vie infinie pour le domaine en empêchant la création de baux. IsDefaultAppDomain Indique si le domaine est celui par défaut pour le processus courant. IsFinalizingForUnload Indique si les assemblies chargées sont en cours de finalisation dans le domaine. Load Charge une assembly dans le domaine. ReflectionOnlyGetAssemblies Retourne les assemblies chargées dans la partie réflexion du contexte du domaine d'applications. SetAppDomainPolicy Définit les règles de sécurité du domaine d'application. SetData Ajoute une donnée identifiée par un nom dans le domaine. SetDynamicBase Définit le chemin d'accès pour les fichiers générés dynamiquement. SetPrincipalPolicy Spécifie comment les objets Principal et Identity doivent être rattachés à un thread s'il tente de communiquer avec un objet Principal pendant son exécution. SetShadowCopyFiles Active les copies fantômes SetShadowCopyPath Définit le dossier contenant les copies fantôme des assemblies. SetThreadPrincipal Définit l'objet Principal auquel les threads peuvent se rattacher. Unload Décharge le domaine d'application.

23 La création d'un nouveau domaine peut s'apparenter à l'utilisation d'un logiciel à petite échelle ; et comme (pratiquement) tout logiciel, il faut d'abord créer un "installeur" de domaine. Pour cela, le.net Framework propose la classe AppDomainSetup qui permet de modifier les paramètres d'un domaine existant ou de spécifier les paramètres utilisés lors de la création d'un sous-domaine. En voici les principaux membres : Propriétés Description ActivationArguments Obtient ou définit les données d'activation du domaine. ApplicationBase Obtient ou définit le nom du dossier racine contenant l'application à exécuter. ApplicationName Obtient ou définit le nom de l'application. ApplicationTrust Obtient ou définit un objet relatif aux règles de sécurité en vigueur. ConfigurationFile Obtient ou définit le nom du fichier de configuration utilisé par le domaine d'application. DisallowApplicationBaseProbing Obtient ou définit si, lors d'une recherche d'assemblies à charger, l'objet de recherche va inclure le dossier de base et le dossier privé. DisallowBindingRedirect Obtient ou définit si le domaine autorise la redirection de liaisons d'assemblies. DisallowCodeDownload Obtient ou définit une valeur indiquant si le domaine peut télécharger des assemblies ou non. DisallowPublisherPolicy Obtient ou définit une valeur indiquant si la section de sécurité d'un fichier de configuration. DynamicBase Obtient ou définit le chemin d'accès au dossier contenant les fichiers générés dynamiquement. LicenseFile Obtient ou définit le chemin d'accès au fichier de licence associé au domaine. LoaderOptimization Obtient ou définit une valeur indiquant les règles d'optimisations utilisées pour le chargement d'applications. PrivateBinPath Obtient ou définit le sous-dossier, relatif au dossier de base, qui sera utilisé pour rechercher les assemblies privées.

24 L'exemple suivant va créer un nouveau sous-domaine en utilisant un objet d'installation personnalisé. Dans ce sous-domaine, on va charger et exécuter le même programme avant d'appeler une de ses méthodes. Ensuite, on va décharger le sous-domaine : 'VB Imports System.Reflection Module partie1 Public ad As AppDomain Public setup As AppDomainSetup Sub Main() setup = New AppDomainSetup() setup.applicationbase = AppDomain.CurrentDomain.BaseDirectory setup.disallowapplicationbaseprobing = False setup.disallowcodedownload = True setup.configurationfile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile Console.WriteLine("Nom de domaine 0" + vbnewline + "Domaine par défaut? 1", AppDomain.CurrentDomain.FriendlyName, AppDomain.CurrentDomain.IsDefaultAppDomain()) If (AppDomain.CurrentDomain.IsDefaultAppDomain()) Then ad = AppDomain.CreateDomain("Sous-Domaine", AppDomain.CurrentDomain.Evidence, setup) ad.executeassembly(appdomain.currentdomain.friendlyname) ad.docallback(new CrossAppDomainDelegate(AddressOf DitBonjour)) AppDomain.Unload(ad) For Each a As Assembly In AppDomain.CurrentDomain.GetAssemblies() Console.WriteLine(a.Location) Next Console.Read() End If End Sub Public Sub DitBonjour() Console.WriteLine("Hello. C'est le domaine 0 qui te parle", AppDomain.CurrentDomain.FriendlyName) End Sub End Module

25 //C# public static AppDomain ad; public static AppDomainSetup setup; static void Main(string[] args) setup = new AppDomainSetup(); setup.applicationbase = AppDomain.CurrentDomain.BaseDirectory; setup.disallowapplicationbaseprobing = false; setup.disallowcodedownload = true; setup.configurationfile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; Console.WriteLine("Nom de domaine 0 \n Domaine par défaut? 1", AppDomain.CurrentDomain.FriendlyName, AppDomain.CurrentDomain.IsDefaultAppDomain()); if(appdomain.currentdomain.isdefaultappdomain()) ad = AppDomain.CreateDomain("Sous-Domaine", AppDomain.CurrentDomain.Evidence, setup); ad.executeassembly(appdomain.currentdomain.friendlyname); ad.docallback(new CrossAppDomainDelegate(DitBonjour)); AppDomain.Unload(ad); foreach(assembly a in AppDomain.CurrentDomain.GetAssemblies()) Console.WriteLine(a.Location); Console.Read(); public static void DitBonjour() Console.WriteLine("Hello. C'est le domaine 0 qui te parle", AppDomain.CurrentDomain.FriendlyName); Note : Certains éléments contenus dans l'espace de nom System.Reflection sont nécessaires dans ce code.

26 Le résultat ci-dessous est celui affiché si on exécute le programme en utilisant le débuggeur de Visual Studio : Nom de domaine Chapitre 8.vshost.exe Domaine par défaut? True Hello. C'est le domaine Sous-Domaine qui te parle C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities\9.0.0.0 b03f5f7f11d50a3a\microsoft.visualstudio.hostingprocess.utilities.dll C:\Windows\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0 b77a5c561934e089\syst em.windows.forms.dll C:\Windows\assembly\GAC_MSIL\System\2.0.0.0 b77a5c561934e089\system.dll C:\Windows\assembly\GAC_MSIL\System.Drawing\2.0.0.0 b03f5f7f11d50a3a\system.dra wing.dll C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities.Syn c\9.0.0.0 b03f5f7f11d50a3a\microsoft.visualstudio.hostingprocess.utilities.sync.dll C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.Debugger.Runtime\9.0.0.0 b0 3f5f7f11d50a3a\Microsoft.VisualStudio.Debugger.Runtime.dll D:\Documents\dotNet France\Framework - VB\Chapitre 8\bin\Debug\Chapitre 8.vshost.exe C:\Windows\assembly\GAC_32\System.Data\2.0.0.0 b77a5c561934e089\system.data.dll C:\Windows\assembly\GAC_MSIL\System.Deployment\2.0.0.0 b03f5f7f11d50a3a\system. Deployment.dll C:\Windows\assembly\GAC_MSIL\System.Xml\2.0.0.0 b77a5c561934e089\system.xml.dll C:\Windows\assembly\GAC_MSIL\Microsoft.VisualBasic\8.0.0.0 b03f5f7f11d50a3a\mic rosoft.visualbasic.dll D:\Documents\dotNet France\Framework - VB\Chapitre 8\bin\Debug\Chapitre 8.exe C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll

27 3.2 Les règles de sécurité d un domaine L'un des désavantages majeurs du chargement de code tiers, c'est qu'on ne peut pas forcément prévoir si le logiciel ne contiendra pas une faille ou si le logiciel lui-même n'est pas malveillant. Aussi, lorsque vous créez vos propres domaines d'applications, vous avez un accès total aux privilèges accordés aux assemblies qui y seront exécutées au travers des objets créés à partir de la classe Evidence. Pour construire un tel objet, vous pouvez soit spécifier vos propres règles de sécurité dans des tableaux (ce qui n'est pas très aisé), soit utiliser la classe Zone combinée avec l'énumération SecurityZone. Ensuite, vous pouvez appliquer vos règles de sécurité aussi bien à une assembly particulière dans un domaine qu'a tout un domaine. Le code suivant reprend le code utilisé dans la partie précédente et ajoute une règle de sécurité à l'assembly, basée sur une source de code non-sûre. De ce fait, le code amènera à une exception :

28 'VB Imports System.Reflection Imports System.Security.Policy Module partie1 Public ad As AppDomain Public setup As AppDomainSetup Public secu As Evidence Sub Main() 'On créé l'outil d'initialisation du sous-domaine setup = New AppDomainSetup() setup.applicationbase = AppDomain.CurrentDomain.BaseDirectory setup.disallowapplicationbaseprobing = False setup.disallowcodedownload = True setup.configurationfile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile 'On créé également les règles de sécurité associées secu = New Evidence(New Object() New Zone(Security.SecurityZone.Untrusted), Nothing) Console.WriteLine("Nom de domaine 0" + vbnewline + "Domaine par défaut? 1", AppDomain.CurrentDomain.FriendlyName, AppDomain.CurrentDomain.IsDefaultAppDomain()) If (AppDomain.CurrentDomain.IsDefaultAppDomain()) Then ad = AppDomain.CreateDomain("Sous-Domaine", AppDomain.CurrentDomain.Evidence, setup) Try ad.executeassembly(appdomain.currentdomain.friendlyname, secu) ad.docallback(new CrossAppDomainDelegate(AddressOf DitBonjour)) AppDomain.Unload(ad) Catch ex As Exception Console.WriteLine("L'assembly n'a pas pu obtenir de privilège suffisant pour s'exécuter" + vbnewline + ex.message) End Try Console.Read() End If End Sub Public Sub DitBonjour() Console.WriteLine("Hello. C'est le domaine 0 qui te parle", AppDomain.CurrentDomain.FriendlyName) End Sub End Module

29 //C# public static AppDomain ad; public static AppDomainSetup setup; public static Evidence secu; static void Main(string[] args) setup = new AppDomainSetup(); setup.applicationbase = AppDomain.CurrentDomain.BaseDirectory; setup.disallowapplicationbaseprobing = false; setup.disallowcodedownload = true; setup.configurationfile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; secu = new Evidence(new Object[] new Zone(System.Security.SecurityZone.Untrusted), null); Console.WriteLine("Nom de domaine 0 \n Domaine par défaut? 1", AppDomain.CurrentDomain.FriendlyName, AppDomain.CurrentDomain.IsDefaultAppDomain()); if(appdomain.currentdomain.isdefaultappdomain()) ad = AppDomain.CreateDomain("Sous-Domaine", AppDomain.CurrentDomain.Evidence, setup); try ad.executeassembly(appdomain.currentdomain.friendlyname, secu); ad.docallback(new CrossAppDomainDelegate(DitBonjour)); AppDomain.Unload(ad); catch(exception ex) Console.WriteLine("L'assembly n'a pas pu obtenir de privilège suffisant pour s'exécuter\n0", ex.message); Console.Read(); public static void DitBonjour() Console.WriteLine("Hello. C'est le domaine 0 qui te parle", AppDomain.CurrentDomain.FriendlyName); Nom de domaine Chapitre 8.vshost.exe Domaine par défaut? True L'assembly n'a pas pu obtenir de privilège suffisant pour s'exécuter Impossible de charger le fichier ou l'assembly 'vshost, Version=9.0.0.0, Culture =neutral, PublicKeyToken=b03f5f7f11d50a3a' ou une de ses dépendances. Impossible d'accorder l'autorisation d'exécuter. (Exception de HRESULT : 0x80131418) Remarquez également que dans ces exemples, nous réutilisons les règles de sécurité du domaine par défaut sur notre sous-domaine. Vous aurez rapidement compris que pour appliquer des règles de sécurité non plus à une assembly dans le domaine mais au domaine entier, nous placerons notre objet Evidence à la place de AppDomain.CurrentDomain.Evidence. Notez également que les règles de sécurité concernant les applications ne sont que très brièvement abordées ici. En effet, ce sera l'objet d'un chapitre complet (Chapitre 11).

30 4 Conclusion Avec ce chapitre, nous avons mit en avant deux manières de faire interagir des applications. Il en existe bien d autres, mais nous tenions à vous présenter les cas les plus particuliers. Les services vous seront d une grande aide lorsque vous développerez des applications, ils permettent de créer des outils ou des applications serveur très performantes et facilement configurables. Les domaines d applications garantiront quant à eux l intégrité et la sécurité de vos projets. A la fin de ce chapitre, vous devriez être capable de : Créer et configurer un Service, puis le déployer. Contrôler un Service grâce à une application tiers. Créer et configurer un domaine d application, et savoir en récupérer les informations en cours d exécution. Savoir également comment charger des assemblies dans un domaine. Savoir comment appliquer des règles de sécurité à un domaine ou une assembly. Dans tous les cas, n'hésitez pas à aller visiter le MSDN qui peut vous apporter beaucoup d'aide dans vos développements :