dimanche 21 mars 2010

Une console Powershell tout en un !

0 commentaires
L'administration en ligne de commande c'est bien ! Mais quand cela nécessite plusieurs consoles c'est beaucoup moins amusant. Après avoir installé les outils de management de Exchange 2007 (EMS entre autre) sur mon poste client XP, j'ai vite trouvé un intérêt a l'agrémenter d'autres fonctionnalités comme la gestion de Active Directory avec le powershell (outils de chez Quest Software). Malheureusement après installation du package Quest ActiveRoles pour gérer l'active directory avec powershell, je me retrouve avec deux consoles distinctes. Le but est de les "fusionnées".


  1. Pré-requis
    Avoir installé les outils d'administration Exchange 2007 ainsi que le package Active Directory de Quest Software DISPO ICI (necessite Le .NET Framework 3.5SP1)

  2. Exemple de raccourci vers une console Powershell
    %SystemRoot%\system32\Windows\PowerShell\v1.0\powershell.exe -psconsolefile "C:\MesConsolePosh\UneConsole.psc1"

  3. Contenu du fichier .psc1 et modification.
    Il suffit tout simplement de créer un fichier .psc1 qui regroupe tous les autres fichiers consoles comme celui de Exchange, ActiveRoles, VmWare, etc...
    Exemple de fichier intégrant Exchange et ActiveRole :




    <?xml version="1.0" encoding="utf-8"?>
    <PSConsoleFile ConsoleSchemaVersion="1.0">
    <PSVersion>1.0</PSVersion>
    <PSSnapIns>
    <PSSnapIn Name="Microsoft.Exchange.Management.PowerShell.Admin" />
    <PSSnapIn Name="Quest.ActiveRoles.ADManagement" />
    </PSSnapIns>
    </PSConsoleFile>
    Il est maintenant possible dans une seule et même invite de commande d'exécuter des cmdlets Exchange 2007 et ActiveRoles.

  4. Personnalisation et finalisation.
    Lors du lancement de la console il est possible de spécifier un fichier de commande. Celui-ci peut permettre par exemple de définir des alias de commande. Voici un exemple de fichier dérivé de celui de Exchange 2007.






    ## ALIASES ###################################################################
    set-alias list       format-list
    set-alias table      format-table
    ## Confirmation is enabled by default, uncommenting next line will disable it
    # $ConfirmPreference = "None"
    ## EXCHANGE VARIABLEs ########################################################
    $global:exbin = (get-itemproperty HKLM:\SOFTWARE\Microsoft\Exchange\Setup).MsiInstallPath + "bin\"
    $global:exinstall = (get-itemproperty HKLM:\SOFTWARE\Microsoft\Exchange\Setup).MsiInstallPath
    $global:exscripts = (get-itemproperty HKLM:\SOFTWARE\Microsoft\Exchange\Setup).MsiInstallPath + "scripts\"
    $global:AdminSessionADSettings = [Microsoft.Exchange.Data.Directory.AdminSessionADSettings]::Instance
    ## Reset the Default Domain
    $global:AdminSessionADSettings.ViewEntireForest = $false
    $FormatEnumerationLimit = 16

    ## PROMPT ####################################################################

    ## PowerShell can support very rich prompts, this simple one prints the current
    ## working directory and updates the console window title to show the machine
    ## name and directory.

    function prompt{
    $cwd = (get-location).Path
    $scope = "View Entire Forest"
    if (!$AdminSessionADSettings.ViewEntireForest){
    $scope = $AdminSessionADSettings.DefaultScope
    }
    $host.UI.RawUI.WindowTitle = "Machine: " + $(hostname) + " | Scope: " + $scope + " | By Alexandre Létard"
    $host.UI.Write("Yellow", $host.UI.RawUI.BackGroundColor, "[Alex's POSH]")
    " $cwd>"
    }

    ## FUNCTIONs #################################################################
     ## returns all defined functions
     function functions{
        if ( $args )    {
            foreach($functionName in $args )        {
                 get-childitem function:$functionName |
                      foreach { "function " + $_.Name; "{" ; $_.Definition; "}" }
            }
        }
        else    {
            get-childitem function: |
                 foreach { "function " + $_.Name; "{" ; $_.Definition; "}" }
        }
    }
    ## generates a tip of the day
    function get-tip{
        param($local:number=$null)

        if( ($global:exrandom -eq $null) -or ($exrandom -isnot [System.Random]))    {
            $global:exrandom = new-object System.Random
        }

        $culture = [System.Threading.Thread]::CurrentThread.CurrentUICulture.Parent

        if ( test-path "$($global:exbin)\$($culture.Name)\extips.xml" )    {
    $culture = $culture.Name
        }
        else    {
    $culture = 'en'
        }

        if (test-path "$($global:exbin)\$culture\extips.xml")    {
             $local:tips = [xml](get-content $global:exbin\$culture\extips.xml)
            if($local:number -eq $null)       {
                $local:temp = $global:exrandom.Next( 0, $local:tips.topic.developerConceptualDocument.introduction.table.row.Count )
                write-host -fore Yellow ( "Tip of the day #" + $local:temp + ":`n" )
                $local:nav = $tips.topic.developerConceptualDocument.introduction.table.row[$local:temp].entry.CreateNavigator()
                [void] $nav.MoveToFirstChild()
                do            {
                   write-host $nav.Value
                }
                while( $nav.MoveToNext() )
       ""
            }
            else        {
                $local:nav = $tips.topic.developerConceptualDocument.introduction.table.row[$local:number].entry.CreateNavigator()    
       write-host -fore Yellow ( "Tip of the day #" + $local:number + ":`n" )
          
     
                [void] $nav.MoveToFirstChild()
                do            {
                     write-host $nav.Value
                }
                while( $nav.MoveToNext() )
                ""
            }
        }
        else    {
            "Exchange tips file $($global:exbin)\$culture\extips.xml not found!"
        }

        trap    {
    continue
        }
    }


    ## only returns exchange commands

    function get-excommand{
    if ($args[0] -eq $null) {
    get-command -pssnapin Microsoft.Exchange*
    }
    else {
    get-command $args[0] | where { $_.psSnapin -ilike 'Microsoft.Exchange*' }
    }
    }

    ## only returns activerole commands

    function get-adcommand{
    if ($args[0] -eq $null) {
    get-command -pssnapin Quest.ActiveRoles*
    }
    else {
    get-command $args[0] | where { $_.psSnapin -ilike 'Quest.ActiveRoles*' }
    }
    }

    ## only returns PowerShell commands

    function get-pscommand{
    if ($args[0] -eq $null) {
    get-command -pssnapin Microsoft.PowerShell*
    }
    else {
    get-command $args[0] | where { $_.PsSnapin -ilike 'Microsoft.PowerShell*' }
    }
    }
    ## prints the Exchange Banner in pretty colors
    function get-exbanner{
    write-host -foregroundcolor RED "`n         Welcome to the Alex's Management Shell!`n"

    write-host " Full list of cmdlets:          " -no
    write-host -fore Yellow "get-command"

    write-host " Only ActiveRole cmdlets:         " -no
    write-host -fore Yellow "get-excommand"

    write-host " Only Exchange cmdlets:         " -no
    write-host -fore Yellow "get-excommand"

    ## write-host " Only Monad cmdlets:            " -no
    ## write-host -fore Yellow "get-pscommand"

    write-host " Cmdlets for a specific role:   " -no
    write-host -fore Yellow "get-help -role *UM* or *Mailbox*"

    write-host " Get general help:              " -no
    write-host -fore Yellow "help"

    write-host " Get help for a cmdlet:         " -no
    write-host -fore Yellow "help <cmdlet-name> or <cmdlet-name> -?"

    write-host " Show quick reference guide:    " -no
    write-host -fore Yellow "quickref"

    write-host " Exchange team blog:            " -no
    write-host -fore Yellow "get-exblog"

    write-host " Show full output for a cmd:    " -no
    write-host -fore Yellow "<cmd> | format-list`n"
    }
    ## shows quickref guide
    function quickref{
        $culture = [System.Threading.Thread]::CurrentThread.CurrentUICulture.Parent

        if ( test-path "$($global:exbin)\$($culture.Name)\exquick.htm" )    {
    $culture = $culture.Name
        }
        else    {
    $culture = 'en'
        }

        if ( test-path "$($global:exbin)\$culture\exquick.htm" )    {
    invoke-item $global:exbin\$culture\exquick.htm
        }
        else    {
    "Exchange quickstart guide $global:exbin\$culture\exquick.htm not found!"
        }
    }
    function get-exblog{
           invoke-expression 'cmd /c start http://go.microsoft.com/fwlink/?LinkId=35786'
    }

    ## now actually call the functions
    get-exbanner
    get-tip
    write-host -foregroundcolor GREEN "Console Powershell personnalisé (Exchange 2007 + ActiveRole)"
  5. Nouveau raccourci vers notre console.
    %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -psconsolefile "C:\Powershell\Console\MaConsole.psc1" -noexit -command ". 'C:\Powershell\Console\StartConsole.ps1'"


Toutes les sources sont mise à disposition gratuitement mais vous les utilisez sous votre propre responsabilité.

Auditer les Database et Mailbox de votre organisation Exchange 2007

0 commentaires
Il peut être utile à un moment ou a un autre de faire un petit point sur votre organisation Exchange. Ou se trouve les banques de données, quel sont les quotas par défaut, quelle est la taille des mailboxs utilisateurs. Voici une idée de départ a creusée ou adapter à votre configuration.

Suivant la taille de votre organisation, le temps d'exécution du script peut être plus ou moins long.

L'idée de ce script est de récupérer une liste de serveur ayant le rôle mailbox et exécutant Exchange 2007. Pour chaque serveur, on récupère alors les databases qui y sont stockées. Et enfin, pour chaque mailbox on récupère les stats.
Les infos collectées sont exportées dans deux fichiers, un pour les databases et un pur les mailboxs.

Le script :
# Recupération des serveurs ayant le role mailbox en Exchange 2007
$Exchange2007MailboxServer = Get-ExchangeServer | Where-Object { $_.AdminDisplayVersion.major -eq 8 -and $_.IsMailboxServer -eq $true}
write-host -Foregroundcolor GREEN "Serveur(s) avec le role de Mailbox :"
write-host $Exchange2007MailboxServer


# initialisation du resultat
$Result = @()
$ResultMailbox = @()


foreach($server in $Exchange2007MailboxServer){
$MailboxDatabaseOnServer = Get-MailboxDatabase -server $server
foreach($MailboxDatabase in $MailboxDatabaseOnServer){
$LineResult = New-Object PSObject
$LineResult | Add-Member NoteProperty -Name "MailboxServer" -Value $server.Name
$LineResult | Add-Member NoteProperty -Name "StorageGroup" -Value $MailboxDatabase.StorageGroup
$LineResult | Add-Member NoteProperty -Name "Database Name" -Value $MailboxDatabase.Name
$LineResult | Add-Member NoteProperty -Name "Edb File Path" -Value $MailboxDatabase.EdbFilePath
$LineResult | Add-Member NoteProperty -Name "Quota Warning" -Value $MailboxDatabase.IssueWarningQuota
$LineResult | Add-Member NoteProperty -Name "Quota Send" -Value $MailboxDatabase.ProhibitSendQuota
$LineResult | Add-Member NoteProperty -Name "Quota Send/Receive" -Value $MailboxDatabase.ProhibitSendReceiveQuota
$Result += $LineResult


$MailboxOndatabase = Get-Mailbox -database $MailboxDatabase.Identity
foreach($Mailbox in $MailboxOnDatabase){
$LineResultMailbox = New-Object PSObject
$LineResultMailbox | Add-Member NoteProperty -Name "Server" -Value $server.Name
$LineResultMailbox | Add-Member NoteProperty -Name "Database" -Value $MailboxDatabase.Identity
$LineResultMailbox | Add-Member NoteProperty -Name "Name" -Value $Mailbox.Name
$LineResultMailbox | Add-Member NoteProperty -Name "SamAccountName" -Value $Mailbox.SamAccountName
$LineResultMailbox | Add-Member NoteProperty -Name "Quota Defaults" -Value $Mailbox.UseDatabaseQuotaDefaults
if($Mailbox.UseDatabaseQuotaDefaults){
$LineResultMailbox | Add-Member NoteProperty -Name "Quota Warning" -Value $MailboxDatabase.IssueWarningQuota
$LineResultMailbox | Add-Member NoteProperty -Name "Quota Send" -Value $MailboxDatabase.ProhibitSendQuota
$LineResultMailbox | Add-Member NoteProperty -Name "Quota Send/Receive" -Value $MailboxDatabase.ProhibitSendReceiveQuota
}else{
$LineResultMailbox | Add-Member NoteProperty -Name "Quota Warning" -Value $Mailbox.IssueWarningQuota
$LineResultMailbox | Add-Member NoteProperty -Name "Quota Send" -Value $Mailbox.ProhibitSendQuota
$LineResultMailbox | Add-Member NoteProperty -Name "Quota Send/Receive" -Value $Mailbox.ProhibitSendReceiveQuota
}


$MailboxStats = Get-MailboxStatistics -identity $Mailbox.Identity
$LineResultMailbox | Add-Member NoteProperty -Name "Quota Status" -Value $MailboxStats.StorageLimitStatus
$LineResultMailbox | Add-Member NoteProperty -Name "Count Item" -Value $MailboxStats.ItemCount
$LineResultMailbox | Add-Member NoteProperty -Name "Total Item Size" -Value $MailboxStats.TotalItemSize
$ResultMailbox += $LineResultMailbox
}

}
}
$Result | Export-Csv "Database-Audit.csv" -notype -force -Encoding UTF8
$ResultMailbox | Export-Csv "Mailbox-Audit.csv" -notype -force -Encoding UTF8

Toutes les sources sont mise à disposition gratuitement mais vous les utilisez sous votre propre responsabilité..

samedi 20 mars 2010

Déplacement massif de boite mail avec Exchange 2007 (EMS)

0 commentaires
Le déplacement de boite mail sur Exchange 2007 est relativement bien étudié. On peut facilement déplacer une mailbox alors même que celle-ci est ouverte par un client Outlook par exemple. Dans ce cas, l'utilisateur verra apparaître brièvement un petit "Déconnecter/Connecter" dans son client messagerie. Toute fois, je conseille bien évidement de déplacer les mailbox à un moment ou les serveurs et les boites mails sont le moins sollicités (la nuit par exemple, le week-end etc..).
Si comme moi il y'a toujours du monde dans votre entreprise de 8h à 20h, alors peut-etre mieux vaut-il utiliser une tache planifiée pour le déplacement des mailbox.

J'ai écrit là un exemple de script, celui n'est surement pas le seul possible et n'est pas forcement adapté à votre architecture mais cela peu servir de point de départ.
Ce scripts récupère la liste des utilisateurs/mailbox a déplacé et le nom de la database de destination. Attention, dans la mesure du possible utiliser un fichier au format UTF8. Ensuite, il déplace les mailbox et génère un deux fichiers de logs (1 Transcript & 1 fichier maison).

Format du fichier utilisateur :


Prenom,Nom,SamAccountName,Database
Jean,Michemuche,jmichemuche,Groupe Stockage 1\Banque 1

Contenu du script :

$ScriptName = "Move-BulkMailbox"
$ScriptVersion = "1.0"

# Fichier contenant les mailbox a déplacée et l'emplacement de destination
$UsersFile = "C:\FREESHARE\BulkMoveMailbox\users.csv"

$Date = Get-Date -format "yyyyMMdd"

# Démarrage du transcript, tout ce qui se passe sur la console est reporter dans le fichier de log
Start-Transcript -path "$Date-TS.log"

# mise en place de mes logs perso
# récupération du fichier des logs s'il existe
if(! ($Logs = Get-Item "$Date.log")){
$Logs = new-item "$Date.log" -type file -force
}

# début d'écriture dans le fichier des logs
$LogsTime = Get-Date -format "dd/MM/yyyy H:mm:ss"
add-content $Logs "$LogsTime - BEGIN [$ScriptName v$ScriptVersion]"

$LogsTime = Get-Date -format "dd/MM/yyyy H:mm:ss"
add-content $Logs "$LogsTime - Import du fichier mailbox : $UsersFile"
import-csv $UsersFile foreach {
$UserPrenom = $_.Prenom
$UserNom = $_.Nom
$UserSamAccountName = $_.SamAccountName
$UserTargetDatabase = $_.Database
$LogsTime = Get-Date -format "dd/MM/yyyy H:mm:ss"
add-content $Logs "$LogsTime - $UserSamAccountName ($UserPrenom $UserNom)."
$ThisMailbox = Get-Mailbox -identity $UserSamAccountName
if(! $?){
$LogsTime = Get-Date -format "dd/MM/yyyy H:mm:ss"
add-content $Logs "$LogsTime - ERROR :: $UserSamAccountName ($UserPrenom $UserNom) does not exist."
}else{
$UserActualDatabase = $ThisMailbox.Database
add-content $Logs "$LogsTime - Déplacement de la boite mail de $UserActualDatabase vers $UserTargetDatabase"
move-mailbox -identity $UserSamAccountName -TargetDatabase "$UserTargetDatabase" -BadItemLimit 0 -confirm:$false
if(! $?){
$LogsTime = Get-Date -format "dd/MM/yyyy H:mm:ss"
add-content $Logs "$LogsTime - FAILED"
}else{
$LogsTime = Get-Date -format "dd/MM/yyyy H:mm:ss"
add-content $Logs "$LogsTime - SUSSECED"
}
}
}
$LogsTime = Get-Date -format "dd/MM/yyyy H:mm:ss"
add-content $Logs "$LogsTime - END"
Stop-Transcript
Voici le contenu de la tache planifiée :

powershell.exe -PSConsoleFile "C:\Exchange2007\Bin\exshell.psc1" -command ".'C:\FREESHARE\BulkMoveMailbox\Move-bulkmailbox.ps1'"

mardi 16 mars 2010

Récuperer la clé d'activation produit en VBS

0 commentaires
Voici un petit script VBS permetant de recuperer la clé d'activation produit de Windows 2003/XP. Localement ou par le reseau


' Trouver la clé d'activation d'un Windows à distance
' www.korben.info
If Wscript.Arguments.Count = 0 Then
strComputer = inputbox("Entrez le
nom de l ordinateur dont vous voulez la clé","Nom de l ordinateur")
if strComputer = "" then wscript.quit
Else
strCOmputer =
Wscript.Arguments.Item(0)
End If
Dim Digits (24)
Digits (0) = "B" :
Digits (1) = "C": Digits (2) = "D": Digits (3) = "F":
Digits (4) = "G":
Digits (5) = "H": Digits (6) = "J": Digits (7) = "K":
Digits (8) = "M":
Digits (9) = "P": Digits (10) = "Q": Digits (11) = "R":
Digits (12) = "T":
Digits (13) = "V": Digits (14) = "W": Digits (15) = "X":
Digits (16) = "Y":
Digits (17) = "2": Digits (18) = "3": Digits (19) = "4":
Digits (20) = "6" :
Digits (21) = "7" : Digits (22) = "8": Digits (23) = "9"
Dim HexBuf (100),
HexDigitalPID (15)
Set objReg =
GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer &
"\root\default:StdRegProv")
objReg.GetBinaryValue &H80000002,
"SOFTWARE\Microsoft\Windows NT\CurrentVersion\", "DigitalProductId", HexBuf
StartOffset = 52 : EndOffset =67
For i = StartOffset to EndOffset
HexDigitalPID (i-StartOffset) = HexBuf(i)
next
' Convertit la clé
produit codée en clé d activation
dLen = 29 : sLen = 15
KEYSTRING =""
for i=dLen-1 to 0 step -1
if ((i + 1) mod 6) = 0 then
KEYSTRING =
KEYSTRING & "-"
else
HN = 0
For N = (sLen -1) to 0 step -1
Value = ( (HN *2^8 ) Or HexDigitalPID (N))
HexDigitalPID (N) = Value \
24
HN = (Value mod 24)
next
KEYSTRING = KEYSTRING & Digits(HN)
end if
next
KEYSTRING2 = StrReverse (KEYSTRING)
WScript.Echo
KEYSTRING2

dimanche 14 mars 2010

Création massive de boite mail avec Exchange Management Shell

0 commentaires
La création de boite mail via la console graphique de management de Exchange 2007 peut devenir très fastidieuse lorsque le nombre de mailbox a crées devient conséquent. Cette création peut être totalement automatisé grâce au Exchange Management Shell (EMS). L'objectif est de crée un un fichier Excel CSV avec les informations de chaque utilisateur, de l'importer avec EMS et de crée automatiquement chaque boite mail.

Création du fichier CSV utilisateur :
Attention le fichier .csv doit etre au format UTF8 pour la compatibilité des caractères. Dans le cas contraire, certains caractères comme les caractères accentués seront mal interprété.

Prenom,Nom,UPN,SamAccountName,Password,OrganisationUnit,Database
Gérard,Menussa,gmenuva@poilpoil.com,gmevussa,P@ssWoRd,Mon_OU,Ma_Database
Création du script d'import et de création des mailbox

$UsersFile = "users.csv"
$Date = Get-Date -format "yyyyMMdd"
$Logs = new-item "$Date.log" -type file -force
add-content $Logs " - BEGIN"
add-content $Logs " - Import du fichier $UsersFile"
import-csv $UsersFile
foreach {
$UserPrenom = $_.Prenom
$UserNom = $_.Nom
$UserSamAccountName = $_.SamAccountName
$UserUPN = $_.UPN
$UserDatabase = $_.Database
$UserOrganisationUnit = $_.OrganisationUnit
$UserName = "$UserPrenom $UserNom"
add-content $Logs " - - $UserPrenom $UserNom"
$UserPasswordCrypt = ConvertTo-SecureString $_.Password -asplaintext -force
write-host $_.Nom $_.Prenom $PasswordCrypt
new-mailbox -userPrincipalName $UserUPN -name $UserName -SamAccountName $UserSamAccountName -database $UserDatabase -OrganizationalUnit $UserOrganisationUnit -Password $UserPasswordCrypt -FirstName $UserPrenom -LastName $UserNom -ResetPasswordOnNextLogon $true
if(! $?){
add-content $Logs " - - - FAILED"
}else{
add-content $Logs " - - - SUSSECED"
}
}
add-content $Logs " - END"
Ne reste plus qu'a exécuter notre script et vérifier le résultat dans le fichier de log créer par le script.

samedi 13 mars 2010

Disclaimer au login & GPO dans un domaine.

0 commentaires
Petit rappel : Le disclaimer est un message qui apparaît lors de l'identification de l'utilisateur (logonscreen).

Comme vu dans un précédent article, le disclaimer s'ajoute en modifiant la base de registre de Windows XP/Vista/7. Dans une configuration de domaine il peut être nécessaire de déployer ce disclaimer à très grande échelle dans l'entreprise.

Un petit lien pour commencer sur l'outil 'reg' qui permet la modification de la base de registre en ligne de commande. Cet outil est intègré au version de windows précédemment cité.
http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/reg.mspx?mfr=true

Pour applique ce disclaimer a tout un groupe d'ordinateur d'un domaine, il suffit de crée un script BATCH (.bat) qui utilisera le petit outil 'reg' pour modifier les deux clés legalnoticecaption & legalnoticetext. Ensuite il ne restera plus qu'a créer et appliquer une GPO sur l'OU qui contient les ordinateur cible et le tour est joué.

Voici un exemple de contenu de script BATCH:

reg add "hklm\microsoft\windows\currentversion\policies\system" /v lecalnoticecaption /v "mon titre" /f
reg add "hklm\microsoft\windows\currentversion^policies\system" /v leganoticetext /v "mon texte" /

Disclaimer avant ouverture de session Windows XP/Vista/7

0 commentaires
Voici l'astuce qui vous permetra d'ajouter un disclaimer avant le login de vos utilisateur. Cette modification de registre fonctionne pour XP/Win7/Vista

  1. Ouvrer le menu Démarer
  2. Executer regedit.exe
  3. Elever vos privilèges au rang d'admin (pour Win7 & Vista) confirmer la demande de l'UAC)
  4. Dans regedit, chercher la cle de registre HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
  5. Les clés de registre légalnoticecaption et legalnoticetext sont celle qui nous interesse.
  6. Modifier la valeur legalnoticecaption et mettre le 'label' que vous désirer pour votre message
  7. Modifier la valeur legalnoticetext et mettre votre texte.
Et voilà.

Pour supprimer ce disclaimer il suffit de remettre a vide ces clés de registre et le tour est jouer.

dimanche 28 février 2010

Création du TEKOSBLOG

0 commentaires
Voila c'est parti . . . le blog est crée je vais maintenant m'efforcer de l'alimenter avec quelques articles techniques. Ceci me permettra de centraliser mes connaissances et j'èspere les partager et vous en faire profiter.