• Script de Déploiement automatique de DNN (DotNetNuke) sur IIS

    Ah là, je dois dire que ça m'a fait me creuser les méninges quelques heures.
    Je n'étais pas du tout familier de SQL Server (encore moins en powershell)... je ne suis pas déçu :-D


    Le script déploie le CMS DNN 9.13.3 (anciennement DotNetNuke) sur Windows Server 2022, avec IIS, SQL Server Express 2019 et SSMS (mais ça c'est juste pour vous, pour la gestion à venir via l'interface graphique, puisque tout est fait en powershell durant l'installation).

    A copier/coller dans ISE, (en mode Administrateur) et à exécuter après relecture en tapant "INSTALLER.DNN"

    Il vous restera à vous connecter à http://127.0.0.1 pour initialiser DNN


    function fINSTALLER.DNN {
    
    #####################################################
    # MESSAGE D'ACCUEIL :
    
    $result = [System.Windows.Forms.MessageBox]::Show("Ce programme vous permet de déployer DNN 9.13.3 sur le Serveur Web IIS.`nIl désactivera le site web par défaut de IIS et créera un site pour DNN. `n`nL'installation dure environ 10 minutes et déploie IIS, SQL Server Express 2019, et SSMS.`n`nL'installation continue en tâche de fond par moments. `nElle ne sera terminée que lorsqu'un message vous l'indiquera clairement.`n`nVoulez-vous continuer ?", "Information", [System.Windows.Forms.MessageBoxButtons]::YesNo)
    if ($result -eq "No") {
        exit
    }
    
    #####################################################
    # INSTALLER IIS AVEC LES MODULES NECESSAIRES :
    
    # Installe IIS
    Add-WindowsFeature Web-Server
    
    # Installe les outils de gestion, y compris la console de gestion IIS
    Add-WindowsFeature Web-Mgmt-Tools
    Add-WindowsFeature Web-Mgmt-Console
    Add-WindowsFeature Web-Mgmt-Compat
    Add-WindowsFeature Web-Metabase
    
    # Installe les fonctionnalités HTTP communes
    Add-WindowsFeature Web-Default-Doc
    Add-WindowsFeature Web-Dir-Browsing
    Add-WindowsFeature Web-Http-Errors
    Add-WindowsFeature Web-Static-Content
    
    # Installe les fonctionnalités d'intégrité et de diagnostic
    Add-WindowsFeature Web-Http-Logging
    
    # Installe les fonctionnalités de performance
    Add-WindowsFeature Web-Stat-Compression
    
    # Installe les fonctionnalités de sécurité
    Add-WindowsFeature Web-Request-Monitor
    
    # Installer les outils de Développement
    Add-WindowsFeature Web-Net-Ext
    Add-WindowsFeature Web-Net-Ext45
    Add-WindowsFeature Web-ASP-Net45
    Add-WindowsFeature Web-ISAPI-Ext
    Add-WindowsFeature Web-ISAPI-Filter
    Add-WindowsFeature Web-WebSockets
    
    # Installe les fonctionnalités HTTP communes
    Add-WindowsFeature Web-Default-Doc
    Add-WindowsFeature Web-Static-Content
    
    # Installe les fonctionnalités de Santé et Diagnostics
    Add-WindowsFeature Web-Custom-Logging
    
    # Installe les fonctionnalités de Performances
    Add-WindowsFeature Web-Dyn-Compression
    Add-WindowsFeature Web-Stat-Compression
    
    # Installe les fonctionnalités de Sécurité
    Add-WindowsFeature Web-Basic-Auth
    Add-WindowsFeature Web-Filtering
    Add-WindowsFeature Web-Windows-Auth
    
    # Installe l'Authentification de base
    Add-WindowsFeature Web-Basic-Auth
    
    # Installer FastCGI
    Add-WindowsFeature Web-CGI
    
    # Redémarrer le service IIS
    Restart-Service w3svc
    
    
    ######################################################
    # SAUVEGARDER LE CONTENU DE C:\inetpub\wwwroot
    
    # Spécifiez le répertoire source et le fichier ZIP de destination pour la sauvegarde
    $sourceDir = "C:\inetpub\wwwroot"
    $backupZip = "C:\inetpub\wwwroot_backup.zip"
    
    # Crée une archive ZIP de wwwroot
    Compress-Archive -Path $sourceDir -DestinationPath $backupZip
    
    
    ######################################################
    # DESACTIVER PUIS SUPPRIMER LE SITE PAR DEFAUT :
    
    # Importe le module WebAdministration pour gérer IIS
    Import-Module WebAdministration
    
    # Arrêter le site web par défaut (généralement appelé "Default Web Site")
    Write-Host "Arrêt du site web par défaut..."
    Stop-Website -Name "Default Web Site"
    
    # Supprimer le site web par défaut
    Write-Host "Suppression du site web par défaut..."
    Remove-WebSite -Name "Default Web Site"
    
    # Supprime tous les fichiers et sous-dossiers dans C:\inetpub\wwwroot
    Remove-Item -Path "C:\inetpub\wwwroot\iisstart.htm" -Force
    Remove-Item -Path "C:\inetpub\wwwroot\iisstart.png" -Force
    
    
    ######################################################
    # TELECHARGER DNN ET L'INSTALLER DANS C:\inetpub\wwwroot
    
    # Créer le dossier temporaire C:\Temp
    New-Item -Path C:\Temp -ItemType directory
    
    # URL de téléchargement
    $url = "https://github.com/dnnsoftware/Dnn.Platform/releases/download/v9.13.3/DNN_Platform_9.13.3_Install.zip"
    
    # Chemin temporaire où le fichier sera téléchargé
    $tempPath = "C:\Temp\DNN_Platform_9.13.3_Install.zip"
    
    # Chemin vers le répertoire wwwroot
    $wwwroot = "C:\inetpub\wwwroot"
    
    # Télécharger le fichier
    Invoke-WebRequest -Uri "$url" -OutFile "$tempPath"
    
    # Décompresser le fichier gzip pour obtenir un fichier tar
    New-Item -Path "C:\inetpub\wwwroot\DNN" -ItemType directory
    Expand-Archive -Path "$tempPath" -DestinationPath "$wwwroot\DNN"
    
    
    ######################################################
    # CREER LE NOUVEAU SITE POUR DNN :
    
    # Nom du nouveau site web
    $websiteName = "DNN"
    
    # Chemin du dossier racine de DNN
    $websitePath = "C:\inetpub\wwwroot\DNN"
    
    # Port sur lequel le site sera accessible
    $websitePort = 80
    
    # Supprimer le site si il existe déjà
    if (Test-Path "IIS:\Sites\$websiteName") {
        Write-Host "Suppression du site existant..."
        Remove-WebSite -Name $websiteName
    }
    
    # Créer le nouveau site web
    Write-Host "Création du nouveau site web..."
    New-Website -Name $websiteName -Port $websitePort -PhysicalPath $websitePath
    
    # Démarrer le site web
    Write-Host "Démarrage du site web..."
    Start-Website -Name $websiteName
    
    # Afficher les informations du nouveau site web
    $siteInfo = Get-Website | Where-Object { $_.Name -eq $websiteName }
    Write-Host "Site Name  : $($siteInfo.Name)"
    Write-Host "Site ID    : $($siteInfo.ID)"
    Write-Host "Site State : $($siteInfo.State)"
    
    # Définir le nom du pool d'applications
    $applicationPool = $websiteName
    
    # Créer le pool d'applications
    New-WebAppPool -Name $applicationPool
    
    # Associer le pool d'applications au site
    Set-ItemProperty "IIS:\Sites\$websiteName" -Name applicationPool -Value $applicationPool
    
    # Obtenir l'état du pool d'applications
    Get-WebAppPoolState -Name $applicationPool | Select-Object Name, Status
    
    
    ######################################################
    # ATTRIBUTION DES DROITS AU POOL D'APPLICATION CREE
    
    $folders = @(
        "$websitePath"
    )
    
    # Notez que nous utilisons la valeur `$websiteName` pour former le nom complet de l'utilisateur "IIS APPPOOL\..."
    $users = @("IIS APPPOOL\$websiteName")
    
    foreach ($folder in $folders) {
        foreach ($user in $users) {
            # (OI)(CI)M est utilisé pour les droits de modification
            Start-Process cmd.exe -ArgumentList "/c icacls `"$folder`" /grant `"$($user):(OI)(CI)M`"" -NoNewWindow -Wait
        }
    }
    
    
    #####################################################
    # TELECHARGER ET INSTALLER SQL SERVER EXPRESS 2019
    
    # TÉLÉCHARGER SQL SERVER EXPRESS 2019
    Invoke-WebRequest -Uri https://download.microsoft.com/download/7/f/8/7f8a9c43-8c8a-4f7c-9f92-83c18d96b681/SQL2019-SSEI-Expr.exe -OutFile C:\Temp\SQL2019-SSEI-Expr.exe
    
    # INSTALLER SQL SERVER EXPRESS 2019 EN MODE SILENCIEUX
    Start-Process -Wait -FilePath "C:\Temp\SQL2019-SSEI-Expr.exe" -ArgumentList "/ACTION=Install /Q /IACCEPTSQLSERVERLICENSETERMS"
    
    
    #####################################################
    # TELECHARGER ET INSTALLER SSMS
    
    Invoke-WebRequest -Uri https://aka.ms/ssmsfullsetup -OutFile C:\Temp\ssmsfullsetup.exe
    
    # Installer SSMS silencieusement
    Start-Process -Wait -FilePath "C:\Temp\ssmsfullsetup.exe" -ArgumentList "/install /quiet"
    
    # Ajouter au PATH et recharger les variables
    # Chemin d'accès à sqlcmd
    $sqlcmdPath = "C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn"
    
    # Ajouter de manière permanente le chemin au Path
    Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value "$($env:Path);$sqlcmdPath"
    
    # Recharger les variables d'environnement :
    $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
    
    
    #####################################################
    # 
    # (7) - Fonction pour afficher le formulaire principal
    function ShowMainForm {
        param (
            [string]$dbName,
            [string]$dbUser,
            [string]$dbPassword
        )
    
        $form = New-Object System.Windows.Forms.Form
        $form.Size = New-Object System.Drawing.Size(600, 250)
        $form.Text = "Configuration de la base de données DNN"
        $form.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen
    
        $labels = @("Veuillez entrer un nom de base pour DNN:", "Veuillez entrer un nom d'utilisateur pour la base DNN:", "Veuillez entrer un mot de passe pour l'utilisateur:")
        $textBoxes = @()
    
        $y = 20
        foreach ($labelText in $labels) {
            $label = New-Object System.Windows.Forms.Label
            $label.Location = New-Object System.Drawing.Point(10, $y)
            $label.Size = New-Object System.Drawing.Size(300, 20)
            $label.Text = $labelText
            $form.Controls.Add($label)
    
            $textBox = New-Object System.Windows.Forms.TextBox
            $textBox.Location = New-Object System.Drawing.Point(420, $y)
            $textBox.Size = New-Object System.Drawing.Size(150, 20)
            $form.Controls.Add($textBox)
            $textBoxes += $textBox
    
            $y += 38
        }
    
        $okButton = New-Object System.Windows.Forms.Button
        $okButton.Location = New-Object System.Drawing.Point(250, $y)
        $okButton.Size = New-Object System.Drawing.Size(100, 30)
        $okButton.Text = "OK"
        $okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
        $form.AcceptButton = $okButton
        $form.Controls.Add($okButton)
    
        $textBoxes[0].Text = $dbName
        $textBoxes[1].Text = $dbUser
        $textBoxes[2].Text = $dbPassword
    
        $result = $form.ShowDialog()
    
        if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
            return $textBoxes[0].Text, $textBoxes[1].Text, $textBoxes[2].Text
        } else {
            return $null, $null, $null
        }
    }
    
    # (8) - Fonction pour vérifier la validité des entrées
    function CheckInputs {
        param (
            [string]$dbName,
            [string]$dbUser,
            [string]$dbPassword
        )
        if ($dbName -eq '' -or $dbUser -eq '' -or $dbPassword -eq '') {
            return 1 # code d'erreur pour les champs vides
        }
        
        if ($dbPassword.Length -lt 10) {
            return 2 # code d'erreur pour les mots de passe trop courts
        }
        
        # Ajouter d'autres vérifications ici si nécessaire
    
        return 0 # Tout est OK
    }
    
    $dbName = ''
    $dbUser = ''
    $dbPassword = ''
    
    while ($true) {
        $dbName, $dbUser, $dbPassword = ShowMainForm -dbName $dbName -dbUser $dbUser -dbPassword $dbPassword
    
        # Sortir de la boucle si l'utilisateur a annulé le formulaire
        if ($dbName -eq $null) {
            break
        }
    
        $errorCode = CheckInputs -dbName $dbName -dbUser $dbUser -dbPassword $dbPassword
    
        if ($errorCode -eq 0) {
            # Tout est OK, passez à la prochaine étape
            break
        } elseif ($errorCode -eq 1) {
            # Afficher un avertissement pour les champs vides
            ShowWarning -message "Vous ne pouvez pas laisser un champ vide."
        } elseif ($errorCode -eq 2) {
            # Afficher un avertissement pour les mots de passe insuffisamment complexes
            ShowWarning -message "Le mot de passe ne répond pas aux critères de complexité requis. Votre mot de passe doit faire au moins 10 caractères, comporter au moins un chiffre, une majuscule et un caractère spécial."
        }
    }
    
    
    #####################################################
    # CREATION DE LA BASE SQL ET DE L'UTILISATEUR PRIVILEGIE
    
    # Créer la base de données
    $sqlCreateDB = "CREATE DATABASE [$dbName];"
    sqlcmd -S localhost\SQLEXPRESS -E -Q $sqlCreateDB
    
    # Créer l'utilisateur SQL
    $sqlCreateUser = @"
    USE master;
    CREATE LOGIN [$dbUser] WITH PASSWORD = N'$dbPassword', DEFAULT_DATABASE=[dnndb], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF;
    "@
    sqlcmd -S localhost\SQLEXPRESS -E -Q $sqlCreateUser
    
    # Rendre l'utilisateur propriétaire de la base de données
    $sqlSetOwner = @"
    USE [$dbName];
    ALTER AUTHORIZATION ON DATABASE::[$dbName] TO [$dbUser];
    "@
    sqlcmd -S localhost\SQLEXPRESS -E -Q $sqlSetOwner
    
    # Mettre le mode d'authentification pour le serveur SQL en mode mixte
    Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQLServer" -Name "LoginMode" -Value 2
    
    # Redémarrer le service SQL Server pour que le changement prenne effet
    Restart-Service -Name 'MSSQL$SQLEXPRESS'
    
    
    
    #####################################################
    # RESTE A FAIRE L'INITIALISATION VIA NAVIGATEUR WEB SUR 127.0.0.1
    
    
    ######################################################
    # FIN DE L'INSTALLATION
    
    # Afficher une MessageBox
    [System.Windows.Forms.MessageBox]::Show('L''installation est terminée, DNN est accessible à l''URL http://IP-SERVEUR-CORE', 'Installation terminée')
    
    }
    New-Alias -Name INSTALLER.DNN -Value fINSTALLER.DNN

    Tags Tags : , , , , , , , , , , ,
  • Commentaires

    Aucun commentaire pour le moment

    Suivre le flux RSS des commentaires


    Ajouter un commentaire

    Nom / Pseudo :

    E-mail (facultatif) :

    Site Web (facultatif) :

    Commentaire :