mercredi 22 avril 2009

Configuration du portail : Active Directory et SQL

La partie précédente de cet article se trouve ICI !

Nous arrivons à la dernière phase du déploiement de notre portail Web : la configuration !

Biensûr, la configuration d'un portail dépend du portail lui-même mais aussi de l'environnement dans lequel il est déployé. Le sujet ici est simplement de voir certaines petites astuces en PowerShell autour d'Active Directory et de SQL !

En effet, notre portail Web a besoin d'une unité organisationnelle (OU) dans notre Active Directory afin d'y rassembler les groupes qu'il utilise (par exemple le groupe des Administrateurs du portail !) ou encore d'exécuter certaines procédures stockées de notre base de données !

Bref nous allons nous voir tout celà en détail !

La première chose est de créer notre unité organisationnelle dédiée à notre portail :

### <summary>
### Creates Web portal prerequires in Active Directory.
### </summary>
### <return>True on success, false otherwise</return>
function Configure-ADWebPortal()
{
    trap {
        Display-Info $_.Exception.Message
        $bln = $false
        continue
    }
    $bln = $true
    $CONST_GLOBAL_GRP = 2
    $CONST_UNIV_GRP = 8
    Display-Info 'Creating WebPortal Organizational Unit...'
    $objOU = [ADSI]''
    $objOU = $objOU.Create('OrganizationalUnit', 'OU=WebPortal')
    $objOU.SetInfo()
    
    Create-Group $objOU 'AdmWebPortal' 'WebPortal Administrators' $CONST_UNIV_GRP
    
    return $bln
}

La fonction Configure-ADWebPortal crée notre OU et un groupe dans celle-ci. Si vous avez suivi les formations PowerShell en vidéo, vous ne découvrez rien de neuf !

Remarquez cependant qu'ici nous avons fait une petite fonction permettant de créer un groupe Active Directory dont voici le code :

### <summary>
### Creates an Active Directory group.
### </summary>
### <param name ="objOU">The container (ADSI object)</param>
### <param name ="strName">Group's name</param>
### <param name ="strDescription">Group's description</param>
### <param name ="intGroupType">Group's type</param>
function Create-Group($objOU, $strName, $strDescription, $intGroupType)
{
    trap {
        Display-Error $_.Exception.Message
        continue
    }
    Display-Info "Creating group $strName..."
    $objGroup = $objOU.Create('Group', "CN=$strName")
    $objGroup.Put('SamAccountName', "$strName")
    $objGroup.Put('Description', "$strDescription")
    $objGroup.Put('GroupType', $intGroupType)
    $objGroup.SetInfo()
}

Afin de pouvoir tracer d'éventuels problèmes, nous ajoutons des appels à nos fonctions affichant et loggant les informations.

Dans notre exemple, le groupe créé est Universel. Pourquoi ? Peut-être que nous en ferons une liste de diffusion sous Exchange 2007 (très) prochainement...

C'est très bien, nous avons réussi à créer des objets Active Directory, à exécuter des scripts SQL... et maintenant ?

Nous allons modifier en masse et à la volée notre Active Directory et notre base de données ! En effet, le but de la prochaine fonction va être simple :
  • Récupération de toutes les OU dont le nom est normé d'une certaine manière
  • Création d'un groupe dans chacune de ces OU
  • Insertion du nom de l'OU traitée dans notre base de données en exécutant une procédure stockée !

### <summary>
### Synchronizes SQL database and Active Directory.
### </summary>
### <param name="objSQL">SQL connection object</param>
### <return>True on success, false otherwise</return>
function Synchronize-ADAndSQL($objSQL)
{
    trap {
        Display-Error $_.Exception.Message
        $bln = $false
        continue
    }
    $CST_GLB_GRP = 2
    $bln = $true
    $objEntry = [ADSI]''
    Clean-Database $objSQL
    foreach ($obj in $objEntry.psbase.Children) {
        if ($obj.Name.Value -match "^(\w+\d+)_(\w+)$") {
            $strFullName = $matches[0]
            $strCode = $matches[1]
            $strName = $matches[2]
            $strDN = $obj.psbase.Properties.DistinguishedName.Value
            Display-Info "OU $strFullName discovered"
            $strGroupName = "$strCode" + '_Administrators_WebPortal'
            Create-Group $obj "$strGroupName" "Admins for $strCode" $CST_GLB_GRP

            $objAdapter = New-Object Data.SqlClient.SqlDataAdapter
            $objAdapter.SelectCommand = New-Object Data.SqlClient.SqlCommand
            $objAdapter.SelectCommand.Connection = $objSQL
            $objAdapter.SelectCommand.CommandText = '[PR_ADDOU]'
            $objAdapter.SelectCommand.CommandType =
                [Data.CommandType]::StoredProcedure

            $objSqlParam = Build-SQLParam '@OUCode' $strCode
            [void]$objAdapter.SelectCommand.Parameters.Add($objSqlParam)
            $objSqlParam = Build-SQLParam '@OUName' $strName
            [void]$objAdapter.SelectCommand.Parameters.Add($objSqlParam)
            $objSqlParam = Build-SQLParam '@OUDN' $strDN

            $objAdapter.SelectCommand.ExecuteNonQuery() | Out-Null
        }
    }
    
    return $bln
}

Le nom des OU est formatté en deux parties : un code et le nom de l'OU séparés par le caractère '_'. Notre procédure stockée nommée PR_ADDOU prend en paramère ces informations et est exécutée : un bon moyen de séparer les traitements ; si le traitment côté SQL est modifié, le script PowerShell ne l'est pas !

Ce petit Solution Accelerator de déploiement d'un portail Web n'est biensûr qu'un exemple mais grâce à lui, nous avons vu un cas pratique d'automatisation !

Aucun commentaire:

Enregistrer un commentaire