• Utilisation de l’Audit de SQL Server 2008 dans un trigger sur une table Project Server

    Bonjour,

    Vous êtes nombreux à utiliser les triggers sous SQL Server pour ajouter des commandes et des actions basés sur des évènements se produisant sur une table de Project Server 2010.

    Que ce soit pour alimenter une table externe ou envoyer une notification par mail, le trigger est une solution simple et efficace d’étendre les fonctionnalités de Project Server 2010, même si nous recommandons de l’utiliser avec parcimonie du fait de l’impact non négligeable qu’il peut avoir sur les performance de Project Server, pouvant dans un cas extrême, provoquer des deadlocks.

     

    Mais le trigger peut aussi avoir un intérêt lorsqu’il faut chercher la cause d’une action dont on ne connait pas la cause.

     

    Ainsi, prenons l’exemple d’un cas dans lequel des enregistrements sont supprimés d’une table, sans que l’on sache pourquoi, mais qui provoque des disparitions de lignes dans les Feuilles de temps ou dans l’affichage de Mes Tâches.

    En fait, et je vous passe tous les détails de la recherche de cause, ces enregistrements sont supprimés de la tables MSP_TASKS_SAVED de la base Published, créant ainsi des enregistrements orphelins dans la tables MSP_ASSIGNMENTS_SAVED.

    Comme nous n’avons de scénario pour reproduire à volonté ce phénomène, il nous reste le choix entre:

    1. Exécuter SQL Profiler en mode Ring pour loguer toute l’activité de cette base de données sur un temps donné et stopper cette trace dès que le problème est détecté
    2. Créer un trigger DDL (les trigger DML ne sont pas utilisables sur une action DELETE) qui logue l’action dans une table temporaire
    3. Utiliser le fonction d’Audit de SQL Server 2008 (et R2) pour loguer l’action mais aussi des informations complémentaire sur ce qui a déclencher le trigger

     

    La première solution est la plus facile à mettre en place mais le résultat obtenu peut varier considérablement en fonction du l’activité sur la base de données et surtout, il ne faut pas arrêter la trace trop tard sous peine de perdre les informations intéressantes.

    De plus, cette solution a un impact non négligeable sur les performances et ne peut donc pas être utilisée sur une longue période.

     

    La deuxième solution est aussi très facile à implémenter mais le résultat va rester assez limité car on ne pourra obtenir que des informations succintes sur l’évènement : Quand et Qui. Mais impossible de connaitre le Quoi car la fonction EVENTDATA de SQL ne peut être utilisée que dans un trigger DML qui, je le rappelle ne peut pas être associé à une action DELETE sur un table.

     

    La dernière solution est donc la meilleure car en plus de pouvoir vous donner des informations sur le Quand et le Qui, elle va aussi vous indiquer le Quoi. C’est donc cette solution que je vais vous détailler:

     

    Création du fichier de Log

    La première étape consiste à créer le fichier de log où seront stockées les informations d’Audit:

    use master

    go

    -- Create the server audit.

    CREATE SERVER AUDIT Audit_mytrig

        TO FILE ( FILEPATH = 'C:\' ) ;

    GO

    -- Enable the server audit.

    ALTER SERVER AUDIT Audit_mytrig

    WITH (STATE = ON) ;

    GO

     

    Création du Trigger

    Pour créer le trigger, vous devez exécuter la procédure suivante:

     

    USE PROJECTSERVER_PUBLISHED ;

    GO

     

    CREATE DATABASE AUDIT SPECIFICATION Audit_mytrig_Table

    FOR SERVER AUDIT Audit_mytrig

    ADD (DELETE

         ON MSP_TASKS_SAVED by dbo)

    WITH (STATE = ON) ;

    GO

     

    A partir ce cette étape, toute action de DELETE sur la table MSP_TASKS_SAVED va écrire une information dans le fichier de log.

     

     

    Récupérer les informations du fichier de log:

    Pour lire le contenu du fichier de log, vous pouvez utiliser la procédure suivante:

     

    USE master

     GO

    -- get the audit file

    DECLARE @filepattern VARCHAR(300)

    DECLARE @folder VARCHAR(255)

    DECLARE @auditguid VARCHAR(36)

    SELECT @auditguid = audit_guid,@folder = log_file_path

    FROM sys.server_file_audits WHERE name = 'Audit_mytrig'

     

    SELECT @filepattern = @folder + '*_' + @auditguid + '*'

     

    -- view the results

    SELECT event_time,session_id,a.name AS Action,c.class_type_desc AS ObjectType,

    f.server_principal_name,f.schema_name,f.OBJECT_NAME,f.statement,f.additional_information

    FROM fn_get_audit_file(@filepattern,NULL,NULL) AS f

    JOIN sys.dm_audit_class_type_map c ON f.class_type = c.class_type

    JOIN sys.dm_audit_actions a ON f.action_id = a.action_id

    AND c.securable_class_desc = a.class_desc

    WHERE f.action_id <> 'AUSC'

    ORDER BY event_time DESC,sequence_number

     

    Voici un exemple de ce que la requête renvoie alors qu’un DELETE vient d’être exécuté sur la table MSP_TASKS_SAVED:

    clip_image002

    Vous remarquez qu’en plus des informations basiques du Quand et du Qui, on a aussi une information très intéressante sur le Quoi. Cela peut être une requête ou une Procédure Stockée. Dans ce dernier cas, le nom de la procédure stockée apparait dans la colonne Statement.

     

    Conclusion:

    En conclusion, on peut dire que cette fonction peut être très utile pour connaitre la raison d’un phénomène que l’on ne peut expliquer. Est-ce une requête ou une procédure stockée liée à du code personnalisé ? Est-ce du code lié à une action particulière faite dans Project Server ?

    L’information Statement peut nous aider considérablement pour comprendre ce qu’il se passe et peut être un très bon point de départ à la recherche d’une cause ou d’un scénario de reproduction.

     

    N’hésitez pas à commenter cet article.

    Bonne journée,

     

    Marc Biarnès

  • Désactivation régulière des services Event et Queue de Project Server 2010

    Bonjour,

    Nous avons reçu au Support, et ce de manière assez régulière, des incidents nous décrivant un phénomène plutôt surprenant qui se produit sur les serveurs Project Server 2010.

    1. Description du phénomène:

    En effet, vous avez été plusieurs à constater que sur vos serveurs, les Services “Microsoft Project Server Event Service 2010" et "Microsoft Project Server Queue Service 2010” était arrêtés et désactivés de manière régulière, sans aucune intervention humaine.

    Le symptôme marquant qui a permis de détecter ce phénomène est que les jobs de publication, sauvegarde, archivage n’étaient plus exécutés mais restaient dans la Queue en attente.

    Pourtant, quand vous vérifiez les instances de ces Services dans la SharePoint Central Admin, vous pouvez voir qu’ils apparaissent comme étant Démarrés:

    clip_image001

    Pourtant, si vous vérifiez leur état dans la console Services des Outils d’Administration de Windows Server, vous les voyez arrêtés et désactivés:

    clip_image002

    Le fait de rechanger les propriétés en Automatique et de redémarrer les services permet de refaire fonctionner Project Server… quelques temps. Car en effet, à nouveau, ces services vont s’arrêter et se désactiver automatiquement.

    Bien que la réinstallation de la plate-forme permette de corriger ce problème, je me suis penché dessus pour essayer de comprendre ce qui provoquait ce phénomène.

    2. La Cause:

    Tout d’abord, après de multiples analyses de log ULS fournis par les différentes machines impactées, j’ai pu découvrir que le phénomène n’est pas si aléatoire que cela. En effet, curieusement, on détecte rapidement que l’arrêt des services et leur désactivation interviennent à heure régulière.

    Qui dit “heure régulière” dit règle automatique. Et en fait, toujours en regardant les logs ULS, on peut voir que c’est une des règles du Hourly Health Analysis Job exécuté par les SharePoint Timer, qui est la cause de ce phénomène:

    clip_image003

    Et plus précisément, il s’agit de cette règle en particulier:

    clip_image004

     

    Pour le vérifier, il suffit simplement, si vos Services Project Server 2010 sont démarrés, d’exécuter cette règle en cliquant sur le bouton “Run Now”.

    A ce moment-là, vous verrez les Services s’arréter et se désactiver et dans les logs ULS, vous obtiendrez le résultat suivant:

    OWSTIMER.EXE (0x1A60)

    0x0C48

    SharePoint Foundation

    Health

    ag78

    Verbose

    Checking the Microsoft Project Server Queuing Service windows service instance.

    OWSTIMER.EXE (0x1A60)

    0x0C48

    SharePoint Foundation

    General

    0000

    Verbose

    Entered SPAdvApi32.IsServiceRunning(ProjectQueueService14)

    OWSTIMER.EXE (0x1A60)

    0x0C48

    SharePoint Foundation

    Health

    ag7d

    Verbose

    The service is not disabled, but should be.

    OWSTIMER.EXE (0x1A60)

    0x0C48

    SharePoint Foundation

    Health

    8fs1

    Verbose

    Finished invoking the Check() method.  The rule Failed.

    OWSTIMER.EXE (0x1A60)

    0x0C48

    SharePoint Foundation

    Health

    8fs4

    Medium

    Automatic repair is being attempted.

    OWSTIMER.EXE (0x1A60)

    0x0C48

    SharePoint Foundation

    General

    0000

    Verbose

    Entered SPAdvApi32.IsServiceRunning(SPAdminV4)

    OWSTIMER.EXE (0x1A60)

    0x0C48

    SharePoint Foundation

    General

    0000

    Verbose

    Entered SPAdvApi32.StopService(ProjectQueueService14)

    Microsoft.Office.Project.Server (0x1A08)

    0x22B0

    Project Server

    General

    8zdx

    High

    [SERVICE] ProjectQueueService14: shutting down

    Ce qu’il est intéressant de constater, c’est que cette règle arrête et désactive les Services Project Server 2010 car elle pense que l’état des Services devrait être ainsi.

    Cela n’est possible que si la règle détecte qu’il y a un problème entre l’état des Services et ceux de l’instance.

    Et c’est effectivement le cas. Comme nous 'l’avons vu plus haut, dans la Central Admin, l’instance Project Server est démarrée (“Started”). 

    Or, si nous exécutons la commande Powershell suivante:

    ((Get-SPFarm).Services| where {$_.Name -match "ProjectQueueService14"}).instances  

    ((Get-SPFarm).Services| where {$_.Name -match "ProjectEventService14"}).instances 

    on obtient une réponse sans équivoque : “Disabled”:

    image

    Et c’est donc là que se pose le problème d’incohérence des états qu’essaye de corriger la règle. 

    La solution :

    Même si le scénario pour reproduire ce phénomène reste mystérieux, on peut imaginer que cela soit dû à une erreur de configuration lors du premier démarrage des Services Project Server 2010 après leur installation.

    Cependant, on peut définitivement corriger cela en exécutant la commande PowerShell suivante sur tous les serveurs sur lesquels les Services sont installés:

    Start-SPServiceInstance -Identity <Id>

    image

    Pendant quelques minutes durant lesquelles le Service est démarré et initialisé, le service est en état Provisionning:

    image

    Puis, une fois le processus terminé, il est a nouveau Online:

    image

    Si cela ne fonctionne pas correctement sur un de vos serveurs, faites un  Config Cache Refresh et exécuter cette commande à nouveau:

    Stop-SPServiceInstance -Identity <Id>

    Start-SPServiceInstance -Identity <Id>

    <Id> est l’identifiant de l’instance du Service que l’on obtient en exécutant les commandes PowerShell Get-SPFarm précédentes.

    N’hésitez pas à commenter cet article et partager vos expériences.

    Bonne journée,

    Marc Biarnès

  • JOYEUX NOEL !

    Au nom de toute l'équipe de Support Technique Project et Project Server, je vous souhaite à tous et à vos proches de très Bonnes Fêtes de Noël.

  • Installer le pack de langue français sur Project Professionnel

    Bonjour,

    La particularité de Project Professional est son intégration dans la famille Office tout en ayant quelques libertés. En effet, il possède son propre pack de langue. La méthodologie abordée aujourd’hui fonctionne également pour les anciennes versions. Lorsque vous lancez l’installation du pack de langue vous obtenez par défaut l’installation d’Office. En effet, on voit bien dans l’image ci-dessus que Project possède son propre Pack de langue ainsi que Visio.

    En cliquant sur le setup, vous accédez à l’installation des packs de langue.

     

    clip_image002[5]clip_image004[4]

     

    Il faut donc sélectionner le Pack de Langue Project. Vous continuez et acceptez les termes du contrat.

    clip_image006[4]

    Ensuite, vous installez :

    clip_image008[4]

    clip_image010

    Une fois l’installation terminée, vous obtenez le message suivant et vous pouvez fermer.

    clip_image012

    Maintenant, il nous faut activer la nouvelle langue installée. Vous ouvrez Project Professionnel et allez dans “File” puis dans “options”.

    image

    image

    Dans l’onglet “Language” vous vous dirigez dans la rubrique “Choose Display and Help Languages “ vous sélectionnez  le français comme paramètre par defaut (cliquez sur “Set as Default”).

    image

    Cliquez  “Ok” pour fermer la boîte de dialogue et une nouvelle fois “Ok” au message ci-dessous:

    image

    Vous fermez l’application et l’ouvrez à nouveau.

    Votre Project Professionnel est en Français.

    image

    J’espère que cet article vous aura aidé dans votre installation. Si vous êtes intéressés par la version server. Celle-ci arrivera prochainement.

  • Les Cumulative Updates du mois de décembre sont disponibles

    Bonjour,

    Pour Project et Project Server 2007 :

    Mises à Jour complètes (tout langage):

    Mises à Jour Individuelles (tout langage):

    Pour Project et Project Server 2010 :

    Mises à Jour complètes (tout langage):

    Mises à Jour Individuelles (tout langage):

    IMPORTANT: L’installation du Service Pack 1 sur les clients et sur les serveurs est dorénavant obligatoire avant l’installation de tout CU pour Office, Sharepoint et Project Server 2010

    Je vous rappelle qu’en ce qui concerne la version 2010, le correctif client est disponible en deux versions : x86 ou x64. Vérifiez bien que la version que vous téléchargez est en rapport avec la version du client installé sur vos machines.

    Si vous désirez de plus amples informations sur les différentes versions de correctifs disponibles, je vous renvoie à l’article suivant : http://blogs.technet.com/b/frenchpjblog/archive/2010/05/04/le-cumulative-update-du-mois-d-avril-est-disponible.aspx

    Bonne journée

    Marc Biarnès