• Windows Server

    Bienvenue sur la page consacrée à Windows Server.

    Vous trouverez :

    Installation 
    Rappels - Installation de Windows Server  
    Supprimer la partition de récupération (recovery) 
    Configuration réseau en lignes de commande 
    - Ajouter un poste Windows à un domaine Active Directory (ADDS) 
    - Raccourcis et commandes utiles 
    Compresser des fichiers/dossiers avec l'invite de commande 
    Activer Windows Photo Viewer (visionneuse d'images) dans Windows Server 2022 
    Installer le Windows Store sur Windows Server 2022
    - Formater un disque dur/clef USB non reconnu 
    - Supprimer la limitation de longueur des noms de fichiers
    - Autoriser l'accès en RDP à une VM Hyper-V sans autoriser la connexion à la session utilisateur et générer un fichier rdp 
    Configurer FileZilla comme logiciel par défaut pour le protocole FTP 
    Les licences CAL.. indispensables ! 
    Ajouter l'option "Compress to .zpaq (normal)" au menu contextuel (clic-droit) de Windows 
    Faire fonctionner les trackpad ELANTECH sous Windows Serveur 2022

    Windows Server 2022 Core
    - Installer le rôle ADDS, promouvoir en contrôleur, créer une forêt + outils RSAT
    - Installer Windows Admin Center sur un serveur Windows en mode Core (Powershell)

    - Installer les outils sysinternals sur un serveur Windows en mode Core (Powershell)
    - Installer SSH serveur (pour pouvoir se connecter en SSH à votre Serveur)
    Activer le WiFI sur Windows Server (à vos risques et périls)

    Désactiver les MAJ automatiques avec SConfig
    Gérez les MAJ via PowerShell 
    - Exécuter un .msi en PowerShell

    - Installer le rôle Windows Server Backup en powershell 
    - Créer un utilisateur Local et l'ajouter à un groupe Local en powershell

    Créer un utilisateur AD en PowerShell
    Supprimer un utilisateur AD en PowerShell
    Supprimer tous les utilisateurs d'un AD en PowerShell (!)
    - Créer/Afficher/Supprimer une OU (Unité d'Organisation)
    Créer un utilisateur AD en PowerShell
    - Supprimer tous les utilisateurs d'une OU
    Script PowerShell-CSV : Créer tous les utilisateurs à partir d'un fichier .csv
    - Script PowerShell-CSV : Créer tous les utilisateurs et les OU en même temps, à partir d'un fichier .csv
    Supprimer tous les utilisateurs d'un AD en PowerShell (!)
    - Créer/Afficher un Groupe Global. Ajouter des membres
    - Créer/Afficher un Groupe Domaine Local. Ajouter des Groupes Globaux
    - Créer des alias de commandes. Créer un module d'alias de commandes
    - Créer/afficher/Supprimer un dossier partagé, accorder les droits à des DL/Utilisateurs
    - Mettre en place un redirecteur DNS vers dns0.eu (ou autre)
    - Créer un pool de disques, un disque virtuel, et une partition unique montée
    - Obtenir la taille de tous les éléments d'un dossier automatiquement
    - Installer Java Runtime en Core
    - Installer OpenFire (serveur XMPP) sur Windows 2022 Core 
    Configurer simplement un serveur XMPP avec des salons de discussion avec Openfire
    - Installer Vagrant sur un serveur en Core 
    Installer Mariadb 10.11.5 sur Windows Server 2022 et le gérer en CLI, comme sur Linux/FreeBSD 
    Installer SQL Server Express 2019 via PowerShell 
    Créer un espace de stockage redondant et encrypté sur Windows Serveur 2022 Core 
    Se connecter à un serveur Windows 2022 Core 
    Désactiver le lancement automatique de sconfig sur Windows Server Core 
    Connaître l'utilisation de la RAM et de charge CPU sur Windows Server Core
    Faire un partage SMB propre 
    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022 
    Mettre en place un stockage distribué avec S2D et Cluster de basculement en Core 
    Bloquer une IP en entrée sur le pare-feu Windows

    AGDLP 
    Créer un utilisateur AD en PowerShell

    Supprimer un utilisateur AD en PowerShell
    Supprimer tous les utilisateurs d'un AD en PowerShell (!)
    Supprimer une Unité d'organisation protégée 
    Effectuer une réservation d'IP pour une imprimante 
    - Blocages des périphériques sur les clients
    - Création de profil(s) itinérant(s)

    Cluster
    Cluster de basculement Windows Server 2022  
    Cluster de basculement Hyper-V

    Administration et sécurité
    Commandes PowerShell de base pour Windows Server (Core)  
    Créer une Stratégie de Mot de passe affinée (FGPP) dans l'AD 
    Ouvrir/fermer le Ping dans le Pare-feu (créer une règle) 
    Appliquer un quota (limite de taille) à un dossier
    - Lancement automatique d'une application au démarrage 
    Transformer votre Windows en un pare-feu avancé, avec serveur DHCP, DNS etc.. avec WinGate  
    Configurer un VPN L2TP/IPsec de site à site sur Windows Serveur 2022 
    Mettre en place une sauvegarde des données avec Robocopy 
    Ecrire un script en batch pour se connecter en SSH plus rapidement

    Hyper-V
    Installer Hyper-V via PowerShell 
    Rappels avant Installation Hyper-V  
    Cluster de basculement Hyper-V
    Arrêter une VM de force 
    Hv-Manager : un gestionnaire Hyper-V Web
    Avoir Hyper-V et VirtualBox en même temps sur Windows Server 2022

    - Monter un serveur Hyper-V basique avec Windows Server en mode Core et WAC
    Convertir des VM .ova en .vhdx pour Hyper-V, dans Windows Server
    Petits conseils d'ami AVANT de créer des VMs sur Hyper-V 
    Activer le mode de session étendue pour les VM de type Windows (guest-additions)
    Cluster de Basculement Windows Server 2022
    Convertir des VM .ova en .vhdx pour Hyper-V, dans Windows Server  
    Installer Proxmox dans Hyper-V
    - Convertir un disque dur dynamique en fixe et réciproquement 
    Créer un NAT utilisable par Hyper-V 

    Activer la virtualisation imbriquée dans une VM (nested VM)
    !!! - Cas Particulier : Installation d'ESXI dans une VM d'Hyper-V !!! 
    Caractères Spéciaux dans les VMs Hyper-V  
    Se connecter à un serveur Hyper-V à distance, depuis un poste client

    XAMPP / Nginx
    Installer le CMS ZwiiCMS 
    Déployer Nginx et PHP sur Windows Server 2022

    Wingate 
    Transformer votre Windows en un pare-feu avancé, avec serveur DHCP, DNS etc.. avec WinGate 
    Utiliser le plugin Kaspersky pour scanner le trafic réseau avec Wingate 
    Scanner le trafic HTTP et HTTPS grâce au proxy et à Kasperky 
    Utiliser le Serveur Web intégré de Wingate (avec PHP) pour installer un CMS

    IIS
    Installer la stack WIMP (LAMP version Windows) (Windows Iis Mariadb Php) 
    Installer GLPI sur IIS  
    Script de déploiement automatique de GLPI 10.0.15 sur IIS 
    Script de Déploiement automatique de Wordpress 6.5.3 sur IIS 
    Script de Déploiement automatique de Concrete 9.3.2 sur IIS 
    Script de Déploiement automatique de DNN 9.13.3 (DotNetNuke) sur IIS
    Installer FusionInventory sur GLPI
    Installer Wordpress sur IIS 

    Installer Concrete sur IIS
    Créer et exporter une base SQL MariaDB avec HeidiSQL

     

    Serveur de fichiers :
    Mettre en place un serveur SFTP avec Bitvise
    - Stockage décentralisé avec Storj, créer un stockage et monter le volume 
    Créer un script permettant d'afficher toute l'arborescence (équivalent de tree sous Linux/BSD)

  • Une véritable plaie !

    Il est souvent difficile d'utiliser Windows Serveur sur un ordinateur portable en raison de bugs stupides avec les drivers.. notamment ceux des trackpad !

    Pire encore, le matériel n'est même pas reconnu...

    Si vous avez déjà installé windows 11 ou 10 sur votre PC portable et que le trackpad fonctionne sur ces versions, un petit tour dans le gestionnaire des périphériques vous apprendra qu'il s'agît du pilote :
    "Périphérique I2C HID" dans "Périphériques d'interface utilisateur".

    Ce pilote est lié à 2 fichiers principaux : 
    - C:\Windows\System32\drivers\hidi2c.sys
    - C:\Windows\INF\hidi2c.inf

    D'où vient donc le problème sur Server ?
    Du fichier hidi2c.inf ! Il doit être corrigé avant de procéder à l'installation du driver sur Windows Serveur 2022.
    Et c'est là que les ennuis commencent.. Vous le savez très bien, installer un driver "non signé" sur Windows est rebutant.

    Il y a plusieurs méthodes, notamment une qui permet de modifier directement le fichier dans l'installeur de windows serveur... Suffit de décompresser l'ISO, trouver les fichiers, les modifier etc...

    En voici une qui passe par windows 10 ou 11 pour récupérer les fichiers.

    Je vous fournis directement les fichiers pour procéder à l'installation.
    (Voir plus bas pour comprendre comment je m'y suis pris)

    Téléchargez-les et placez les sur le bureau directement.

    Télécharger « hidi2c.inf »

    Télécharger « hidi2c.sys »

    Télécharger « Microsoft-Windows-Client-Desktop-Required-Package05110~31bf3856ad364e35~amd64~~10.0.22621.4036.cat »

     

    Pour installer le driver, il vous faut redémarrer votre ordinateur en maintenant la touche majuscule enfoncée.
    Vous devez arriver sur l'écran des options de démarrage avancé.
    Cliquez alors sur "Dépannage" puis "Paramètres", l'ordinateur va redémarrer.

    Un invite s'ouvre alors et vous propose plusieurs options de démarrage, choisissez "Désactiver le contrôle obligatoire des signatures de pilotes". L'ordinateur va redémarrer.

    Une fois redémarré, ouvrez un invite de commande, dirigez-vous vers le lieu où vous avez stocké les 3 fichiers (cd Desktop - logiquement) et tappez :

    pnputil /add-driver .\hidi2c.inf /install

    Validez le message d'avertissement, votre trackpad se met alors à fonctionner instantanément.

    Redémarrez pour sortir du mode de signature désactivé !

     

    Comment faire pour récupérer ces fichiers : 
    Je l'ai fait à partir d'une installation de windows 11 pro où le driver était fonctionnel (le trackpad marchait), mais ça fonctionne aussi bien à partir de windows 10.

    Voici les étapes :

    1) Installer Windows 10 ou 11 sur votre ordinateur portable. Votre trackpad doit être fonctionnel avant de continuer.
    2) Localiser hidi2c.sys sur votre système (pour moi sur W11 pro, c'est C:\Windows\System32\drivers\hidi2c.sys)
    3) Localiser hidi2c.inf sur votre système (pour moi sur w11 pro, c'est C:\Windows\INF\hidi2c.inf)
    3) Télécharger les outils sysinternals sur votre bureau et dézippez le dossier.
    4) Ouvrez un invite de commandes et rendez-vous dans le dossier des sysinternals.
    5) Localisez à présent le fichier de catalog du driver hidi2c en tappant :

    sigcheck.exe -i C:\WINDOWS\System32\drivers\hidi2c.sys

    (Validez l'utilisation de sigcheck quand la fenêtre s'ouvre puis attendez 15/20 secondes que les résultats s'affichent sur l'invite de commandes.)

    Vous devriez voir une ligne du genre : 
    Catalog: C:\WINDOWS\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\Microsoft-Windows-Client-Desktop-Required-Package05110~31bf3856ad364e35~amd64~~10.0.22621.4036.cat

    ça y est, nous l'avons trouvé !

    6) Créer un dossier sur votre bureau, le nommer "trackpad" et y placer une copie des 3 fichiers :
    - C:\Windows\System32\drivers\hidi2c.sys
    - C:\Windows\INF\hidi2c.inf
    - C:\WINDOWS\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\Microsoft-Windows-Client-Desktop-Required-Package05110~31bf3856ad364e35~amd64~~10.0.22621.4036.cat

    7) Clic-droit sur hidi2c.inf, modifier. Le bloc-note s'ouvre.
    - Modifiez la ligne 41 (ou 42, c'est selon) :
    %MSFT%=Microsoft,NTamd64...1

    Vous devez supprimer "...1" et obtenir :
    %MSFT%=Microsoft,NTamd64

    - Modifiez également la ligne 43 (ou 44) :
    [Microsoft.NTamd64...1]

    idem "...1" :
    [Microsoft.NTamd64]

    - Enregistrer et fermer.

    8) Copier le dossier "trackpad" sur une clef USB.

    ça y est, nous en avons terminé avec windows 10/11, nous pouvons basarder l'installation et passer à windows serveur 2022.

    (évidemment, il vous faudra une souris externe en attendant d'installer le driver)... Ensuite, il suffit simplement de procéder à l'installation du driver comme décrite précedemment.


    votre commentaire
  • Parfois, un simple fichier sur le bureau est plus rapide pour se connecter directement à un serveur via SSH.
    Voici comment faire.

    Créer un nouveau fichier "monserveur.bat", cliquer-droit dessus, "Modifier", logiquement il s'ouvre avec notepad.
    Insérer le code ci-dessous en l'adaptant à votre serveur distant à contacter.

    @echo off
    set SERVER_USERNAME=monutilisateurdistant
    set SERVER_IP=192.168.99.99
    set SERVER_PORT=22
    
    ssh %SERVER_USERNAME%@%SERVER_IP% -p %SERVER_PORT%

    Une fois fait, enregistrez le fichier, puis double-cliquez dessus...
    Un invité de commande se lance directement et exécute la commande de connexion SSH.
    Pour peu que vous ayez configuré la connexion par clef SSH, vous êtes instantanément connectés.


    votre commentaire
  • J'ai lu et vu pas mal de bêtises ici et là sur ce sujet, donc il était temps de réagir.

    L'objectif est simple : vous disposez d'un Serveur Windows 2022 avec le rôle Hyper-V déployé dessus.
    Et plutôt que de gérer vos VM directement depuis le serveur, vous souhaitez naturellement pouvoir le faire depuis votre poste client windows 11.

    Pré-requis :
    - Hyper-V est installé et prêt à l'emploi sur le serveur Windows
    - Hyper-V, ou a minima la console d'administration hyper-v, est installée sur le Client.
    - Pour ce tuto, le serveur ET le client ne sont pas dans un domaine AD (c'est plus simple sinon) mais sont néanmoins sur le même réseau (ou peuvent se joindre sans entrave du type pare-feu... sinon il y aura des règles à créer)
    - Sur le client, vous aurez ajouté une correspondance entre l'IP du serveur et son hostname dans le fichier hosts pour plus de commodité.

    Rappels :
    - Pour installer Hyper-V sur un Client Windows 11, aller dans "Activer ou désactiver des fonctionnalités Windows", cocher Hyper-V, cliquez sur OK et redémarrez votre machine. Evitez la présence de plusieurs hyperviseurs différents sur votre machine.
    - Si vous faîtes un labo de test avec un serveur Hyper-V et un client pour tester cette procédure, n'oubliez pas d'activer la virtualisation imbriquée pour ces VM avec Hyper-V ! Autrement vous ne pourrez pas installer Hyper-V !
    - Pour ajouter une correspondance IP - hostname sur un poste windows, vous devez ouvrir le bloc-note en mode Administrateur puis, fichier, ouvrir et naviguer jusqu'à C:\Windows\System32\Drivers\etc, là, à la place de "Fichiers texte (*.txt) dans le menu déroulant en bas à droite, sélectionnez "Tous les fichiers (*.*)", le fichier hosts apparaît.
    Ouvez-le et ajoutez la correspondance tout en bas, du type : 192.168.149.13     SERVEUR. Enregistrez et fermez le fichier.

    Nous allons d'ailleurs considérer pour cet exercice que le serveur Hyper-V s'appelle "SERVEUR".

     

    Première étape : passage en réseau privé pour le serveur ET le client
    Cette étape n'est pas nécessaire dans le cas où le(s) serveur(s) Hyper-V et le client sont membres d'un domaine AD.

    Sur le serveur, puis sur le client, effectuez la même opération ci-dessous :
    (Lancer PowerShell en mode Administrateur)

    - Repérer l'index de votre interface réseau :

    Get-NetConnectionProfile

    (Pour l'exemple, nous allons prendre le 10)

    - Passer en Private :

    Set-NetConnectionProfile -InterfaceIndex 10 -NetworkCategory Private

     


    Deuxième étape : Autoriser les connexions PowerShell distantes et définissez les rôles CredSSP
    (Activer simplement Enable-PSremoting sur le(s) serveur(s) Hyper-V et lancer le service WinRM sur le client dans le cas les machines sont membres d'un domaine AD)

    Sur le serveur : 

    Enable-PSRemoting
    Enable-WSManCredSSP -Role Server 

     

    Sur le client : lancez WinRM et ajouter le serveur Hyper-V à la liste des machines de confiance

    Start-Service WinRM
    Set-Item WSMan:\localhost\Client\TrustedHosts -Value "SERVEUR"

    # répondez [O] Oui

    Enable-WSManCredSSP -Role Client -DelegateComputer "SERVEUR"

     


    Troisième étape : Autoriser la délégation de nouvelles informations d'identification de serveur NTLM
    (cette étape n'est pas non plus nécessaire dans le cas d'un AD)

    Sur le client :

    gpedit.msc

    Allez dans :
    - Configuration Ordinateur
    --- Modèles d'administration
    ------ Système
    --------- Délégation d'informations d'identification
    ------------ Autoriser la délégation de nouvelles informations d'identification de serveur NTLM uniquement
    --------------- Activer, puis cliquer sur "Afficher" et entrez la valeur suivante dans la première ligne : wsman/SERVEUR

    La configuration est terminée !
    A présent, lancer le gestionnaire Hyper-V sur le client, "se connecter au serveur...", entrer "SERVEUR" puis "se connecter en tant qu'autre utilisateur..."

    Attention, vous devez indiquer le nom d'un utilisateur créé SUR LE SERVEUR WINDOWS pour pouvoir vous connecter à la console Hyper-V. Cet utilisateur doit par ailleurs être membre des 2 groupes suivants :
    - "Administrateurs Hyper-V"
    - "Utilisateurs de gestion à distance"
    et d'aucun autre groupe !!
    Cela permet de ne donner accès QU'A hyper-V sur le serveur !
    L'utilisateur ne peut ainsi pas se connecter à une session RDP par exemple.

    Pour entrer le nom de l'utilisateur, on précise le nom NETBIOS du serveur devant le nom de l'utilisateur :
    SERVEUR\utilisateur-du-serveur
    Mot-de-passe

     

    Petit encart concernant les gestionnaires de cluster de basculement avec AD.
    Si vous souhaitez vous connecter à un gestionnaire de cluster de basculement Hyper-V (mettons que vous avez monté un tel cluster) afin de pouvoir gérer les VM, à ma connaissance, il n'est pas possible d'y parvenir en créant un utilisateur AD et en l'ajoutant aux groupes mentionnés plus haut. Cette technique ne fonctionne que dans le cas où il n'y a pas d'AD.
    Il faut normalement ajouter une autorisation dans les propriétés du cluster de basculement pour l'utilisateur que l'on veut... sauf que ça ne fonctionne pas !
    A creuser donc.
    Néanmoins, il est tout à fait possible de se connecter au gestionnaire du cluster depuis un poste client grâce aux outils RSAT et au gestionnaire de cluster inclu.. en l'ouvrant en mode Administrateur !


    votre commentaire
  • On peut créer un petit script en batch pour générer un fichier "index.txt" dans lequel se trouvent tous les fichiers et dossiers depuis l'emplacement du script.
    On créée un fichier tree.bat, on clique droit dessus, Modifier.. et on copie/colle ce qui suit :

    @echo off
    REM Script pour générer un fichier d'index contenant toute l'arborescence de dossiers et de fichiers

    REM Définir le nom du fichier d'index
    set INDEX_FILE=index.txt

    REM Changer le codage de la console en UTF-8
    chcp 65001

    REM Obtenir la date et l'heure actuelles
    for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /value') do set datetime=%%I
    set CURRENT_DATE=%datetime:~6,2%-%datetime:~4,2%-%datetime:~0,4%
    set CURRENT_TIME=%datetime:~8,2%:%datetime:~10,2%:%datetime:~12,2%

    REM Écrire la date et l'heure en haut du fichier d'index
    echo Index généré le %CURRENT_DATE% à %CURRENT_TIME% > %INDEX_FILE%
    echo. >> %INDEX_FILE%

    REM Fonction pour lister les fichiers et dossiers récursivement
    call :list_files "%cd%" >> %INDEX_FILE%

    REM Afficher un message de confirmation
    echo L'arborescence des dossiers et fichiers a été générée dans %INDEX_FILE%

    REM Pause pour garder la fenêtre ouverte
    pause
    exit /b

    :list_files
    setlocal enabledelayedexpansion
    set "current_dir=%~1"
    echo !current_dir!
    for /f "delims=" %%i in ('dir /b /a "%current_dir%"') do (
    set "item=%%i"
    echo !current_dir!\!item!
    if exist "!current_dir!\!item!\" (
    call :list_files "!current_dir!\!item!"
    )
    )
    endlocal
    exit /b



    Il suffit de double-cliquer sur le fichier.. et hop, le fichier index.txt est généré, avec toute l'arborescence à partir de l'emplacement du script.


    votre commentaire
  • L'idée ici, c'est de mettre en place un espace de stockage distribué avec S2D.
    (un volume D: par exemple, qui hébergera des partages pour des utilisateurs, ou des VM ou autre...).
    Les données sont ainsi recopiées sur plusieurs serveurs simultanément. 

    En plus de cela, nous allons mettre en place la tolérance aux pannes avec un cluster de basculement.
    Si l'un des serveurs du cluster tombe, un autre noeud doit prendre le relai et les données doivent ainsi être automatiquement disponibles à nouveau. (En gros, le volume D: doit remonter sur un autre serveur).

    Les usagers ne voient généralement rien (peut-être une coupure de quelques secondes... et encore).

    Pour utiliser S2D, il faut 2 serveurs minimum, 16 au maximum. 

    Chaque serveur doit disposer d'au moins 3 supports de stockage : 
    - un pour le système

    - au moins 2 autres pour S2D (ça ne fonctionnera pas si vous ne disposez que d'un seul support de stockage pour S2D)

     

    S2D est relativement facile à mettre en place sur des VM sous Hyper-V (dans des conditions "basiques" car on est vite bloqués côté perfs), mais est beaucoup plus complexe à mettre en place sur du matériel physique.
    La liste des serveurs officiellement compatibles avec S2D peut être consultée sur le catalogue microsoft officiel, et il faut bien s'assurer que le matériel a en plus (des certifications microsoft) la certification SDDC (standard ou premium).

    On peut toujours tricher si le matériel n'est pas compatible (faire passer des disques de montage RAID ou autre pour des SAS etc..), mais souvent au prix de nombreuses heures de recherche et de trituration du registre, et ce n'est pas garanti par microsoft en cas de pépin.

     

    Techniquement, S2D n'est pas vraiment conçu pour du "virtuel", mais bien pour du matériel physique... et c'est un petit problème.

    Bien qu'il s'agisse d'une solution fiable et évolutive, elle soulève (tout du moins chez moi) des inquiétudes :

    1) Le niveau d'abstraction et de complexité pour la restauration des données est un vrai soucis.. De plus, l'utilisation du flash a ses limites dans le temps... Gare à vous donc, si ne prenez pas immédiatement soin de remplacer l'unité de stockage défaillante, les pertes seraient catastrophiques à une vitesse folle.

    2) La configuration sur du matériel physique est infiniment plus complexe que ce que nous allons voir ici.. Sur du physique, il faut gérer les disques dits de capacité (stockage) et les disques de cache... Il y a des contraintes à respecter dans tous les sens ! Sans parler de la configuration du cluster de basculement, qui lui aussi exigera des disques pour le quorum etc...

    Restons simple donc pour cette première approche : au diable le quorum et le cache pour commencer !

     

    POUR CHACUN DE NOS 3 SERVEURS (futurs nœuds de notre cluster) :
    - 1 support de stockage pour le système (stockage dynamique de 127Go par défaut sur Hyper-V, ça convient très bien)

    - 2 (au moins) supports de stockage pour le stockage S2D (stockage dynamique de 200Go (ou 150Go) sur Hyper-V. Nous avons besoin d'une taille différente de celle du disque système pour plus de commodité)

     

    Notez que sur du matériel physique, les supports de stockages dévolus à S2D doivent être les mêmes modèles, même marque ! ça évite quelques ennuis.

    ----------------------------------------------------------------------------------------------

    On commence !

     

    Soient 6 ordinateurs : "C1", "C2", "C3", "DC", "CLIENT" et "PAREFEU"
    - C1 est un serveur Windows 2022 Datacenter Desktop/Core

    - C2 est un serveur Windows 2022 Datacenter Desktop/Core
    - C3 est un serveur Windows 2022 Datacenter Desktop/Core
    - DC est un serveur Windows 2022 Datacenter Desktop/Core
    - CLIENT est un client Windows 11 Pro
    - PAREFEU est un pare-feu IpFire/Pfsense/OPNsense... ce que vous voulez, on s'en fiche.

    Les conditions et pré-requis :
    - C1 n'a qu'une seule interface réseau et a pour IP : 10.10.10.110

    - C2 n'a qu'une seule interface réseau et a pour IP : 10.10.10.120
    - C3 n'a qu'une seule interface réseau et a pour IP : 10.10.10.130
    - DC n'a qu'une seule interface réseau et a pour IP : 10.10.10.200
    - CLIENT n'a qu'une seule interface réseau et a pour IP : 10.10.10.10
    - PAREFEU n'a qu'une seule interface réseau et a pour IP : 10.10.10.1

    - Dans les paramètres des ordinateurs nœuds (C1, C2 et C3) vous devez désactiver la mémoire dynamique et attribuer au moins 2 cœurs CPU virtuels.
    (Suivant la puissance de votre hôte, il faudra sûrement raquer un peu côté RAM sur les serveurs Windows... (Ou bien, faîtes des nœuds en Core !))

    - Tous ces ordinateurs sont sur le réseau ("LAN") 10.10.10.0/24 et peuvent communiquer entre eux (ping)
    - Leurs mises-à-jour sont faîtes.

    - La passerelle du réseau "LAN" vers internet est l'ordinateur PAREFEU, grâce à l'interface ayant pour IP 10.10.10.1
    - DC est un contrôleur de domaine sur la forêt "MONDOMAINE.LAN", on peut éventuellement s'en servir pour gérer le cluster.. mais ce n'est pas indispensable.
    - Tous les ordinateurs, à l'exception de PAREFEU, sont membres du domaine MONDOMAINE.LAN géré par DC

    C'est un pré-requis, comme l'adressage IP et les Hostname... oui, la préparation est longue dès qu'il s'agît de faire un truc sur Windows.

    Un utilisateur Active Directory "marcel.dublog" a été créé sur DC
    "marcel.dublog" peut donc se connecter depuis l'ordinateur CLIENT.

    A l'issue du tuto, je vous laisserai créer un partage SMB pour cet utilisateur, stocké sur le volume S2D créé, afin qu'il puisse stocker ses données, et vous pourrez alors bousiller un nœud pour voir ce qui se passe.

    ------------------------------------------

    La configuration d'S2D est particulièrement intolérante aux errements.

    Suivez chaque étape.

     

    ################################
    # ETAPE 0 : 

     

    1) On active l'usurpation d'adresses MAC dans les paramètres des VM pour C1, C2 et C3.
     Dans les paramètres des VM, déroulez les spécificités de la carte réseau, vous trouverez l'option à cocher.

    2) On active la virtualisation imbriquée pour C1, C2 et C3
    Pour rappel, sur l'hôte Hyper-V, on éteint toutes les VM, on ouvre PowerShell en tant qu'Administrateur puis on recherche les VM et on applique :

    Get-VM

    - Activer la virtualisation imbriquée sur toutes les VM :

    $vmNames = @("C1", "C2", "C3")

    - Parcourir chaque VM et activer l'extension de virtualisation

    foreach ($vmName in $vmNames) {
        Set-VMProcessor -VMName $vmName -ExposeVirtualizationExtensions $true
    }

    3) Tout au long de la configuration, on se logue en tant qu'Administrateur du domaine sur toutes les machines pour plus de commodité : MONDOMAINE\Administrateur

    Pour ceux qui feront la configuration via PowerShell, on le lance également en tant qu'Administrateur sur toutes les machines.

     

    Je considère que C1, C2, C3 et CLIENT sont déjà dans le domaine, que leurs noms d'hôtes sont bons, leur configuration IP aussi et que les disques supplémentaires pour S2D ont bien été créé et ajouté sur les nœuds Cx

     

     

    ################################
    # ETAPE 1 : 

    Sur C1, C2 et C3, Installer :
    - le rôle Hyper-V 

    - le rôle de serveur de fichier (logiquement, c'est déjà coché sur DC puisque vous avez l'AD)
    - la fonctionnalité de cluster de basculement

    # En PowerShell, ça donne :

    Install-WindowsFeature -Name Failover-Clustering, FS-FileServer -IncludeManagementTools
    Install-WindowsFeature -Name Hyper-V -IncludeManagementTools -Restart

     

    ################
    # ETAPE 2 : 

     

    Sur C1, Aller dans le gestionnaire de serveurs, Outils, gestionnaire de cluster de basculement :
    - Créer le cluster en passant toutes les étapes de validation ET DECOCHER LA CASE AJOUTANT TOUT LE STOCKAGE DISPONIBLE AU CLUSTER !!

    - Donner au cluster le nom de "S2DCluster" et l'IP : 10.10.10.210

    # En PowerShell, ça donne :

    Test-Cluster -Node C1,C2,C3
    New-Cluster -Name S2DCluster -Node C1,C2,C3 -NoStorage -StaticAddress 10.10.10.210

     

    Sur C1, Activer S2D :
    - Là par contre, pas le choix, c'est en PowerShell :

    Enable-ClusterS2D

    (répondre "O" - Oui)

    Un message vous annonce qu'aucun disque pour le cache n'est trouvé sur aucun nœud, c'est normal, et on ne peut rien y faire avec des VM Hyper-V (à ma connaissance.. mais je serais ravi qu'on m'expliquer comment faire... ni le marquage comme disque Journal ou le forçage n'ont fonctionné chez moi)

    Un pool S2D, regroupant tous nos supports de stockages dévolus à S2D a été créé.
    Il faut maintenant créer un disque virtuel sur ce pool, puis un volume.

     

    Sur C1, créer le disque virtuel sur le Pool créé.
    Aller dans le gestionnaire de serveurs, cliquer sur Services de fichiers et de stockage, Pools de Stockage, Clic-droit sur notre pool S2D, Nouveau disque virtuel.
    - Le nommer "S2D_VDISK"

    - Choisissez le miroir et une recopie triple (puisqu'il y a 3 serveurs).
    Parfois l'assistant de création d'un volume se lance, parfois pas, si ce n'est pas le cas, aller dans Disques, clic-droit sur le disque, Nouveau Volume, le nommer "DATA_S2D" ou "PARTAGES_S2D" ...
    Le volume se monte.

    # En PowerShell, ça donne : 
    - Créer le disque virtuel S2D_VDISK

    New-VirtualDisk -StoragePoolFriendlyName "S2D on S2DCluster" -FriendlyName "S2D_VDISK" -ResiliencySettingName Mirror -NumberOfDataCopies 3 -UseMaximumSize -ProvisioningType Fixed

    - Créer le volume et le formater...
    (oui là, c'est un peu plus compliqué lol..)
    (il faut mettre le disque en mode maintenance etc..)

    $labelLecteur = "DATA_S2D"
    $VirtualDisk = Get-VirtualDisk -FriendlyName "S2D_VDISK" -ErrorAction Stop
    $disk = $VirtualDisk | Get-Disk
    $ClusterDisk = Get-ClusterResource | Where-Object { $_.ResourceType -eq "Physical Disk" -and $_.Name -like "*S2D_VDISK*" }
    
    # Vérifier le disque de cluster trouvé
    if ($ClusterDisk) {
        # Mettre le disque en mode de maintenance
        Suspend-ClusterResource -Name $ClusterDisk.Name
    
        # Formater le disque
        $partition = $disk | New-Partition -AssignDriveLetter -UseMaximumSize
        $partition | Format-Volume -FileSystem ReFS -NewFileSystemLabel "$labelLecteur" -Confirm:$false
    
        # Sortir le disque du mode de maintenance
        Resume-ClusterResource -Name $ClusterDisk.Name
    
    } else {
        Write-Error "Le disque de cluster n'a pas été trouvé."
    }

    votre commentaire
  • Nous allons utiliser Bitvise Server.
    C'est un excellent serveur SFTP, hautement configurable, compatible avec les versions Core de Windows Serveur... et surtout abordable pour les entreprises ! (100€ / serveur / an)

    Voici un schéma basique :

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

     

    Nous disposons de :
    - 2 serveurs Windows (SFTP-1 et SFTP-2) Windows Serveur 2022 Core, qui vont être montés en haute disponibilité avec une VIP (adresse IP virtuelle : 10.10.10.251). Sur chacun de ces serveurs, Bitvise serveur sera installé et dûment configuré.
    - 1 serveur Windows Serveur 2022 Desktop jouant le rôle d'Active Directory (DC). Toutes les machines du schéma, à l'exception du pare-feu, ont été préalablement ajoutées au domaine)
    - 1 ordinateur client (CLIENT) qui se connecte au serveur SFTP via la VIP.
    - 1 pare-feu pour refermer le réseau  (juste pour l'exemple)

     

    Ce que nous allons faire :
    - mettre en place un cluster de basculement entre SFTP-1 et SFTP-2
    - ajouter un rôle pour un service générique (Bitvise) sur le cluster (Nous gérerons le cluster depuis DC pour plus de confort (graphique) et rapidité... mais on peut également gérer le cluster depuis SFTP-1 ou SFTP-2 via powershell pour les plus téméraires)
    - Attribuer une VIP (10.10.10.251) à ce rôle de cluster Bitvise... et voir comment en attribuer une seconde au cas où...
    - Configurer Bitvise serveur sur SFTP-1 en tant que nœud maître (Master)
    - Configurer Bitvise serveur sur SFTP-2 en tant que nœud suiveur (follower)
    - Tester la haute disponibilité depuis CLIENT avec le logiciel Bitvise client (la coupure de service doit être la plus courte possible si l'un des serveurs tombe, le logiciel client bitvise ou sshfs doit se reconnecter de lui-même)

     

    Ce que nous n'allons pas faire (!)
    - Configurer les hostnames des machines ainsi que leur configuration IP (telle que sur le schéma). ça doit être fait.

    - La jonction des différentes machines au domaine Active Directory dont DC est le contrôleur. Là aussi, on considère que c'est déjà fait.
    Pour l'exemple, j'ai créé un domaine avec une nouvelle forêt : "MONDOMAINE.LAN"

    - Nous occuper de la solution de stockage redondant pour les données du SFTP. Il existe un grand nombre de solutions (S2D, iSCSI ou simplement des synchro à intervalles réguliers entre les supports de stockage dévolus aux données des utilisateurs du SFTP sur chaque serveur .- FreeFileSync, robocopy etc...)


    On va se contenter ici simplement de la mise en haute disponibilité et de l'échange automatique des configurations entre les 2 serveurs Bitvise. Vous allez voir, c'est extrêmement simple avec Bitvise.
    Bon.. j'ai un peu forcé sur le nombre d'images, alors qu'en fait, c'est vraiment très simple.

    On y va :

    On se logue en tant qu'Administrateur du domaine direct

    1) Télécharger et installer Bitvise serveur sur SFTP-1 et SFTP-2

    Invoke-WebRequest -Uri https://dl.bitvise.com/BvSshServer-Inst.exe -OutFile C:\BvSshServer-Inst.exe

    2) Installer Bitvise serveur sur SFTP-1 et SFTP-2

    Set-Location C:\
    .\BvSshServer-Inst.exe

    - On accepte la licence (on touche pas au reste) :

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    - On choisit l'édition Standard (la vraie).. pas la gratuite.
    Vous aurez 30 jours pour vous acquitter de la licence.

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    - L'installation se termine, on clique sur OK :

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    - Bitvise Server se lance juste après l'installation.

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    - On ne configure rien pour le moment. On quitte le logiciel en fermant les 2 fenêtres (et on choisit "Close without change")

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    - On redémarre les serveurs :

    Restart-Computer

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

     

    - On se logue en tant qu'Administrateur du domaine et on installe la fonctionnalité de clustering de basculement :

    Install-WindowsFeature -Name Failover-Clustering -IncludeManagementTools

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

     

     3) Créer le cluster 

    - Sur DC, on installe d'abord la fonctionnalité de clustering de basculement :
    Je ne me souviens plus si c'est indispensable de l'installer aussi sur la machine qui va gérer le cluster... à tester...

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    - On va ensuite dans "Outils", et on ouvre le gestionnaire de cluster de basculement :

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    - Dans le menu latéral de droite, on clique sur "Créer le cluster"

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    - On ajoute nos 2 serveurs SFTP-1 et SFTP-2 :

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

     

    - Bon, là, vient le moment que tout le monde déteste, les fichus tests de microsoft qui foirent systématiquement à moins de disposer d'un matériel hors de prix. C'est du testing ici, donc on se fiche de leur support.
    Si vous avez correctement fait vos confs IP, il n'y aura aucun problème.

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

     

    - On créée le cluster (cSFTP) et on lui attribue une IP sur notre réseau (10.10.10.210/24 par exemple).
    Oui notre cluster a sa propre IP.

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

     

    - On valide

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    - La création commence 

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Notre cluster cSFTP est à présent créé.
    Nous allons rajouter un rôle sur ce cluster.
    Dans le menu latéral de gauche, déroulez votre cluster et cliquez sur rôles :

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    - Dans le menu latéral de droite, cliquez sur "Configurer un rôle..."

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

     

    - Nommez votre rôle (R-BITVISE par exemple) et attribuez lui une adresse IP (10.10.10.251 par exemple)
    C'est cette IP qui servira de VIP. C'est cette IP que nos logiciels clients SFTP contacteront.

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

     

    - Ici, il n'y a rien à ajouter pour l'instant.

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

     

    - Idem pour les clefs de registre, laissez vide.

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

     

    - Votre rôle est créé !

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

     

    - Bien. Normalement, nous avons presque terminé pour ce qui est de la haute dispo.
    L'adresse IP 10.10.10.251 configurée pour notre rôle est une VIP.. Mais il arrive parfois que la connexion depuis le CLIENT à cette VIP ne fonctionne pas lors des premières tentatives de connexions... Je ne sais pas pourquoi ! Encore un sempiternel mystère windows... la VIP est indiquée en ligne, mais ne l'est pas forcément vraiment.

    Si jamais, à l'issue de toute la configuration, vous rencontrez ce problème, il y a un truc :

    nous pouvons "forcer" un peu en ajoutant une VIP supplémentaire (10.10.10.250).. Et allez savoir pourquoi, dès que vous mettrez votre seconde VIP en ligne, la première se mettra à répondre... !! Vous n'aurez plus qu'à supprimer la seconde que vous venez de créer... 
    Vraiment étrange ce système parfois...
    ça m'est arrivé plusieurs fois, alors j'en parle.

    Pour ajouter une VIP supplémentaire  (au cas où vous saurez faire ! Mais ne le faîtes qu'à la toute fin de la configuration ! Passez d'abord cet encart, démarrez simplement le rôle et allez configurer les serveurs bitvise sur SFTP-1 et SFTP-2... vous reviendrez ici ensuite si ça déconne).

    Vous avez sélectionné votre rôle, à présent cliquez sur l'onglet "Ressources" en bas (à côté de l'onglet "Résumé)

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Vous voyez votre VIP actuelle 10.10.10.251... et elle est bien en ligne..

    - Dans le menu latéral de gauche, cliquez sur "Ajouter une ressource", "Plus de ressources", "Adresse IP"

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Votre nouvelle IP apparaît alors en bas (parfois il faut descendre). 
    Double-cliquez pour configurer votre VIP : (10.10.10.250)

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Appliquez, OK.

    Cliquez droit sur la VIP, Mettre en ligne.


    Que vous ayez dû rajouter une VIP supplémentaire ou non, il faut démarrer le rôle quoiqu'il en soit avant de continuer.

    Cliquez-droit sur votre rôle, Démarrer !

    Une fois que vous aurez fait la configuration en failover des serveurs SFTP-1 et SFTP-2, testez les 2 VIP : 10.10.10.250 et 10.10.10.251... et si la .251 fonctionne, supprimez la .250 !

    La configuration de la haute disponibilité est à présent terminée.
    Nous passons à la configuration failover de Bitvise.
    Retour sur SFTP-1 et SFTP-2

     

    4) Configuration en Master/Follower des serveurs Bitvise

    - Sur SFTP-1 et SFTP-2, lancez bitvise server :

    Set-Location 'C:\Program Files\Bitvise SSH Server\'
    .\BssCtrl.exe

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    - Configuration du nœud Master sur SFTP-1
    Dans l'onglet "Server", cliquez en haut à droit sur "Instance Type: Standalone"

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

     

    Configurez les options suivantes sur SFTP-1 :
    - Instance Type : Master
    - Password-Protect instance settings (Veuillez configurer un mot de passe pour protéger vos réglages sur SFTP-1)
    - Password : ATTENTION, ce mot de passe devra être commun à SFTP-1 et SFTP-2 !! (exemple : aZdkgknzv6,)

    - Allow synchronization of identity : cocher
    - Allow password cache synchronization : cocher
    - Allow activation code synchronization : ne pas cocher
    - Follower refresh delay (in minutes) : 10 (ça signifie que les serveurs se parlent toutes les 10minutes pour s'échanger les éventuelles modifications de configuration)
    - If synchronizing server runs older version : Download installer from master
    - Maximum conccurrent installer download connections : 50
    - Automatic updates : Apply recommended updates
    - Check for update delay (hours) : 18
    - Update stability delay (days) 18
    - Maintenance periods : laissez par défaut ou changez à votre guise

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    - Validez en cliquant sur OK.

    - Echange des clefs.
    Pour que le nœud Master (SFTP-1) puisse "passer le relais" au nœud follower (SFTP-2) en cas de problème de SFTP-1, il faut que le serveur Bitvise sur SFTP-2 possède le clefs publiques du serveur Bitvise sur SFTP-1 !

    Pour ce faire, sur SFTP-1, il faut exporter toutes les clefs publiques.
    Dans l'onglet "Server", cliquer sur "Manage host keys".

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

     

    - Choisissez le format d'export par défaut (Standard SSH2 format)

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022


    Sélectionnez tour à tour les clefs (par défaut la première est une RSA et la seconde une ECDSA...) puis cliquez sur "Export". Choisissez un nom pour les différencier (RSA et ECDSA par exemple).

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Transférez ces 2 clefs (ou faîtes un copier/coller du contenu si vous le pouvez) de SFTP-1 à SFTP-2.
    Je donne une astuce à la noix un peu plus loin...

     

    Configuration du nœud follower sur SFTP-2
    Il faut maintenant attribuer le rôle de suiveur au serveur Bitvise qui se trouve sur SFTP-2 et lui filer les clefs publiques du serveur Bitvise sur SFTP-1.
    Dans l'onglet "Server", cliquez également sur "Instance type: Standalone"
    Configurez les options suivantes : 
    - Instance type : Follower
    - Password-protect instance settings : (Veuillez configurer un mot de passe pour protéger vos réglages sur SFTP-2)
    - Host keys and fingerprints : cliquez et importez les clefs publiques que vous venez de transférer de SFTP-1 vers SFTP-2 (ou faîtes un copier-coller directement si vous le pouvez)

    Une astuce à la con (si vous utilisez des VM sous Hyper-V) : c'est d'exporter vos clefs publiques sur SFTP-1 (dans le dossier Documents par exemple, puis de fermer Bitvise serveur, d'ouvrir le bloc-note (notepad), aller dans Fichier, ouvrir, changer le type pour afficher Tous les fichiers, puis de sélectionner chaque clef, clic-droit copier, puis clic-droit, coller dans la fenêtre d'importation des keys sur SFTP-2 ! C'est fait en 10 secondes !

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022


    - Master host : IP de SFTP-1 : 10.10.10.201
    - Master port : 22 (à moins que vous ne l'ayez changé sur SFTP-1)
    - Connect from interface : (si vous avez plus d'une interface réseau sur SFTP-1 et SFTP-2, vous pouvez spécifier sur quelle interface vous voulez que les échanges de données entre les 2 serveurs aient lieu). Si vous n'avez qu'une seule carte réseau (comme c'est le cas sur le schéma) alors laissez vide
    - Allow ssh-rsa host signature : cocher
    - Password : ATTENTION, ce mot de passe est le fameux mot de passe commun à SFTP-1 et SFTP-2 que l'on avait créé un peu plus haut sur SFPT-1 !! (aZdkgknzv6,)
    - Enable obfuscation : NE PAS COCHER. ce réglage n'est pas disponibles dans les menu d'instance sur SFTP-1, donc il ne faut pas le cocher, autrement la connexion ne se fera pas entre les 2 serveurs.
    - Synchronize SSH host keys : cocher
    - Synchronize TLS/SSL certificates: cocher
    - Synchronize server settings : cocher
    - Synchronize password cache : cocher
    - Synchronize activation mode : cocher
    Laissez les reste par défaut (non coché).

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

    - On valide en cliquant sur OK.



    Voilà, la configuration master/follower est terminée.
    Attendez quelques instants, les serveurs vont se parler !
    Regardez dans les onglets "Activity" pour voir les logs des connexions entre eux.

    Si vous créez désormais un utilisateur virtuel sur le serveur bitvise de SFTP-1, il sera automatiquement ajouté à SFTP-2 quelques minutes après (dans la configuration que l'on vient de faire plus haut sur SFTP-1, la synchronisation de configuration des serveurs se fait toutes les 10minutes.. libre à vous de raccourcir).
    Vous pourrez voir apparaître l'utilisateur virtuel dans l'onglet "Server", "Settings", "view", "Access control", "Virtual accounts" sur SFTP-2.

    Configurer un serveur SFTP en failover sur Windows Serveur Core 2022

     

    Test de failover : 
    - créez un utilisateur virtuel sur SFTP-1, attendez qu'il se réplique sur SFTP-2 (ou forcez la réplication en cliquant sur "Connect now" sous "Instance Type : follower" dans l'onglet "Server" sur SFTP-2
    - pensez à créer le répertoire de base de stockage de Bitvise pour votre utilisateur virtuel : C:\SftpRoot

    New-Item -Path C:\SftpRoot -ItemType Directory

    sur SFTP-1 et SFTP-2, qui est le répertoire par défaut des utilisateurs virtuels (ou changez-le, au besoin), sinon vous ne pourrez pas vous connecter.
    - Connectez-vous à l'utilisateur virtuel créé depuis le CLIENT, et faîtes tomber SFTP-1... vous verrez, le client bitvise va se reconnecter quasiment instantanément au serveur SFTP-2, comme si de rien était !!

    Il vous faudra mettre en place la solution de stockage redondant, voir distribué ensuite ...


    votre commentaire
  • Robocopy est ancien, mais il fonctionne parfaitement bien et est toujours intégré nativement à Windows (même Windows 11).
    C'est même un outil de synchronisation de données particulièrement efficace.
    Il comporte une multitudes d'options, allant du mirroring simple à la copie préservant les permissions d'accès aux données (même si vous n'y avez pas accès).

    Robocopy est particulièrement rapide lors des synchronisations différentielles.

    Dans un AD, certaines options de Robocopy ne sont pas accessibles aux utilisateurs standards sans autorisations supplémentaires (par exemple les autorisations d'audit), mais la copie en miroir fonctionne parfaitement.
    Cela peut permettre de proposer à un utilisateur un script basique de sauvegarde de ses dossiers personnels vers un partage réseau personnel. L'utilisateur déclencherait ce script à sa guise en double-cliquant dessus ou bien une tâche planifiée pourrait être mise en place pour exécuter ce script à intervalle régulier, sans que l'utilisateur n'ait besoin d'intervenir.

    A savoir : Robocopy peut être manipulé avec PowerShell et Cmd.exe.
    Malheureusement, j'ai pu constater qu'il y avait régulièrement quelques hics lors de la manipulation de Robocopy via PowerShell, donc je me sers exclusivement de Batch pour le manipuler.

    Je vous propose d'apprendre à mettre en place ici un script de sauvegarde différentiel pour sauvegarder le dossier personnel de l'utilisateur Marcel.Dublog (C:\Users\Marcel.Dublog) vers un autre lecteur (partage, clef USB, disque dur externe de sauvegarde etc..) monté sur la lettre S: sur le système.
    Lors de la première exécution, une sauvegarde complète sera effectuée, puis lors des prochaines exécutions, seul le contenu qui aura été modifié dans les données de l'utilisateur sera synchronisé.

    Enfin, dernier point, il est impossible (a contrario d'Rsync sur les systèmes Unix) de réaliser des sauvegardes distantes avec Robocopy... Mais !! On peut ruser : Montez un volume distant en local sur votre machine... et le tour est joué (que ce soit via WinRM ou RDP).

    Voici donc un script basique (mais redoutablement efficace) "MIR.bat" pour sauvegarder les dossiers du répertoire personnel d'un utilisateur en miroir (copie parfaite).
    Et au pire, si Robocopy ne fait pas l'affaire, il y a FreeFileSync... gratuit (et seulement 20€ en version pro).

    REM Convertir les caractères des chemins de fichiers en UTF-8 (IMPERATIF !)
    @echo off chcp 65001 > nul REM ######################################################### REM # SCRIPT DE SAUVEGARDE DES DONNEES PERSO DE Marcel.Dublog REM Emplacement du chemin de log : set logrobocopy="C:\Users\Marcel.Dublog\Desktop\robocopy.log"
    REM Sauvegarde des Contacts set source="C:\Users\Marcel.Dublog\Contacts"
    set dest="S:\Contacts" Robocopy %source% %dest% /MIR /R:0 /W:0 /LOG:%logrobocopy% REM Sauvegarde du Bureau set source="C:\Users\Marcel.Dublog\Desktop"
    set dest="S:\Desktop" Robocopy %source% %dest% /MIR /R:0 /W:0 /LOG:%logrobocopy% REM Sauvegarde des Documents set source="C:\Users\Marcel.Dublog\Documents"
    set dest="S:\Documents" Robocopy %source% %dest% /MIR /R:0 /W:0 /LOG:%logrobocopy% REM Sauvegarde des Téléchargements set source="C:\Users\Marcel.Dublog\Downloads"
    set dest="S:\Downloads" Robocopy %source% %dest% /MIR /R:0 /W:0 /LOG:%logrobocopy% REM Sauvegarde des Favoris set source="C:\Users\Marcel.Dublog\Favorites"
    set dest="S:\Favorites" Robocopy %source% %dest% /MIR /R:0 /W:0 /LOG:%logrobocopy% REM Sauvegarde des Liens set source="C:\Users\Marcel.Dublog\Links"
    set dest="S:\Links" Robocopy %source% %dest% /MIR /R:0 /W:0 /LOG:%logrobocopy% REM Sauvegarde de la Musique set source="C:\Users\Marcel.Dublog\Music"
    set dest="S:\Music" Robocopy %source% %dest% /MIR /R:0 /W:0 /LOG:%logrobocopy% REM Sauvegarde de OneDrive set source="C:\Users\Marcel.Dublog\OneDrive"
    set dest="S:\OneDrive" Robocopy %source% %dest% /MIR /R:0 /W:0 /LOG:%logrobocopy% REM Sauvegarde des Images set source="C:\Users\Marcel.Dublog\Pictures"
    set dest="S:\Pictures" Robocopy %source% %dest% /MIR /R:0 /W:0 /LOG:%logrobocopy% REM Sauvegarde des Jeux set source="C:\Users\Marcel.Dublog\Saved Games"
    set dest="S:\Saved Games" Robocopy %source% %dest% /MIR /R:0 /W:0 /LOG:%logrobocopy% REM Sauvegarde des Recherches set source="C:\Users\Marcel.Dublog\Searches"
    set dest="S:\Searches" Robocopy %source% %dest% /MIR /R:0 /W:0 /LOG:%logrobocopy% REM Sauvegarde des Vidéos set source="C:\Users\Marcel.Dublog\Videos"
    set dest="S:\Videos" Robocopy %source% %dest% /MIR /R:0 /W:0 /LOG:%logrobocopy% REM Les options suivantes ne sont pas disponibles pour les utilisateurs dans un AD (sans permissions d'audit) : REM /COPYALL /ZB /B

    REM L'option /Z placée à la fin permet de ne sauvegarder que les blocs différents et pas de tout réécraser à chaque fois REM Pour débugger, décommenter la ligne suivante : REM timeout /t 30 /nobreak

     


    votre commentaire
  • Lors de la création d'un partage réseau SMB, on constate rapidement que des ennuis de confidentialité vont survenir.

    Le premier ennui est dû au fait que les partages sont visibles par tous, même lorsque les utilisateurs n'ont pas d'autorisations d'accès sur les dits partages.

    Le second, c'est qu'au sein d'un même partage (ou espace de noms DFS pour les gros rassemblements de partages) plusieurs ressources peuvent être destinées à plusieurs utilisateurs différents. 
    Or, avec NTFS, il est impossible de cacher les ressources, même lorsqu'un utilisateur n'a pas de droits dessus.

    Faîtes l'essai vous-même sur un partage : prenez n'importe quel fichier, interdisez le FullAccess à votre utilisateur (dans Avancé...), et vous verrez que vous pourrez quand même voir le fichier dans le dossier où il se trouve (même si vous ne pourrez rien faire avec).

    ça diffère énormément des systèmes Unix sur ce point. En NTFS, on voit TOUJOURS la ressource... et c'est un - gros - problème lors des partages réseaux !

     

    Ce sont donc les 2 facettes d'un partage SMB qu'il faut gérer :

    *) Empêcher les utilisateurs de lister les partages réseaux. Ils devront connaître le nom du partage réseau auquel ils veulent accéder car ils ne pourront pas les lister.

    Il existe plusieurs façons de faire pour ce premier point (notamment par GPO). Nous allons voir la plus archaïque et basique, mais qui a le mérite de toujours fonctionner et d'être rapide à mettre en place !

    *) Empêcher les utilisateurs de voir les ressources (fichiers/dossiers) au sein d'un partage, sur lesquels ils n'ont pas de droits (lecture.. modification etc..). C'est un verrou à l'affichage permanent d'NTFS.

    -----------------------------------------------------------------------------------------------------------------

    Pour ce tuto, nous allons considérer 2 utilisateurs : marcel.dublog et jeanine.dusite

    2 dossiers (D:\marceldublog et D:\jeaninedusite) ont été créé sur le serveur nommé "SRV-PARTAGE" dans le domaine.

    Le but est de permettre à chaque utilisateur d'avoir accès à son dossier via le réseau, sans que ni l'un ni l'autre ne puisse voir le partage de l'autre (et bien entendu, ne pas non plus pouvoir y accéder ou modifier quoique ce soit !)

     

    Dans l'AD :
    2 groupes Domaine Local ont été créé pour gérer l'accès de chaque utilisateur à son dossier.

    "DL-marceldublog-M" et "DL-jeaninedusite-M"

    Nous avons incorporé respectivement marcel.dublog dans DL-marceldublog-M et jeanine.dusite dans DL-jeaninedusite-M

     

    Nous allons à présent créer les partages et mettre en place les 2 facettes depuis le serveur SRV-PARTAGE

    (Nous allons abusivement utiliser PowerShell et Batch ici... Mais libre à vous de le faire en graphique. Personnellement, je comprends mieux ce que je fais avec des commandes plutôt qu'en cliquant partout)

     

    1) Gestion des droits NTFS

    - Pour le dossier de marcel :

    $Acl = Get-Acl "D:\marceldublog"
    $Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("DL-marceldublog-M", "Modify", "ContainerInherit,ObjectInherit", "None", "Allow")
    $Acl.SetAccessRule($Ar)
    Set-Acl "D:\marceldublog" $Acl

    - Pour le dossier de Jeanine

    $Acl = Get-Acl "D:\jeaninedusite"
    $Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("DL-jeaninedusite-M", "Modify", "ContainerInherit,ObjectInherit", "None", "Allow")
    $Acl.SetAccessRule($Ar)
    Set-Acl "D:\jeaninedusite" $Acl

    Pour ceux qui ne veulent (toujours) pas entendre parler de PowerShell, voici l'équivalent en Batch : (c'est quand même plus concis que PowerShell non ?! :-D)

    icacls "D:\marceldublog" /grant DL-marceldublog-M:(OI)(CI)M
    icacls "D:\jeaninedusite" /grant DL-jeaninedusite-M:(OI)(CI)M

     
    Nous avons donné les droits NTFS de modification à nos utilisateurs sur l'entièreté de leur dossier respectif.

     

    2) Création des partages cachés :

    Pour cacher un partage réseau, rien de plus simple !
    Il suffit, lors de la création du partage, d'ajouter un $ à la fin du nom du partage.

    Par exemple, je veux partager le dossier D:\marceldublog. 
    Je vais donc créer un partage nommé "marceldublog$".

    Nous allons donc créer les partages en octroyant aux utilisateurs le droits de modifier le contenu de leur partage (il s'agît du droit ChangeAccess.. et pas FullAccess !)

    New-SmbShare –Name "marceldublog$" –Path "D:\marceldublog" –ChangeAccess "DL-marceldublog-M"
    New-SmbShare –Name "jeaninedusite$" –Path "D:\jeaninedusite" –ChangeAccess "DL-jeaninedusite-M"

    L'équivalent en batch est :

    net share marceldublog$="D:\marceldublog" /GRANT:DL-marceldublog-M,CHANGE
    net share jeaninedusite$="D:\jeaninedusite" /GRANT:DL-jeaninedusite-M,CHANGE

    Voilà, nos 2 partages réseaux sont créés.. Et si l'un des utilisateurs essaie de lister les partages réseaux depuis son poste en tapant \\srv-partage dans son explorateur Windows, il ne verra pas les partages.

    MAIS... Ce n'est pas suffisant !

    Si l'utilisateur connaît le nom du partage de l'autre, il peut toujours essayer d'y accéder.. Et si par malheur vous n'avez pas correctement géré les autorisations d'accès, il aura potentiellement le droit de se balader et de voir les ressources.

    Vous me direz que dans ce petit exemple ça n'a pas beaucoup d'intérêt puisque chaque utilisateur a un dossier propre.. Oui, inutile d'aller plus loin pour un exemple aussi simple.

    Mais dans des partages communs ou les espaces de noms DFS, où plusieurs utilisateurs affichent le même partage (ou ensemble de partages) mais doivent avoir des droits différents, ce qui suit est fort utile pour faire en sorte que seules les ressources sur lesquelles l'utilisateur a des droits NTFS s'affichent à lui.

     

    3) Activer les accès basés sur l'énumération (ABE) sur nos partages

    Pour empêcher les utilisateurs de voir les ressources sur lesquelles il n'ont pas d'accès NTFS, activer ABE !

    Set-SmbShare -Name "marceldublog$" -FolderEnumerationMode AccessBased -Confirm:$false
    Set-SmbShare -Name "jeaninedusite$" -FolderEnumerationMode AccessBased -Confirm:$false

    Il n'existe pas d'équivalent batch pour activer ABE à ma connaissance.. uniquement pour les espaces de noms DFS.

     


    votre commentaire
  • N'étant pas du tout adepte de Windows, j'ai tenté de démêler les informations au sujet des licences Microsoft, et notamment des licences CAL.
    Si quelqu'un trouve à redire à cette explication très basique (oui vraiment très basique), surtout n'hésitez pas à faire un commentaire ! Je n'ai pas la science infuse dans le domaine Microsoft et je serais ravi de recueillir de témoignage de professionnels en exercice qui manipulent ces licences au quotidien.

    Une chose que je n'ai pas apprise durant mes études, c'est bien justement l'existence des ces fameuses licences CAL !

    Il existe plusieurs types de licences lorsqu'on manipule Windows :
    - La licence de l'OS (pour le poste de bureau ou pour le serveur)
    - La licence CAL (pour légitimer l'accès aux services rendus par le serveur Windows)
    - La licence CAL RDS (pour légitimer l'utilisation des services RDS)
    - .... je ne parle pas des autres licences de produits... (SQL etc...)

    Et ces licences se cumulent... !

     

    I) La licence du Système d'Exploitation

    Là je ne rentrerai pas dans le détail puisqu'il existe un certain nombre de possibilités pour les licences (individuelles, en volume etc..)
    Simplement que chaque appareil (poste de travail ou serveur) doit être "validé" par l'acquisition d'une licence légitimant son utilisation (individuelle ou en volume).

     

    II) La licence CAL

    Cette licence légitime l'accès aux services rendus par un serveur Windows. 
    Ce n'est pas le service en lui-même (par exemple l'ADDS), mais bien l'accès à ce service qui est couvert par la licence CAL.
    Exemple : même si vous installez uniquement un serveur OpenSSH (open-source) sur un serveur Windows et n'utilisez QUE ce serveur openSSH (pour du SFTP par exemple), et bien vous êtes quand même soumis aux licences CAL (ils sont trop forts chez Microsoft... ça rappelle Cisco il y a quelques années selon Michel) :

    Il en existe de 2 types : 
    - La licence par utilisateur
    - La licence par périphérique (poste de travail)

    Si plusieurs utilisateurs se partagent un même poste de travail, l'acquisition d'une licence par périphérique est évidemment plus intéressante (même si rarement le cas)

    Quid du "périmètre" de ces licences CAL ?
    Mettons que vous ayez 40 serveurs Windows dans votre domaine (oui, vous avez vraiment beaucoup d'argent à dépenser.. vous êtes fan de windows, amoureux transi du logo etc..), que vous ayez plusieurs bâtiments ou antennes dispatchés aux 4 coins du pays, interconnectés entres eux par des VPN (etc..)... avec des RODC etc..
    Du moment que tous ces serveurs font partie du même domaine, vous n'aurez besoin que d'une seule CAL pour un utilisateur/périphérique. (Ouf !).
    Si vos utilisateurs du siège sont amenés à se connecter du siège et d'une autre antenne ailleurs dans le pays lorsqu'ils se déplacent, vous n'aurez besoin que d'une seule CAL.

    La licence CAL dépend du domaine, non du nombre de serveurs (ou de clusters) ou d'antennes.

    Le coût ? 
    Environ 40€ par utilisateur ou postes
    Evidemment, plus vous en achetez en même temps, plus vous faîtes d'économies.

     

    III) La licence CAL RDS

    Cette licence se cumule à la CAL précédente et concerne l'utilisation des services RDS.

    Il en existe de 2 types : 
    - La licence par utilisateur
    - La licence par périphérique (poste de travail)

    Dès lors que vous utilisez un service RDS, que ce soit au sein de l'entreprise où à l'extérieur (pour vous connecter à un bureau virtuel à distance), vous devez acquérir une licence CAL RDS.

    Vous n'utilisez pas RDS mais WinRM ? Alors il n'y a pas de CAL RDS à acquérir.
    WinRM est conçu pour de la gestion à distance de serveurs, pas vraiment pour bosser. (mais c'est bon à savoir).

    Le coût ?
    Environ 70€ pour 50 utilisateurs ou postes

     

    Je suis ouvert aux commentaires pour tout scénario intéressant avec ces licences.. histoire que je comprenne un peu mieux comment ça fonctionne ! 


    votre commentaire
  • On peut écrire un petit script PowerShell pour afficher la charge CPU et la RAM utilisée, actualisées toutes les 3 secondes.

    # Afficher les titres une seule fois
    clear
    Write-Host "Ressources utilisées :"
    Write-Host "======================="
    
    $counter = 0
    
    while ($true) {
        # Obtenir l'heure actuelle
        $currentTime = Get-Date -Format "HH:mm:ss"
    
        # Obtenir la mémoire physique totale
        $totalMemory = Get-WmiObject Win32_ComputerSystem | Select-Object -ExpandProperty TotalPhysicalMemory
    
        # Convertir en mégaoctets
        $totalMemoryMB = [Math]::Round($totalMemory / 1MB)
    
        # Obtenir la mémoire disponible
        $availableMemoryCounter = New-Object System.Diagnostics.PerformanceCounter("Memory", "Available MBytes")
        $availableMemoryMB = $availableMemoryCounter.NextValue()
    
        # Calculer la mémoire utilisée et le pourcentage de la mémoire utilisée
        $usedMemoryMB = $totalMemoryMB - $availableMemoryMB
        $usedMemoryPercent = [Math]::Round(($usedMemoryMB / $totalMemoryMB) * 100, 2)
    
        # Obtenir la charge CPU
        $cpuLoad = (Get-WmiObject Win32_Processor | Measure-Object -Property LoadPercentage -Average).Average
    
        # Afficher l'heure, la charge CPU et le pourcentage de la mémoire utilisée
        Write-Host "[$currentTime] CPU: $cpuLoad%, RAM: $usedMemoryPercent% ($usedMemoryMB Mo)"
    
        # Pause de 2 secondes avant la prochaine itération
        Start-Sleep -Seconds 2
    
        # Incrémenter le compteur
        $counter++
    
        # Effacer l'écran toutes les 10 itérations
        if ($counter % 10 -eq 0) {
            clear
            Write-Host "Ressources utilisées :"
            Write-Host "======================="
        }
    } 


    Voici ce que ça affichera :
    Chaque ligne s'actualise toutes les 3 secondes.

    Au bout de 10 lignes, l'écran s'efface et les itérations reprennent depuis en haut.
    Pratique pour suivre la charge d'une opération ou vérifier rapidement ce qui se passe

    Ressources utilisées :
    =======================
    [16:20:51] CPU: 1%, RAM: 69.93% (686 Mo)
    [16:20:54] CPU: 1%, RAM: 69.93% (686 Mo)
    [16:20:57] CPU: 0%, RAM: 69.52% (682 Mo)
    [16:21:00] CPU: 1%, RAM: 69.93% (686 Mo)
    [16:21:03] CPU: 0%, RAM: 69.93% (686 Mo)
    [16:21:06] CPU: 1%, RAM: 69.93% (686 Mo)
    [16:21:09] CPU: 0%, RAM: 69.93% (686 Mo)

     

     


    votre commentaire
  • sconfig se lance par défaut au démarrage de Windows Server (en Core), on peut préférer arriver directement sur une console PowerShell après l'authentification :

    Voici comment faire :
    Sur sconfig

    1) Quittez vers la ligne de commande (PowerShell), c'est le choix 15.
    2) Modifier le registre :

    Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name "Shell" -Value "powershell.exe" 

    3) Redémarrer l'ordinateur :

    Restart-Computer


    Désormais, juste après l'authentification, vous arriverez sur un Shell PowerShell et non plus sur sconfig.
    sconfig peut toujours être lancé en tappant simplement "sconfig"


    votre commentaire
  • Comment travailler sur un serveur Core depuis un poste client, sans une interface de plateforme cloud et en sachant que ce poste client n'est pas dans un domaine (et que le serveur n'est pas un contrôleur).

    Plusieurs façons de faire à ma connaissance (je rappelle que je ne suis pas un expert Windows du tout, même si j'adore rigoler avec PowerShell).

    1) La plus simple, c'est le serveur SSH. A installer sur le serveur core (il y a un article à ce sujet)

    2) La version webadmin ou les outils RSAT... Installer WAC sur votre serveur (Windows Admin Center) (il y a également un article) ou les outils RSAT (à installer sur serveur ET sur client)

    3) La plus chiante : les sessions powershell distantes en HTTPS avec WinRM

    Nous allons essayer la 3)... vous allez voir, c'est pas triste du tout :-D...

    ----------------------------------------------------------------------------------------------------------------

    Pour résumer ce qu'il conviendrait normalement de faire en situation réelle si vraiment on tenait à se servir de WinRM (ce qui n'est clairement pas la meilleure des idées...), voici un récapitulatif :

    I -  Sur le serveur Core (Cible de la Connexion) :

    - Intégrer le certificat SSL reconnu établi spécifiquement pour le serveur Core, à WinRM : Configurer WinRM pour utiliser un certificat SSL validé par une autorité de certification reconnue. Cela garantit une connexion sécurisée et cryptée, à destination du seul serveur Core.

    - Créer ou utiliser un Utilisateur Spécifique pour la connexion via WinRM : Créer ou choisir un utilisateur dédié (avec des privilèges restreints) pour les connexions via WinRM. Si nécessaire, créer également le groupe WinRMRemoteWMIUsers__.

    - Ajouter l'Utilisateur au Groupe en question : Ajouter cet utilisateur au groupe WinRMRemoteWMIUsers__. Ce groupe permet de limiter l'accès à WinRM sans donner de droits administratifs complets.

    - Configurer l'Endpoint WinRM : Utiliser Set-PSSessionConfiguration pour configurer les endpoints WinRM, en limitant l'accès uniquement aux membres du groupe WinRMRemoteWMIUsers__. Il faudra s'assurer de supprimer ou limiter les accès pour les autres groupes ou utilisateurs.

    Set-PSSessionConfiguration -Name "Microsoft.PowerShell" -ShowSecurityDescriptorUI

    - Ajouter une règle de Pare-feu pour limiter la surface de connexion : Mettre en place une règle de pare-feu pour n'autoriser les connexions WinRM que de l'adresse IP du client, renforçant ainsi la sécurité de la connexion.

     

    II - Sur le client (Initiateur de la Connexion) :

    - Ajouter le serveur Core à la Liste des Ordinateurs de Confiance : Ajouter le serveur Core à la liste des ordinateurs de confiance pour WinRM sur le client. Cela permet de confirmer que le client reconnaît et accepte les connexions sécurisées avec le serveur Core.

     -------------------------------------------------------------------------------------------------------

    Ce que nous allons faire à présent est légèrement différent, puisque nous n'allons pas demander de faire certifier notre requête SSL auprès d'une autorité reconnue juste pour faire un test. Nous allons donc générer un certificat auto-signé sur le serveur Core et l'utiliser. La différence avec les étapes ci-dessous, c'est qu'il faudra également intégrer ce certificat au client.
    Enfin, nous ne créerons pas l'utilisateur spécifique ni le groupe, nous allons rester très basique. L'idée ici, c'est juste de comprendre la mécanique et de voir comment on peut procéder au transfert de données entre les 2 protagonistes (du client au serveur core) de cette façon. Bien entendu, on peut aussi utiliser robocopy par ce biais.

    SUR LE SERVEUR CORE :

    1) Créer un certificat auto-signé (ou importez-en un signé si vous êtes dans ce contexte car ça évitera de devoir ajouter le certificat au magasin du client comme on le fera après).

    - D'abord, récupérer le nom de votre serveur : 

    $env:COMPUTERNAME

    (on va prendre "WIN-KAUMG9A63UJ" pour l'exemple)

    New-SelfSignedCertificate -DnsName "WIN-KAUMG9A63UJ" -CertStoreLocation "Cert:\LocalMachine\My"

    (L'empreinte thumbprint et le CN du serveur vont s'afficher.. Pratique, on pourra les copier/coller dans les commandes suivantes)

    2) Intégrer le certificat à WinRM :

    winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname="WIN-KAUMG9A63UJ"; CertificateThumbprint="9E095CBCCF54FCC93024ACB6725DB89D4819E334"}'

    (il est preferrable de restreindre la surface de connexion au serveur à la seule adresse IP de votre client plutôt que d'ouvrir à tout le monde. Pour cela, nous allons écrire une règle de pare-feu pour restreindre à une seule adresse IP : 192.168.1.105 par exemple)

    Voici le résultat qui confirme que cela a fonctionné : 

    ResourceCreated
    Address = http://shcemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
    ReferenceParameters
    ResourceURI = http://schemas.microsoft.com/wbem/wsman/1/config/listener
    SelectorSet
    Selector: Address = *, Transport = HTTPS

    3) Créer la règle de pare-feu restreinte à l'IP de notre client.

    New-NetFirewallRule -Name "WinRM HTTPS" -DisplayName "WinRM HTTPS" -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 5986 -RemoteAddress 192.168.1.105

     

     

     

    SUR LE PC CLIENT DISTANT

    Ouvrir PowerShell en mode Administrateur

    1) Rajouter une correpondance entre l'IP du serveur et son nom d'hôte dans le fichier hosts.

    Add-Content -Path "C:\Windows\System32\drivers\etc\hosts" -Value "`n192.168.1.44`tWIN-KAUMG9A63UJ"

    (remplacez 192.168.1.44 et WIN-KAUMG9A63UJ par l'IP et le nom d'hôte du serveur, mais ne touchez pas à `n et `t) 

    2) Créez un dossier C:\TEMP (ce sera utile pour plus tard)

    New-Item -Path "C:\TEMP" -ItemType Directory

    3) Connectez-vous au serveur depuis votre client :

    Enter-PSSession -ComputerName "WIN-KAUMG9A63UJ" -UseSSL -Credential (Get-Credential) -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck)

    Vous devrez entrer l'identifiant/mot de passe d'un utilisateur du serveur autorisé à être contacté à distance et vous devez absolument placer les -SessionOption qui ne vérifient pas le certificat..
    Autrement la connexion vous est refusée (pour l'instant, nous allons changer cela)


    4) Une fois connecté au serveur depuis notre client, il nous faut exporter le certificat auto-signé du serveur

    New-Item -Path "C:\TEMP" -ItemType Directory
    $CertPath = "Cert:\LocalMachine\My"
    $Cert = Get-ChildItem -Path $CertPath | Where-Object {$_.Subject -like "*CN=WIN-KAUMG9A63UJ*"}
    Export-Certificate -Cert $Cert -FilePath C:\TEMP\server_certificate.cer

    5) Déconnectez-vous du serveur :

    exit

    6) Transférer le certificat du serveur sur le client : 

    $Session = New-PSSession -ComputerName "WIN-KAUMG9A63UJ" -Credential (Get-Credential) -UseSSL -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck)
    Copy-Item -Path "C:\TEMP\server_certificate.cer" -Destination "C:\TEMP\server_certificate.cer" -FromSession $Session

    7) Importer le certificat du serveur reçu dans le magasin de certificats du système du client.

    Import-Certificate -FilePath "C:\TEMP\server_certificate.cer" -CertStoreLocation Cert:\LocalMachine\Root

    8) Voilà. Vous pouvez désormais vous connecter sans les options -SessionOption.

    Enter-PSSession -ComputerName "WIN-KAUMG9A63UJ" -UseSSL -Credential (Get-Credential)

     

    ------------------------------------------------------------------------------

     

    Envoyer des données (dossiers/fichiers) du poste client au serveur core :
    (Je veux envoyer le dossier ISO qui se trouve sur le poste client de Marcel vers le serveur Windows Core, dans le dossier C:\TEMP)

    $session = New-PSSession -ComputerName "WIN-KAUMG9A63UJ" -UseSSL -Credential (Get-Credential)
    Copy-Item -Path "C:\Users\Marcel\Documents\VM\ISO" -Destination "C:\TEMP" -ToSession $session -Recurse

     

    Récupérer des données du serveur Windows depuis le poste client :
    (vous avez l'exemple du certificat dans la procédure au-dessus, je la remets ici)

    $Session = New-PSSession -ComputerName "WIN-KAUMG9A63UJ" -Credential (Get-Credential) -UseSSL -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck)
    Copy-Item -Path "C:\TEMP\server_certificate.cer" -Destination "C:\TEMP\server_certificate.cer" -FromSession $Session

    votre commentaire
  • L’objectif est de créer un espace de stockage (par exemple pour les données des utilisateurs) sur un pool de stockage de 5 disques, avec une redondance en miroir triple, encrypté.

    Le tout en PowerShell sur un serveur Windows 2022 en Core.
    Clairement pas aussi rapide à faire qu’en ZFS, mais on s’en sort quand même.

    Pré-requis : avoir connecté 5 disques de même capacité à un serveur Windows 2022 Core à jour.

     

    I   -   Préparation des Disques

         i.     Initialiser les disques :

    Ouvrez PowerShell.

    Utilisez Get-Disk pour voir tous les disques.

    Get-Disk

    Nous prendrons l’exemple d’ID de disques de 1 à 5

    Initialisez les disques avec

    Initialize-Disk -Number <NuméroDuDisque> -PartitionStyle GPT 

    Pour chaque disque non initialisé

    Exemple : Pour initialiser les disques de 1 à 5 d'une traîte :

    Initialize-Disk -Number 1,2,3,4,5 -PartitionStyle GPT

     

    II - Configuration du Pool de Stockage

         ii.     Créer un Pool de Stockage :

    Récupérer les objets des disques spécifiés plus haut :

    $disks = Get-PhysicalDisk | Where-Object { $_.DeviceID -in 1,2,3,4,5 }

    Créer le Pool de Stockage (on l’appellera 'RDSecureDataPool' pour ReDundant… Mais libre à vous de choisir autre chose)

    New-StoragePool -FriendlyName "RDSecureDataPool" -StorageSubsystemFriendlyName "Windows Storage*" -PhysicalDisks $disks

    Voir le pool :

    Get-StoragePool -FriendlyName "RDSecureDataPool"

    Vérifier que les disques 1,2,3,4,5 sont bien dans le pool :

    Get-StoragePool -FriendlyName "RDSecureDataPool" | Get-PhysicalDisk

     

    III  -  Créer un Espace de Stockage avec Réplication :

         i.     Créer un disque virtuel avec réplication des données :

    Pour une réplication triple, vous pouvez utiliser la résilience par Parité ou Miroir.
    A titre personnel, je ne suis pas fan de la redondance en parité à cause de la dégradation des performances et de la lenteur d’écriture et de reconstruction des données en cas de panne.
    Il faut néanmoins savoir que l’espace disque en Mirror sera beaucoup plus faible.
    Utilisez la commande :

    New-VirtualDisk -StoragePoolFriendlyName "RDSecureDataPool" -FriendlyName "EspaceNom" -ResiliencySettingName Mirror -NumberOfDataCopies 3 -Size <TailleSouhaitée>GB -ProvisioningType Thin.

    Remplacez "EspaceNom" par le nom de votre espace de stockage et "<TailleSouhaitée>" par la taille totale que vous souhaitez pour l'espace.

    Si vous souhaitez que votre disque virtuel occupe la totalité de l’espace disponible sur le pool, il faut ajouter une étape : déterminer la taille totale disponible sur le pool.
    Il faut savoir que ce n’est pas une bonne pratique en raison de la dégradation des performances au fur et à mesure que le disque virtuel se remplira. Il est recommandé de laisser un espace vierge compris entre 10 et 20% de l’espace libre sur le pool (et sur un disque aussi.).
    Nous allons calculer cet espace vierge à partir des commandes permettant de déterminer la taille maximale disponible (histoire de comprendre le mécanisme) puis appliquer une diminution de 20%

    $pool = Get-StoragePool -FriendlyName "RDSecureDataPool"
    $totalSpace = $pool.Size
    $desiredPercentage = 0.80 
    $diskSize = $totalSpace * $desiredPercentage

    Voici la taille correspondant à 80% de l’espace disponible sur le Pool :

    echo $disksize

    Créons à présent le Disque Virtuel qui occupera 80% de la taille du pool de stockage :

    New-VirtualDisk -StoragePoolFriendlyName "RDSecureDataPool" -FriendlyName "MirrorDisk3copies" -ResiliencySettingName Mirror -NumberOfDataCopies 3 -Size $diskSize -ProvisioningType Thin

    J’ai donné à mon disque virtuel le nom de "MirrorDisk3copies" pour me souvenir rapidement du type de redondance mis en place.

    A titre d’exemple, mes 5 disques de 10Go attachés au serveur ont permis de créer un pool (RDSecureDataPool) d’une taille de 47.42Go), et le disque virtuel que nous venons de créer (MirrorDisk3copies) occupe une taille de 38Go, ce qui représente 76% d’occupation. La création du pool fait perdre de l’espace, les 20% d’occupation du pool en moins aussi et la création de la partition NTFS en fera également perdre un peu plus ... :-S...

       
         ii.    Formater et Créer un Volume :

    D’abord, il faut récupérer le numéro du disque virtuel que nous venons de créer.
    On pourrait croire que cette information pourrait être obtenue simplement grâce à la commande Get-VirtualDisk… et bien non, pas directement.
    Franchement, je n’en finis plus de me bidonner avec PowerShell. Rien n’est conçu pour être simple, logique et pragmatique.
    Si vous venez de créer votre pool et votre disque virtuel, alors votre disque est ‘Offline’ par défaut, ce qui nous arrange bien, car ainsi, on peut récupérer le numéro du disque en une seule commande :

    Get-Disk | Where-Object { $_.OperationalStatus -eq 'Offline' }


    Mais si vous avez déjà créé une partition dessus, alors là, ça se complique carrément !

    $vdisk = Get-VirtualDisk -FriendlyName "MirrorDisk3copies"
    $partition = $vdisk | Get-Partition
    $disk = $partition | Get-Disk
    $disk.Number


    Grâce à la première commande, j’ai découvert que mon disque virtuel a le numéro « 6 ».
    Rien d'étonnant puisque les 5 premiers sont les numéros des 5 disques du pool.


         iii.   Créez une partition sur le disque virtuel et la formater

    Initialize-Disk -Number <NuméroDuDisqueVirtual> -PartitionStyle GPT
    New-Partition -DiskNumber <NuméroDuDisqueVirtual> -UseMaximumSize -AssignDriveLetter
    Format-Volume -DriveLetter <Lettre> -FileSystem NTFS -NewFileSystemLabel "NomVolume"

    Exemple :

    Initialize-Disk -Number 6 -PartitionStyle GPT
    New-Partition -DiskNumber 6 -UseMaximumSize -AssignDriveLetter

    (notez la lettre du lecteur obtenue .. D dans mon cas)

    Format-Volume -DriveLetter D -FileSystem NTFS -NewFileSystemLabel "DATA"

    (J’ai choisi d’appeler mon lecteur DATA)

    Un mot concernant le choix du système de fichiers. Il est possible d'utiliser ReFS plutôt qu'NTFS, plus intéressant pour la redondance.

    Mais ReFS est un peu plus exigeant en pré-requis, donc je ne détaille pas ici.

    Voilà, à présent le lecteur D: (DATA) est utilisable.
    Chaque donnée copiée dessus sera recopiée 3 fois sur notre pool de 5 disques.
    Clairement pas aussi simple rapide et efficace que ZFS, mais ça se fait quand même sans trop de mal.

    IV  -  Encrypter notre lecteur DATA

         i.     Installer la fonctionnalité BitLocker

    Install-WindowsFeature BitLocker

    Redémarrez le serveur pour terminer l’installation.

        ii.    Chiffrer le lecteur

    Activer BitLocker sur le Volume :

    Enable-BitLocker -MountPoint "D:\" -UsedSpaceOnly -RecoveryPasswordProtector

    - L'option -UsedSpaceOnly chiffrera seulement l'espace utilisé, ce qui est plus rapide pour les grands volumes.

    - L'option -RecoveryPasswordProtector générera un mot de passe de récupération que vous devez conserver en lieu sûr impérativement !! (Et pas sur le serveur)

    L'encryption commence.

    Pour connaître l'avancement de BitLocker :

    Get-BitLockerVolume -MountPoint "D:"

    A 100% et avec un VolumeStatus à "FullyEncrypted", c'est fini !


    votre commentaire
  • Depuis la fermeture du magasin pour IIS, c'est devenu un peu plus chiant.
    Voici comment faire en PowerShell :

    1) Installer le serveur web IIS (avec les fonctions usuelles)
    2) Télécharger et Installer MariaDB
    3) Télécharger et Installer VC et PHP avec une config standard

    Après cela, il ne vous restera plus qu'à créer une base, un site etc...

    ######################################################
    # INSTALLER IIS
    
    Install-WindowsFeature -Name Web-Server
    
    # Installe les outils de gestion, y compris la console de gestion IIS
    Install-WindowsFeature -Name Web-Mgmt-Tools
    
    # Installe les fonctionnalités HTTP communes
    Install-WindowsFeature -Name Web-Default-Doc
    Install-WindowsFeature -Name Web-Dir-Browsing
    Install-WindowsFeature -Name Web-Http-Errors
    Install-WindowsFeature -Name Web-Static-Content
    
    # Installe les fonctionnalités d'intégrité et de diagnostic
    Install-WindowsFeature -Name Web-Http-Logging
    
    # Installe les fonctionnalités de performance
    Install-WindowsFeature -Name Web-Stat-Compression
    
    # Installe les fonctionnalités de sécurité
    Install-WindowsFeature -Name Web-Request-Monitor
    
    # Installer FastCGI
    Install-WindowsFeature -Name Web-CGI
    
    # Redémarrer le service IIS
    Restart-Service w3svc
    
    
    ######################################################
    # TELECHARGER ET INSTALLER MARIADB
    
    # Créer le dossier temporaire :
    New-Item -Path "C:\Temp" -ItemType Directory
    
    # Définir l'URL et le chemin de destination pour le téléchargement
    $mariadbUrl = "https://mirrors.ircam.fr/pub/mariadb/mariadb-10.11.5/winx64-packages/mariadb-10.11.5-winx64.msi"
    $destinationPath = "C:\Temp\mariadb-10.11.5-winx64.msi"
    
    # Télécharger MariaDB
    Invoke-WebRequest -Uri $mariadbUrl -OutFile $destinationPath
    
    # Installer MariaDB, configurer le service mariadb et le démarrer
    msiexec /i "C:\Temp\mariadb-10.11.5-winx64.msi" /qn
    Start-sleep -seconds 10
    Set-Location "C:\Program Files\MariaDB 10.11\bin" 
    .\mysqld.exe --install
    Start-sleep -seconds 5
    Start-Service -Name 'MySQL'
    
    
    # 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);C:\Program Files\MariaDB 10.11\bin"
    # Recharger les variables d'environnement :
    $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
    
    
    ######################################################
    # INSTALLER PHP ET VCS
    
    # Définir l'URL et le chemin de destination pour le téléchargement
    $VCUrl = "https://aka.ms/vs/16/release/VC_redist.x64.exe"
    $destinationPath = "C:\Temp\VC_redist.x64.exe"
    
    # Télécharger VC
    Invoke-WebRequest -Uri $VCUrl -OutFile $destinationPath
    
    # Installer VC
    Start-Process -Wait -FilePath "$destinationPath" -ArgumentList "/S" -PassThru
    
    # Télécharger et Installer PHP 8.2.10
    $PHPUrl="https://windows.php.net/downloads/releases/php-8.2.10-nts-Win32-vs16-x64.zip"
    $destinationPath = "C:\Temp\php-8.2.10-nts-Win32-vs16-x64.zip"
    Invoke-WebRequest -Uri $PHPUrl -OutFile $destinationPath
    
    New-Item -Path "C:\PHP" -ItemType directory
    Expand-Archive -LiteralPath $destinationPath -DestinationPath "C:\PHP"
    
    # 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);C:\PHP"
    # Recharger les variables d'environnement :
    $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
    
    
    ######################################################
    # CHARGER LES EXTENSIONS PHP NECESSAIRES :
    
    # Le contenu du fichier php.ini
    $content = @'
    [PHP]
    engine = On
    short_open_tag = Off
    precision = 14
    output_buffering = 4096
    zlib.output_compression = Off
    implicit_flush = Off
    unserialize_callback_func =
    serialize_precision = -1
    disable_functions =
    disable_classes =
    zend.enable_gc = On
    zend.exception_ignore_args = On
    zend.exception_string_param_max_len = 0
    expose_php = On
    max_execution_time = 300
    max_input_time = 60
    memory_limit = 256M
    error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
    display_errors = Off
    display_startup_errors = Off
    log_errors = On
    ignore_repeated_errors = Off
    ignore_repeated_source = Off
    report_memleaks = On
    variables_order = "GPCS"
    request_order = "GP"
    register_argc_argv = Off
    auto_globals_jit = On
    post_max_size = 8M
    auto_prepend_file =
    auto_append_file =
    default_mimetype = "text/html"
    default_charset = "UTF-8"
    doc_root =
    user_dir =
    extension_dir = "C:\PHP\ext"
    enable_dl = Off
    cgi.force_redirect = 0
    fastcgi.impersonate = 1
    file_uploads = On
    upload_max_filesize = 2M
    max_file_uploads = 20
    allow_url_fopen = On
    allow_url_include = Off
    default_socket_timeout = 60
    
    ;;;; ---- EXTENSIONS USUELLES ---- ;;;;
    extension=zip
    extension=bz2
    extension=curl
    extension=fileinfo
    extension=gd
    extension=gettext
    extension=intl
    extension=ldap
    extension=mbstring
    extension=exif      ; Must be after mbstring as it depends on it
    extension=mysqli
    extension=odbc
    extension=openssl
    extension=pdo_mysql
    extension=pdo_odbc
    extension=pdo_pgsql
    extension=pdo_sqlite
    extension=pgsql
    extension=soap
    extension=sodium
    extension=sqlite3
    extension=tidy
    extension=xsl
    zend_extension=opcache
    error_log = "C:\Windows\Temp\FastCGI - PHP_errors.log"
    upload_tmp_dir = "C:\Windows\Temp\"
    cgi.fix_pathinfo = 1
    ;;;; --------------------------------------- ;;;;
    
    [CLI Server]
    cli_server.color = On
    [Date]
    date.timezone = Europe/Paris
    [Pdo_mysql]
    pdo_mysql.default_socket=
    [mail function]
    SMTP = localhost
    smtp_port = 25
    mail.add_x_header = Off
    [ODBC]
    odbc.allow_persistent = On
    odbc.check_persistent = On
    odbc.max_persistent = -1
    odbc.max_links = -1
    odbc.defaultlrl = 4096
    odbc.defaultbinmode = 1
    [MySQLi]
    mysqli.max_persistent = -1
    mysqli.allow_persistent = On
    mysqli.max_links = -1
    mysqli.default_port = 3306
    mysqli.default_socket =
    mysqli.default_host =
    mysqli.default_user =
    mysqli.default_pw =
    mysqli.reconnect = Off
    [mysqlnd]
    mysqlnd.collect_statistics = On
    mysqlnd.collect_memory_statistics = Off
    [PostgreSQL]
    pgsql.allow_persistent = On
    pgsql.auto_reset_persistent = Off
    pgsql.max_persistent = -1
    pgsql.max_links = -1
    pgsql.ignore_notice = 0
    pgsql.log_notice = 0
    [bcmath]
    bcmath.scale = 0
    [Session]
    session.save_handler = files
    session.use_strict_mode = 0
    session.use_cookies = 1
    session.use_only_cookies = 1
    session.name = PHPSESSID
    session.auto_start = 0
    session.cookie_lifetime = 0
    session.cookie_path = /
    session.cookie_domain =
    session.cookie_httponly = 1
    session.cookie_samesite =
    session.serialize_handler = php
    session.gc_probability = 1
    session.gc_divisor = 1000
    session.gc_maxlifetime = 1440
    session.referer_check =
    session.cache_limiter = nocache
    session.cache_expire = 180
    session.use_trans_sid = 0
    session.sid_length = 26
    session.trans_sid_tags = "a=href,area=href,frame=src,form="
    session.sid_bits_per_character = 5
    session.save_path = "C:\Windows\Temp\"
    [Assertion]
    zend.assertions = -1
    [Tidy]
    tidy.clean_output = Off
    [soap]
    soap.wsdl_cache_enabled=1
    soap.wsdl_cache_dir="/tmp"
    soap.wsdl_cache_ttl=86400
    soap.wsdl_cache_limit = 5
    [ldap]
    ldap.max_links = -1
    [opcache]
    opcache.enable=1
    [PHP_OPCACHE]
    extension=php_opcache.dll
    '@
    
    # Créer ou remplacer le fichier C:\PHP\php.ini avec le contenu spécifié
    Set-Content -Path "C:\PHP\php.ini" -Value $content 

     

     


    votre commentaire
  • 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

    votre commentaire
  • Nginx n'est pas réservé qu'au monde Unix. 
    Il est également possible de le faire tourner sur Windows Serveur en tant que serveur web (et pas que proxy) (bien qu'on puisse raisonnablement se demander si c'est une bonne idée).

    Voici un petit script PowerShell que j'ai écris pour faire le travail d'installation d'Nginx et de PHP en un instant : (ouvrir ISE en mode Administrateur, copier/coller le script ci-dessous, puis exécuter).
    Et histoire d'avoir une pensée émouvante pour IIS, j'ai appelé le dossier racine des sites "wwwroot"...

    Après cette installation, il ne restera plus qu'un serveur SQL à installer vous-même pour avoir la stack complète pour faire tourner ce que vous voulez. (j'ai ajouté l'installation et la configuration PHP au script ce vendredi 7 vers 16h30)

    Add-Type -AssemblyName System.Windows.Forms
    
    # Demande à l'utilisateur s'il souhaite installer Nginx à l'aide d'une MessageBox
    $UserChoice = [System.Windows.Forms.MessageBox]::Show("Voulez-vous installer Nginx?", "Installation de Nginx", [System.Windows.Forms.MessageBoxButtons]::YesNo, [System.Windows.Forms.MessageBoxIcon]::Question)
    
    if ($UserChoice -eq "Yes") {
    
        $DownloadURL = "https://nginx.org/download/nginx-1.25.2.zip"
        $DownloadPath = "C:\Nginx.zip"
        
        # Télécharge Nginx
        Invoke-WebRequest -Uri $DownloadURL -OutFile $DownloadPath
        
        # Décompresse Nginx
        Expand-Archive -Path $DownloadPath -DestinationPath "C:\"
        
        # Déplace le dossier décompressé
        Move-Item -Path "C:\nginx-1.25.2" -Destination "C:\NGINX"
        
        # Crée un dossier wwwroot et sous-dossier default_site
        New-Item -Path "C:\NGINX\wwwroot" -ItemType Directory
        New-Item -Path "C:\NGINX\wwwroot\default_site" -ItemType Directory
    
        # Déplace le fichier index.html
        Move-Item -Path "C:\NGINX\html\index.html" -Destination "C:\NGINX\wwwroot\default_site"
    
        # Modifie le fichier nginx.conf
        $nginxConfPath = "C:\NGINX\conf\nginx.conf"
        $nginxConfContent = Get-Content $nginxConfPath
        $newNginxConfContent = $nginxConfContent -replace 'root   html;', 'root   wwwroot/default_site;'
        Set-Content -Path $nginxConfPath -Value $newNginxConfContent
    
        # Ajoute C:\NGINX au PATH
        $newPath = "C:\NGINX;" + [System.Environment]::GetEnvironmentVariable("Path", "Machine")
        [System.Environment]::SetEnvironmentVariable("Path", $newPath, [System.EnvironmentVariableTarget]::Machine)
        
        # Recharge les variables d'environnement
        [System.Environment]::SetEnvironmentVariable("Path", [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User"), [System.EnvironmentVariableTarget]::Machine)
        
        # Ouvrir C:\NGINX
        Invoke-Item "C:\NGINX"
        
        Start-Sleep -seconds 2 
    
       
        # Supprime le fichier Nginx.zip téléchargé
        Remove-Item -Path $DownloadPath
    
        # Affiche un message de succès et propose d'installer PHP
        $response = [System.Windows.Forms.MessageBox]::Show("Nginx a été téléchargé, décompressé et ajouté au PATH avec succès.`nLe dossier racine de vos sites est C:\NGINX\wwwroot.`nA l'intérieur, vous y trouverez notamment le site par défaut 'default_site'`n`nPour démarrer Nginx, double-cliquez sur nginx.exe dans la fenêtre qui vient d'apparaître, vous pourrez ensuite afficher le site par défaut en utilisant l'URL http://127.0.0.1`n`nVoulez-vous installer et configurer PHP pour Nginx à présent ?", "Installation terminée", [System.Windows.Forms.MessageBoxButtons]::YesNo, [System.Windows.Forms.MessageBoxIcon]::Information)
    
        if ($response -eq "Yes") {
        # Exécutez les commandes PowerShell ici pour installer et configurer PHP
        
    # Vérifier si le dossier C:\Temp existe, sinon le créer
    if (-not (Test-Path "C:\Temp")) {
        New-Item -Path "C:\Temp" -ItemType Directory
    }
    
    
    ######################################################
    # INSTALLER PHP ET VCS
    
    # Définir l'URL et le chemin de destination pour le téléchargement
    $VCUrl = "https://aka.ms/vs/16/release/VC_redist.x64.exe"
    $destinationPath = "C:\Temp\VC_redist.x64.exe"
    
    # Télécharger VC
    Invoke-WebRequest -Uri $VCUrl -OutFile $destinationPath
    
    # Installer VC
    Start-Process -Wait -FilePath "$destinationPath" -ArgumentList "/S" -PassThru
    
    # Télécharger et Installer PHP 8.2.10
    $PHPUrl="https://windows.php.net/downloads/releases/php-8.2.10-nts-Win32-vs16-x64.zip"
    $destinationPath = "C:\Temp\php-8.2.10-nts-Win32-vs16-x64.zip"
    Invoke-WebRequest -Uri $PHPUrl -OutFile $destinationPath
    
    New-Item -Path "C:\PHP" -ItemType directory
    Expand-Archive -LiteralPath $destinationPath -DestinationPath "C:\PHP"
    
    # 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);C:\PHP"
    # Recharger les variables d'environnement :
    $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
    
    
    ######################################################
    # CHARGER LES EXTENSIONS PHP NECESSAIRES :
    
    # Le contenu du fichier php.ini
    $content = @'
    [PHP]
    engine = On
    short_open_tag = Off
    precision = 14
    output_buffering = 4096
    zlib.output_compression = Off
    implicit_flush = Off
    unserialize_callback_func =
    serialize_precision = -1
    disable_functions =
    disable_classes =
    zend.enable_gc = On
    zend.exception_ignore_args = On
    zend.exception_string_param_max_len = 0
    expose_php = On
    max_execution_time = 300
    max_input_time = 60
    memory_limit = 128M
    error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
    display_errors = Off
    display_startup_errors = Off
    log_errors = On
    ignore_repeated_errors = Off
    ignore_repeated_source = Off
    report_memleaks = On
    variables_order = "GPCS"
    request_order = "GP"
    register_argc_argv = Off
    auto_globals_jit = On
    post_max_size = 8M
    auto_prepend_file =
    auto_append_file =
    default_mimetype = "text/html"
    default_charset = "UTF-8"
    doc_root =
    user_dir =
    extension_dir = "C:\PHP\ext"
    enable_dl = Off
    cgi.force_redirect = 0
    file_uploads = On
    upload_max_filesize = 2M
    max_file_uploads = 20
    allow_url_fopen = On
    allow_url_include = Off
    default_socket_timeout = 60
    
    ;;;; ---- EXTENSIONS USUELLES ---- ;;;;
    extension=zip
    extension=bz2
    extension=curl
    extension=fileinfo
    extension=gd
    extension=intl
    extension=ldap
    extension=mbstring
    extension=exif
    extension=mysqli
    extension=openssl
    extension=sodium
    zend_extension=opcache
    error_log  = "C:\Windows\Temp\FastCGI - PHP_errors.log"
    upload_tmp_dir = "C:\Windows\Temp\"
    cgi.fix_pathinfo = 1
    fastcgi.impersonate = 1
    ;;;; --------------------------------------- ;;;;
    
    [CLI Server]
    cli_server.color = On
    [Date]
    date.timezone = Europe/Paris
    [Pdo_mysql]
    pdo_mysql.default_socket=
    [mail function]
    SMTP = localhost
    smtp_port = 25
    mail.add_x_header = Off
    [ODBC]
    odbc.allow_persistent = On
    odbc.check_persistent = On
    odbc.max_persistent = -1
    odbc.max_links = -1
    odbc.defaultlrl = 4096
    odbc.defaultbinmode = 1
    [MySQLi]
    mysqli.max_persistent = -1
    mysqli.allow_persistent = On
    mysqli.max_links = -1
    mysqli.default_port = 3306
    mysqli.default_socket =
    mysqli.default_host =
    mysqli.default_user =
    mysqli.default_pw =
    mysqli.reconnect = Off
    [mysqlnd]
    mysqlnd.collect_statistics = On
    mysqlnd.collect_memory_statistics = Off
    [PostgreSQL]
    pgsql.allow_persistent = On
    pgsql.auto_reset_persistent = Off
    pgsql.max_persistent = -1
    pgsql.max_links = -1
    pgsql.ignore_notice = 0
    pgsql.log_notice = 0
    [bcmath]
    bcmath.scale = 0
    [Session]
    session.save_handler = files
    session.use_strict_mode = 0
    session.use_cookies = 1
    ;session.cookie_secure = 1
    session.use_only_cookies = 1
    session.name = PHPSESSID
    session.auto_start = 0
    session.cookie_lifetime = 0
    session.cookie_path = /
    session.cookie_domain =
    session.cookie_httponly = 1
    session.cookie_samesite =
    session.serialize_handler = php
    session.gc_probability = 1
    session.gc_divisor = 1000
    session.gc_maxlifetime = 1440
    session.referer_check =
    session.cache_limiter = nocache
    session.cache_expire = 180
    session.use_trans_sid = 0
    session.sid_length = 26
    session.trans_sid_tags = "a=href,area=href,frame=src,form="
    session.sid_bits_per_character = 5
    [Assertion]
    zend.assertions = -1
    [Tidy]
    tidy.clean_output = Off
    [soap]
    soap.wsdl_cache_enabled=1
    soap.wsdl_cache_dir="/tmp"
    soap.wsdl_cache_ttl=86400
    soap.wsdl_cache_limit = 5
    [ldap]
    ldap.max_links = -1
    '@
    
    # Créer ou remplacer le fichier C:\PHP\php.ini avec le contenu spécifié
    Set-Content -Path "C:\PHP\php.ini" -Value $content
    
    ######################################################
    # CONFIGURER LA COMMUNICATION ENTRE PHP ET NGINX :
    
    # Spécifiez le chemin du fichier cible
    $fichierCible = "C:\NGINX\conf\nginx.conf"
    
    # Le contenu modifié que vous souhaitez insérer dans le fichier
    $contenu = @"
    
    #user  nobody;
    worker_processes  1;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        #log_format  main  '`$remote_addr - `$remote_user [$time_local] "`$request" '
        #                  '`$status $body_bytes_sent "`$http_referer" '
        #                  '"`$http_user_agent" "`$http_x_forwarded_for"';
    
        #access_log  logs/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        #gzip  on;
    
        server {
            listen       80;
            server_name  localhost;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                root   wwwroot/default_site;
                index  index.html index.htm index.php;
            }
    
            #error_page  404              /404.html;
    
            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   wwwroot/default_site;
            }
    
            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
            #
            #location ~ \.php$ {
            #    proxy_pass   http://127.0.0.1;
            #}
    
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            location ~ \.php$ {
                root           wwwroot/default_site;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  `$document_root`$fastcgi_script_name;
                include        fastcgi_params;
            }
    
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /\.ht {
            #    deny  all;
            #}
        }
    
    
        # another virtual host using mix of IP-, name-, and port-based configuration
        #
        #server {
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
    
        #    location / {
        #        root   wwwroot/VHOST_SITE;
        #        index  index.html index.htm index.php;
        #    }
        #    location ~ \.php$ {
        #        root           wwwroot/VHOST_SITE;
        #        fastcgi_pass   127.0.0.1:9000;
        #        fastcgi_index  index.php;
        #        fastcgi_param  SCRIPT_FILENAME  `$document_root`$fastcgi_script_name;
        #        include        fastcgi_params;
        #    }
        #}
    
    
        # HTTPS server
        #
        #server {
        #    listen       443 ssl;
        #    server_name  VHOST_SITE;
    
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
    
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
    
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
    
        #    location / {
        #        root   wwwroot/VHOST_SITE;
        #        index  index.html index.htm index.php;
        #    }
        #    location ~ \.php$ {
        #        root           wwwroot/VHOST_SITE;
        #        fastcgi_pass   127.0.0.1:9000;
        #        fastcgi_index  index.php;
        #        fastcgi_param  SCRIPT_FILENAME  `$document_root`$fastcgi_script_name;
        #        include        fastcgi_params;
        #    }
        #}
    
    }
    
    "@
    
    # Remplace le contenu du fichier avec le nouveau contenu
    Set-Content -Path $fichierCible -Value $contenu -Force
    
    # Confirme que le fichier a été modifié
    Write-Host "Fichier $fichierCible modifié avec succès!"
    
    
        }
        # Ouvrir C:\NGINX
        Invoke-Item "C:\NGINX"
    
        # Remplacer la page index.html du default_site par une page de code PHP
        $contenu = @"
    <?php
    phpinfo();
    ?>
    "@
        Set-Content -Path C:\NGINX\wwwroot\default_site\index.html -Value $contenu -Force
        Rename-Item -Path C:\NGINX\wwwroot\default_site\index.html -NewName "index.php"
            
        # Lancer PHP en tâche de fond
        Import-Module PSReadline
        Start-Job -ScriptBlock {
            & "C:\PHP\php-cgi.exe" -b 127.0.0.1:9000
        }
    
        # Stopper nginx
        Stop-Process -Name "nginx" -Force
    
        [System.Windows.Forms.MessageBox]::Show("PHP a bien été installé et configuré pour Nginx.`nJ'ai remplacé la page index.html du default_site par la page de version de PHP. Veuillez double-cliquer sur nginx.exe dans la fenêtre qui s'est affichée puis cliquez sur Oui ci-dessous", "Installation terminée", [System.Windows.Forms.MessageBoxButtons]::YesNo, [System.Windows.Forms.MessageBoxIcon]::Information)
        if ($response -eq "Yes") {
            # Afficher la page de version php.
            Start-Process "msedge" -ArgumentList "http://localhost"
        }
    
    
    
    }

    Vous pouvez arrêter nginx dans le gestionnaire des tâches.

     


    votre commentaire
  • Openfire est un excellent serveur XMPP, permettant de mettre en place des messageries, tchats, salons de discussion etc..

    Il est relativement simple à installer et à configurer (même s'il faut y passer un peu de temps pour bien tout comprendre car la console est très riche de réglages en tous genres. Vous pouvez y joindre du SIP, de la VoIP etc...).

    Dans ce tuto, je vous montre comment procéder pour déployer Openfire sur Windows Server 2022, créer un utilisateur, créer un salon de discussion, ya inclure des membres et ajouter quelques règles, permettre le transfert de fichiers entre utilisateurs (en https) et administrer a minima.

    Plutôt que d'utiliser Discord, faîtes le vous-même avec Openfire !

    1) Mettre en place les redirections de ports DNAT sur votre box ou pare-feu

    - Si l'objectif est de mettre à disposition une messagerie/salons accessibles depuis internet, alors il faut mettre en place une redirection de ports sur la box ou le pare-feu du réseau hébergeant le serveur openfire (avec ou sans masquarade, proxy etc... à vous de voir), pensez également à la certification SSL dans ce cas (ou pas, à vous de voir). Openfire s'autosigne par défaut.
    - Si vous souhaitez rester sur votre réseau interne, alors passez directement à 2)


    Voici les ports à DNATer :
    WAN Address:5222 -> IP-SRV-OPENFIRE:5222
    WAN Address:5223 -> IP-SRV-OPENFIRE:5223
    WAN Address:7443 -> IP-SRV-OPENFIRE:7443
    WAN Address:9091 -> IP-SRV-OPENFIRE:9091

    Vous pouvez, bien entendu, modifier les sockets. Il faudra juste que vous pensiez aux clients que vous utiliserez, certains ne sont pas très tolérants aux changements de ces ports par défaut :-S.

    2) Ouvrir les ports sur le pare-feu windows.

    Openfire ne modifie pas le pare-feu Windows... Il faut le faire nous-mêmes, autrement rien ne passera !

    Allez dans le pare-feu -> paramètres avancés -> Règles de trafic entrant
    Nouvelle règle... : 
    - Type de règle : Port
    - Application à TCP, Ports locaux spécifiques : 5222,5223,7443,9091
    - Autoriser la connexion
    - Domaine/Privé/Public
    - Nom : Openfire

    3) Procéder à l'installation d'Openfire (d'autres articles existent pour cette installation, notamment pour du serveur Core)

    - installer JDK :

    Ouvrez PowerShell et copiez/collez :

    New-Item -Path "C:\Temp" -ItemType directory
    Invoke-WebRequest -Uri https://aka.ms/download-jdk/microsoft-jdk-17.0.7-windows-x64.msi -Outfile C:\Temp\microsoft-jdk-17.0.7.windows-x64.msi
    Set-Location "C:\Temp"
    MsiExec /i microsoft-jdk-17.0.7.windows-x64.msi

    L'installeur se lance, faîtes par défaut pour tout, pas de JAVA_HOME path surtout.

    - installer openfire :
    Ouvrez PowerShell et copiez/collez :

    Set-Location "C:\Temp"
    Invoke-WebRequest -Uri "https://www.igniterealtime.org/downloadServlet?filename=openfire/openfire_4_7_5_x64.exe" -Outfile "C:\Temp\openfire_4_7_5_x64.exe" .\openfire_4_7_5_x64.exe

    L'installeur se lance, faîtes par défaut pour tout.
    A l'issue de l'installation, Edge s'ouvre et vous affiche la console web (soyez patient, ça peu prendre 30 secondes. Si vous faîtes l'installation sur un serveur en Core, il faudra ouvrir un tunnel SSH (voir l'article à ce sujet).


    4) Premiers pas sur la console Web :

    Tout d'abord, par défaut, Openfire ouvre 2 ports pour permettre de se connecter à la console : le 9090 en http (pour une connexion directe depuis le serveur Windows avec environnement de bureau (ou via un tunnel SSH pour du Core) et le 9091 en https, pour se connecter à distance (raison pour laquelle je vous propose de DNATer ce port au début)

    Une fois la console Web ouverte pour la première fois (http://localhost:9090), il faut initialiser Openfire :
    - Langue : Français

    - XMPP Domain Name : le hostname de votre serveur (si votre messagerie n'est pas prévue pour être accessible en dehors du réseau) ou votre domaine (si votre messagerie est prévue pour être accessible en dehors du réseau) !
    Si vous êtes derrière une box avec adressage IP dynamique, faîtes un tour du côté de noip.com ! (dans ce cas, c'est le hostname créé sur noip qu'il faut indiquer ici)

    - Server Host Name (FQDN) : idem question précédente !
    - Admin Console Port : 9090
    - Secure Admin Console Port : 9091
    - Property Encryption via : Blowfish (pour rester simple...)

    Paramètres de base de données :
    - Embedded Database (à moins que vous ne comptiez mettre en place une messagerie pour 2000 personnes... prenez la base de données embarquées... elle est largement suffisante).

    Paramètres Profils :
    - Par Défault

    Administrator Account :
    - Admin Email Address : l'email de l'administrateur ou admin@example.com pour tester

    - New Password : UN TRUC COSTAUD !!! SURTOUT SI VOUS COMPTEZ ADMINISTRER DEPUIS INTERNET.

    L'initialisation est terminée, vous pouvez à présent vous loguer pour accéder à l'interface d'administration.

    5) Empêcher les connexions des utilisateurs non chiffrées 

    Une fois sur la console d'administration, vous pouvez voir les différents ports et les services par défaut offerts par Openfire. Mais la première des choses à faire, c'est d'empêcher les utilisateurs de se connecter au serveur en clair.
    Suivez le chemin :
    - Serveur -> Paramètres du Serveur -> Client Connections Settings -> Plain-text -wih STARTTLS) connections -> Advanced configuration 
                   -> STARTTLS Policy : Required
                   -> Encryption Protocols : + SSL v3
    (Ne pas oublier de sauvegarder les paramètres en bas de la page)


    6) Empêcher les utilisateurs de pouvoir créer leur propre compte sur le serveur et de modifier le mot de passe à leur guise

    Personnellement, je ne permets pas ce genre de comportement. Trop dangereux.

    Suivez le chemin :
    - Serveur -> Paramètres du Serveur -> Inscription & Authentification
                   -> Inband Account Registration : Disabled
                   -> Change Password : Disabled
    (Ne pas oublier de sauvegarder les paramètres en bas de la page)

    7) Installer des plugins pour enrichir les fonctionnalités de notre serveur Openfire

    Suivez le chemin :
    Plugins -> Available Plugins
    Ajoutez les plugins que vous voulez. Je vous en mets quelques uns de très utiles :
    - Bookmarks
    - HTTP File Upload (pour échanger des fichiers via SSL.. Juste fondamental)
    - Monitoring Service
    - Packet Filter
    - Rdp

    8) Créez vos utilisateurs :

    Vous avez la possibilité de connecter un annuaire LDAP ou de faire à la main. A vous de voir.
    A la main, c'est simple :
    - Utilisateurs/Groupes -> Créer un nouvel utilisateur

    9) Créer un salon de discussion et y ajouter des membres :

    - Salon de discussion -> Créer un nouveau Salon de Discussion :
         ID du salon : c'est son adresse ! Exemple : linux@conference.VOTRE-DOMAINE.TRUC
         Nom du Salon : Salon Linux
    De manière générale, il vaut mieux cocher "Rendre le salon réservé aux membres uniquement"
    Laisser le reste par défaut, sauvegarder les modifications.

    Pour ajouter des membres au salon :
    - Salon de discussion -> Administration de Salon de Discussion, Cliquer sur le salon créé
         -> Permissions Utilisateur, Sélectionner "Membre" au lieu de "Propriétaire dans le menu déroulant, puis ajouter vos utilisateurs !

    9) Relancer OpenFire.

    Cette étape est indispensable pour pouvoir accéder à la console web depuis l'extérieur du réseau (via le port 9091).
    Il n'est pas possible de relancer le serveur Openfire depuis la console d'administration web.. Il faut utiliser les services windows pour cela.
    - Déconnectez-vous de la console web en premier lieu;
    - Allez dans les services windows (services.msc), trouvez Openfire, arrêtez-le et relancez-le.

    10) Configurez vos clients .

    - Sur un poste client, SPARK existe toujours et semble connaître une nouvelle jeunesse.
    C'est également un projet d'ignite realtime (comme openfire).
    Pour configurer Spark, installez-le en version 64-bit.

    Pour le configurer :
    lorsque vous lancez l'application pour la première fois, entrez le nom d'un des utilisateurs créé sur le serveur Openfire, son domaine (ou à défaut sn hostname), son mot de passe, puis cliquez sur "Advanced". 
    Dans l'onglet Security, Encryption mode : Required + Utiliser l'ancienne méthode SSL

    - Sur Android : Conversations (ou d'autres... car il y en a plusieurs, et certaines sont gratuites).
    Vous allez rapidement trouver comment configurer un compte.
    Adresse XMPP : user@hostname-ou-domaine
    La connexion au serveur peut prendre quelques instants, pas de panique.
    Pour rejoindre un salon, c'est "rejoindre un canal public.


    votre commentaire
  • De même que pour GLPI et Wordpress, je publie un script pour Concrete 9.3.2

    Le script fonctionne parfaitement et déploie automatiquement IIS, PHP configuré et la dernière version de Concrete sur windows server 2022.
    Il suffit de copier/coller tout le script dans un shell puis de taper "INSTALLER.CONCRETE"
    Pour exécuter le script, je vous suggère de lancer Powershell ISE, d'ouvrir le script et de l'exécuter.
    Il y a des moments d'exécution en tâche de fond, sans indication.. Donc attendez l'écran final !

    La console web de Concrete est directement accessible via l'URL : http://127.0.0.1 (ou l'IP de votre serveur Core) une fois l'exécution du script terminée.
    Il vous faudra néanmoins appliquer les recommandations de durcissement de Concrete après l'initialisation.

     

     

    Voici le script :

    function fINSTALLER.CONCRETE {
    
    ####################################
    # INSTALLATION DE IIS
    
    # (5) - Installer IIS
    Install-WindowsFeature -Name Web-Server
    # Installe les outils de gestion, y compris la console de gestion IIS
    Install-WindowsFeature -Name Web-Mgmt-Tools
    # Installe les fonctionnalités HTTP communes
    Install-WindowsFeature -Name Web-Default-Doc
    Install-WindowsFeature -Name Web-Dir-Browsing
    Install-WindowsFeature -Name Web-Http-Errors
    Install-WindowsFeature -Name Web-Static-Content
    # Installe les fonctionnalités d'intégrité et de diagnostic
    Install-WindowsFeature -Name Web-Http-Logging
    # Installe les fonctionnalités de performance
    Install-WindowsFeature -Name Web-Stat-Compression
    # Installe les fonctionnalités de sécurité
    Install-WindowsFeature -Name Web-Request-Monitor
    # Installer FastCGI
    Install-WindowsFeature -Name Web-CGI
    # Redémarrer le service IIS
    Restart-Service w3svc
    
    
    ####################################
    # INSTALLATION DE MARIADB 11.4
    
    # Vérifier si le dossier C:\Temp existe, sinon le créer
    if (-not (Test-Path "C:\Temp")) {
        New-Item -Path "C:\Temp" -ItemType Directory
    }
    
    # Définir l'URL et le chemin de destination pour le téléchargement
    $mariadbUrl = "https://mirrors.ircam.fr/pub/mariadb/mariadb-11.4.2/winx64-packages/mariadb-11.4.2-winx64.msi"
    $destinationPath = "C:\Temp\mariadb-11.4.2-winx64.msi"
    
    # Télécharger MariaDB
    Invoke-WebRequest -Uri $mariadbUrl -OutFile $destinationPath
    
    # Installer MariaDB, configurer le service mariadb et le démarrer
    msiexec /i "C:\Temp\mariadb-11.4.2-winx64.msi" /qn
    Start-sleep -seconds 30
    Set-Location "C:\Program Files\MariaDB 11.4\bin" 
    .\mysqld.exe --install
    Start-sleep -Seconds 10
    # L'installation est répétée une seconde fois car plusieurs erreurs étranges sont parfois survenues.
    # Ne tenez pas compte de l'erreur 'FATAL ERREUR' si elle s'affiche.
    .\mysqld.exe --install
    Start-Service -Name 'MySQL'
    Start-Sleep -Seconds 5
    
    # 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);C:\Program Files\MariaDB 11.4\bin"
    # Recharger les variables d'environnement :
    $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
    Write-Host " "
    
    
    
    ####################################
    # CREATION DE LA BASE SQL POUR CONCRETE
    
    
    # Création de la base SQL pour CONCRETE
    $rootPassword = Read-Host "ENTRER LE MOT DE PASSE ROOT POUR MARIADB"
    $dbName = Read-Host "ENTRER LE NOM POUR LA BASE CONCRETE"
    $dbUser = Read-Host "ENTRER UN NOM POUR L'UTILISATEUR ADMINISTRATEUR DE LA BASE CONCRETE"
    $dbPassword = Read-Host "ENTRER UN MOT DE PASSE POUR L'UTILISATEUR ADMINISTRATEUR"
    Set-Location "C:\Program Files\MariaDB 11.4\bin" 
    .\mysqladmin.exe -uroot create "$dbName"
    .\mariadb.exe -uroot -e"CREATE USER '${dbUser}'@'localhost' IDENTIFIED BY '${dbPassword}'"
    .\mariadb.exe -uroot -e"GRANT ALL ON ${dbName}.* TO '${dbUser}'@'localhost'"
    
    
    ######################################################
    # INSTALLER PHP 8.3.7 ET VCS 16
    
    # Définir l'URL et le chemin de destination pour le téléchargement
    $VCUrl = "https://aka.ms/vs/16/release/VC_redist.x64.exe"
    $destinationPath = "C:\Temp\VC_redist.x64.exe"
    
    # Télécharger VC
    Invoke-WebRequest -Uri $VCUrl -OutFile $destinationPath
    
    # Installer VC
    Start-Process -Wait -FilePath "$destinationPath" -ArgumentList "/S" -PassThru
    
    # Télécharger et Installer PHP 8.3.7
    $PHPUrl="https://windows.php.net/downloads/releases/php-8.3.7-nts-Win32-vs16-x64.zip"
    $destinationPath = "C:\Temp\php-8.3.7-nts-Win32-vs16-x64.zip"
    Invoke-WebRequest -Uri $PHPUrl -OutFile $destinationPath
    
    New-Item -Path "C:\PHP" -ItemType directory
    Expand-Archive -LiteralPath $destinationPath -DestinationPath "C:\PHP"
    
    # 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);C:\PHP"
    # Recharger les variables d'environnement :
    $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
    
    
    ######################################################
    # CHARGER LES EXTENSIONS PHP NECESSAIRES :
    
    # Le contenu du fichier php.ini
    $content = @'
    [PHP]
    engine = On
    short_open_tag = Off
    precision = 14
    output_buffering = 4096
    zlib.output_compression = Off
    implicit_flush = Off
    unserialize_callback_func =
    serialize_precision = -1
    disable_functions =
    disable_classes =
    zend.enable_gc = On
    zend.exception_ignore_args = On
    zend.exception_string_param_max_len = 0
    expose_php = On
    max_execution_time = 300
    max_input_time = 60
    memory_limit = 256M
    error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
    display_errors = Off
    display_startup_errors = Off
    log_errors = On
    ignore_repeated_errors = Off
    ignore_repeated_source = Off
    report_memleaks = On
    variables_order = "GPCS"
    request_order = "GP"
    register_argc_argv = Off
    auto_globals_jit = On
    post_max_size = 8M
    auto_prepend_file =
    auto_append_file =
    default_mimetype = "text/html"
    default_charset = "UTF-8"
    doc_root =
    user_dir =
    extension_dir = "C:\PHP\ext"
    enable_dl = Off
    cgi.force_redirect = 0
    fastcgi.impersonate = 1
    file_uploads = On
    upload_max_filesize = 2M
    max_file_uploads = 20
    allow_url_fopen = On
    allow_url_include = Off
    default_socket_timeout = 60
    
    ;;;; ---- EXTENSIONS NECESSAIRES A CONCRETE ---- ;;;;
    extension=zip
    extension=bz2
    extension=curl
    extension=fileinfo
    extension=gd
    extension=gettext
    extension=intl
    extension=ldap
    extension=mbstring
    extension=exif      ; Must be after mbstring as it depends on it
    extension=mysqli
    extension=odbc
    extension=openssl
    extension=pdo_mysql
    extension=pdo_odbc
    extension=pdo_pgsql
    extension=pdo_sqlite
    extension=pgsql
    extension=soap
    extension=sodium
    extension=sqlite3
    extension=tidy
    extension=xsl
    zend_extension=opcache
    error_log = "C:\Windows\Temp\FastCGI - PHP_errors.log"
    upload_tmp_dir = "C:\Windows\Temp\"
    cgi.fix_pathinfo = 1
    ;;;; --------------------------------------- ;;;;
    
    [CLI Server]
    cli_server.color = On
    [Date]
    date.timezone = Europe/Paris
    [Pdo_mysql]
    pdo_mysql.default_socket=
    [mail function]
    SMTP = localhost
    smtp_port = 25
    mail.add_x_header = Off
    [ODBC]
    odbc.allow_persistent = On
    odbc.check_persistent = On
    odbc.max_persistent = -1
    odbc.max_links = -1
    odbc.defaultlrl = 4096
    odbc.defaultbinmode = 1
    [MySQLi]
    mysqli.max_persistent = -1
    mysqli.allow_persistent = On
    mysqli.max_links = -1
    mysqli.default_port = 3306
    mysqli.default_socket =
    mysqli.default_host =
    mysqli.default_user =
    mysqli.default_pw =
    mysqli.reconnect = Off
    [mysqlnd]
    mysqlnd.collect_statistics = On
    mysqlnd.collect_memory_statistics = Off
    [PostgreSQL]
    pgsql.allow_persistent = On
    pgsql.auto_reset_persistent = Off
    pgsql.max_persistent = -1
    pgsql.max_links = -1
    pgsql.ignore_notice = 0
    pgsql.log_notice = 0
    [bcmath]
    bcmath.scale = 0
    [Session]
    session.save_handler = files
    session.use_strict_mode = 0
    session.use_cookies = 1
    session.use_only_cookies = 1
    session.name = PHPSESSID
    session.auto_start = 0
    session.cookie_lifetime = 0
    session.cookie_path = /
    session.cookie_domain =
    session.cookie_httponly = 1
    session.cookie_samesite =
    session.serialize_handler = php
    session.gc_probability = 1
    session.gc_divisor = 1000
    session.gc_maxlifetime = 1440
    session.referer_check =
    session.cache_limiter = nocache
    session.cache_expire = 180
    session.use_trans_sid = 0
    session.sid_length = 26
    session.trans_sid_tags = "a=href,area=href,frame=src,form="
    session.sid_bits_per_character = 5
    session.save_path = "C:\Windows\Temp\"
    [Assertion]
    zend.assertions = -1
    [Tidy]
    tidy.clean_output = Off
    [soap]
    soap.wsdl_cache_enabled=1
    soap.wsdl_cache_dir="/tmp"
    soap.wsdl_cache_ttl=86400
    soap.wsdl_cache_limit = 5
    [ldap]
    ldap.max_links = -1
    [opcache]
    opcache.enable=1
    [PHP_OPCACHE]
    extension=php_opcache.dll
    '@
    
    # Créer ou remplacer le fichier C:\PHP\php.ini avec le contenu spécifié
    Set-Content -Path "C:\PHP\php.ini" -Value $content
    
    
    ######################################################
    # 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 CONCRETE 9.3.2 ET L'INSTALLER DANS C:\inetpub\wwwroot
    
    # URL de téléchargement
    $url = "https://www.concretecms.org/download_file/840b2424-2da6-479a-808c-fb79aa77755e/2658"
    
    # Chemin temporaire où le fichier sera téléchargé
    $tempPath = "C:\Temp\concrete.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
    Expand-Archive -Path "$tempPath" -DestinationPath "$wwwroot"
    
    # Trouver le dossier commençant par "concrete" dans le répertoire wwwroot
    $subFolder = Get-ChildItem -Path $wwwroot -Directory | Where-Object { $_.Name -like "concrete*" }
    
    # Renommer le dossier en "concrete" s'il est trouvé
    if ($subFolder.Count -eq 1) {
        $subFolderPath = $subFolder.FullName
        Rename-Item -Path $subFolderPath -NewName "concrete"
        Write-Host "Le dossier a été renommé en 'concrete'."
    } elseif ($subFolder.Count -gt 1) {
        Write-Host "Plus d'un dossier commençant par 'concrete' a été trouvé. Action annulée."
    } else {
        Write-Host "Aucun dossier commençant par 'concrete' n'a été trouvé."
    }
    
    
    ######################################################
    # CREER LE NOUVEAU SITE POUR CONCRETE :
    
    # Nom du nouveau site web
    $websiteName = "CONCRETE"
    
    # Chemin du dossier racine de CONCRETE
    $websitePath = "C:\inetpub\wwwroot\concrete"
    
    # 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
    Write-Host "Informations du nouveau site web :"
    Get-Website | Where-Object { $_.Name -eq $websiteName } | Select-Object Name, ID, State
    
    
    ######################################################
    # METTRE EN PLACE LE MAPPAGE DE MODULES PHP
    
    # Unlocker afin de pouvoir ajouter le module de mappage
    & $env:windir\system32\inetsrv\appcmd.exe unlock config -section:system.webServer/handlers
    
    Start-sleep -seconds 5
    
    
    $php = 'C:\PHP\php-cgi.exe'
    $configPath = get-webconfiguration 'system.webServer/fastcgi/application' | where-object { $_.fullPath -eq $php }
    if (!$configPath) {
        add-webconfiguration 'system.webserver/fastcgi' -value @{'fullPath' = $php }
    }
    
    
    $handlerName = "PHP 8.3.7"
    $handler = get-webconfiguration 'system.webserver/handlers/add' | where-object { $_.Name -eq $handlerName }
    if (!$handler) {
        add-webconfiguration 'system.webServer/handlers' -Value @{
            Name = $handlerName;
            Path = "*.php";
            Verb = "*";
            Modules = "FastCgiModule";
            scriptProcessor=$php;
            resourceType='Either' 
        }
    }
    
    # Configurer les paramètres de FastCGI
    $configPath = "system.webServer/fastCgi/application[@fullPath='$php']/environmentVariables/environmentVariable"
    $config = Get-WebConfiguration $configPath
    if (!$config) {
        $configPath = "system.webServer/fastCgi/application[@fullPath='$php']/environmentVariables"
        Add-WebConfiguration $configPath -Value @{ 'Name' = 'PHP_FCGI_MAX_REQUESTS'; Value = 10050 }
    }
    
    # Configure the settings
    # Available settings: 
    #     instanceMaxRequests, monitorChangesTo, stderrMode, signalBeforeTerminateSeconds
    #     activityTimeout, requestTimeout, queueLength, rapidFailsPerMinute, 
    #     flushNamedPipe, protocol   
    $configPath = "system.webServer/fastCgi/application[@fullPath='$php']"
    Set-WebConfigurationProperty $configPath -Name instanceMaxRequests -Value 10000
    Set-WebConfigurationProperty $configPath -Name monitorChangesTo -Value 'C:\PHP\php.ini'
    
    
    ######################################################
    # CREER UN DOCUMENT PAR DEFAUT POUR index.php
    
    # Ajoute "index.php" comme document par défaut
    Add-WebConfiguration -Filter "/system.webServer/defaultDocument/files" -PSPath "IIS:\Sites\$websiteName" -Value @{value='index.php'} -AtIndex 0
    
    Write-Host "Document par défaut ajouté."
    
    
    ######################################################
    # OCTROI DES DROITS D'ACCES
    
    $folders = @(
        "$websitePath"
    
    )
    
    $users = @("IIS_IUSRS", "Utilisateurs")
    
    foreach ($folder in $folders) {
        foreach ($user in $users) {
            Start-Process cmd.exe -ArgumentList "/c icacls `"$folder`" /grant `"$($user):(OI)(CI)M`"" -NoNewWindow -Wait
        }
    }
    
    
    ######################################################
    # RECHARGER IIS ET LA NOUVELLE CONFIG
    
    invoke-command -scriptblock {iisreset /restart }
    
    
    ######################################################
    # FIN DE L'INSTALLATION
    
    clear
    Write-Host "L'INSTALLATION DE CONCRETE EST TERMINEE"
    Write-Host "LE SITE EST ACCESSIBLE VIA http://IP-SERVEUR-CORE DEPUIS UN POSTE CLIENT SUR LE RESEAU"
    Write-Host "EN L'ETAT, L'INSTALLATION DU SITE N'EST PAS SECURISEE. IL FAUDRA REVOIR CELA"
    Write-Host " "
    Write-Host "PETIT AVERTISSEMENT :"
    Write-Host "POUR UNE RAISON QUE J'IGNORE, IL ARRIVE REGULIEREMENT, AU COURS DES TESTS, QUE L'INSTALLATION VIA LE NAVIGATEUR FOIRE LA PREMIERE FOIS"
    Write-Host "SI C'EST LE CAS, VOUS DEVREZ SIMPLEMENT SUPPRIMER LA BASE SQL CREEE ET LA RECREER, PUIS RELANCER L'INSTALLATION DANS VOTRE NAVIGATEUR."
    Write-Host "POUR CE FAIRE, COPIEZ/COLLEZ LES COMMANDES SUIVANTES LORSQUE L'INSTALLATION RATE, ET SUPPRIMEZ LA BASE LORSQUE DEMANDE. ELLE EST AUSSITOT RECREE."
    Write-Host '$rootPassword = Read-Host "ENTRER LE MOT DE PASSE ROOT POUR MARIADB"'
    Write-Host '$dbName = Read-Host "ENTRER LE NOM POUR LA BASE CONCRETE"'
    Write-Host '$dbUser = Read-Host "ENTRER UN NOM POUR LUTILISATEUR ADMINISTRATEUR DE LA BASE CONCRETE"'
    Write-Host '$dbPassword = Read-Host "ENTRER UN MOT DE PASSE POUR LUTILISATEUR ADMINISTRATEUR"'
    Write-Host 'Set-Location "C:\Program Files\MariaDB 11.4\bin" '
    Write-Host '.\mysqladmin.exe -uroot drop "$dbName"'
    Write-Host '.\mysqladmin.exe -uroot create "$dbName"'
    Write-Host '.\mariadb.exe -uroot -e"CREATE USER '${dbUser}'@'localhost' IDENTIFIED BY '${dbPassword}'"'
    Write-Host '.\mariadb.exe -uroot -e"GRANT ALL ON ${dbName}.* TO '${dbUser}'@'localhost'"'
    
    
    }
    
    New-Alias -Name INSTALLER.CONCRETE -Value fINSTALLER.CONCRETE

     


    votre commentaire
  • De même que pour GLPI, c'est un petit challenge personnel !

    Le script fonctionne parfaitement et déploie automatiquement IIS, PHP configuré et la dernière version de WORDPRESS (6.5.3) sur windows server 2022.
    Pour exécuter le script, je vous suggère de lancer Powershell ISE, d'ouvrir le script, de l'exécuter et de taper "INSTALLER.WORDPRESS"
    Il y a des moments d'exécution en tâche de fond, sans indication.. Donc attendez l'écran final !

    La console web de WORDPRESS est directement accessible via l'URL : http://127.0.0.1 ou l'IP du serveur Core une fois l'exécution du script terminée.
    Il vous faudra néanmoins appliquer les recommandations de durcissement de WORDPRESS après l'initialisation.

     

     

    Voici le script :

    function fINSTALLER.WORDPRESS {
    
    ####################################
    # INSTALLATION DE IIS
    
    # (5) - Installer IIS
    Install-WindowsFeature -Name Web-Server
    # Installe les outils de gestion, y compris la console de gestion IIS
    Install-WindowsFeature -Name Web-Mgmt-Tools
    # Installe les fonctionnalités HTTP communes
    Install-WindowsFeature -Name Web-Default-Doc
    Install-WindowsFeature -Name Web-Dir-Browsing
    Install-WindowsFeature -Name Web-Http-Errors
    Install-WindowsFeature -Name Web-Static-Content
    # Installe les fonctionnalités d'intégrité et de diagnostic
    Install-WindowsFeature -Name Web-Http-Logging
    # Installe les fonctionnalités de performance
    Install-WindowsFeature -Name Web-Stat-Compression
    # Installe les fonctionnalités de sécurité
    Install-WindowsFeature -Name Web-Request-Monitor
    # Installer FastCGI
    Install-WindowsFeature -Name Web-CGI
    # Redémarrer le service IIS
    Restart-Service w3svc
    
    ####################################
    # INSTALLATION DE MARIADB 11.4
    
    # Vérifier si le dossier C:\Temp existe, sinon le créer
    if (-not (Test-Path "C:\Temp")) {
        New-Item -Path "C:\Temp" -ItemType Directory
    }
    
    # Définir l'URL et le chemin de destination pour le téléchargement
    $mariadbUrl = "https://mirrors.ircam.fr/pub/mariadb/mariadb-11.4.2/winx64-packages/mariadb-11.4.2-winx64.msi"
    $destinationPath = "C:\Temp\mariadb-11.4.2-winx64.msi"
    
    # Télécharger MariaDB
    Invoke-WebRequest -Uri $mariadbUrl -OutFile $destinationPath
    
    # Installer MariaDB, configurer le service mariadb et le démarrer
    msiexec /i "C:\Temp\mariadb-11.4.2-winx64.msi" /qn
    Start-sleep -seconds 30
    Set-Location "C:\Program Files\MariaDB 11.4\bin" 
    .\mysqld.exe --install
    Start-sleep -Seconds 10
    # L'installation est répétée une seconde fois car plusieurs erreurs étranges sont parfois survenues.
    # Ne tenez pas compte de l'erreur 'FATAL ERREUR' si elle s'affiche.
    .\mysqld.exe --install
    Start-Service -Name 'MySQL'
    Start-Sleep -Seconds 5
    
    # 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);C:\Program Files\MariaDB 11.4\bin"
    # Recharger les variables d'environnement :
    $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
    Write-Host " "
    
    ####################################
    # CREATION DE LA BASE SQL POUR WORDPRESS
    
    
    # Création de la base SQL pour Wordpress
    $rootPassword = Read-Host "ENTRER LE MOT DE PASSE ROOT POUR MARIADB"
    $dbName = Read-Host "ENTRER LE NOM POUR LA BASE WORDPRESS"
    $dbUser = Read-Host "ENTRER UN NOM POUR L'UTILISATEUR ADMINISTRATEUR DE LA BASE WORDPRESS"
    $dbPassword = Read-Host "ENTRER UN MOT DE PASSE POUR L'UTILISATEUR ADMINISTRATEUR"
    Set-Location "C:\Program Files\MariaDB 11.4\bin" 
    .\mysqladmin.exe -uroot create "$dbName"
    .\mariadb.exe -uroot -e"CREATE USER '${dbUser}'@'localhost' IDENTIFIED BY '${dbPassword}'"
    .\mariadb.exe -uroot -e"GRANT ALL ON ${dbName}.* TO '${dbUser}'@'localhost'"
    
    
    
    ######################################################
    # INSTALLER PHP 8.3.7 ET VCS 16
    
    # Définir l'URL et le chemin de destination pour le téléchargement
    $VCUrl = "https://aka.ms/vs/16/release/VC_redist.x64.exe"
    $destinationPath = "C:\Temp\VC_redist.x64.exe"
    
    # Télécharger VC
    Invoke-WebRequest -Uri $VCUrl -OutFile $destinationPath
    
    # Installer VC
    Start-Process -Wait -FilePath "$destinationPath" -ArgumentList "/S" -PassThru
    
    # Télécharger et Installer PHP 8.3.7
    $PHPUrl="https://windows.php.net/downloads/releases/php-8.3.7-nts-Win32-vs16-x64.zip"
    $destinationPath = "C:\Temp\php-8.3.7-nts-Win32-vs16-x64.zip"
    Invoke-WebRequest -Uri $PHPUrl -OutFile $destinationPath
    
    New-Item -Path "C:\PHP" -ItemType directory
    Expand-Archive -LiteralPath $destinationPath -DestinationPath "C:\PHP"
    
    # 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);C:\PHP"
    # Recharger les variables d'environnement :
    $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
    
    # CHARGER LES EXTENSIONS PHP NECESSAIRES :
    # Le contenu du fichier php.ini
    $content = @'
    [PHP]
    engine = On
    short_open_tag = Off
    precision = 14
    output_buffering = 4096
    zlib.output_compression = Off
    implicit_flush = Off
    unserialize_callback_func =
    serialize_precision = -1
    disable_functions =
    disable_classes =
    zend.enable_gc = On
    zend.exception_ignore_args = On
    zend.exception_string_param_max_len = 0
    expose_php = On
    max_execution_time = 300
    max_input_time = 60
    memory_limit = 128M
    error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
    display_errors = Off
    display_startup_errors = Off
    log_errors = On
    ignore_repeated_errors = Off
    ignore_repeated_source = Off
    report_memleaks = On
    variables_order = "GPCS"
    request_order = "GP"
    register_argc_argv = Off
    auto_globals_jit = On
    post_max_size = 8M
    auto_prepend_file =
    auto_append_file =
    default_mimetype = "text/html"
    default_charset = "UTF-8"
    doc_root =
    user_dir =
    extension_dir = "C:\PHP\ext"
    enable_dl = Off
    cgi.force_redirect = 0
    file_uploads = On
    upload_max_filesize = 2M
    max_file_uploads = 20
    allow_url_fopen = On
    allow_url_include = Off
    default_socket_timeout = 60
    
    ;;;; ---- EXTENSIONS NECESSAIRES A GLPI ---- ;;;;
    extension=zip
    extension=bz2
    extension=curl
    extension=fileinfo
    extension=gd
    extension=intl
    extension=ldap
    extension=mbstring
    extension=exif
    extension=mysqli
    extension=openssl
    extension=sodium
    zend_extension=opcache
    error_log  = "C:\Windows\Temp\FastCGI - PHP_errors.log"
    upload_tmp_dir = "C:\Windows\Temp\"
    cgi.fix_pathinfo = 1
    fastcgi.impersonate = 1
    ;;;; --------------------------------------- ;;;;
    
    [CLI Server]
    cli_server.color = On
    [Date]
    date.timezone = Europe/Paris
    [Pdo_mysql]
    pdo_mysql.default_socket=
    [mail function]
    SMTP = localhost
    smtp_port = 25
    mail.add_x_header = Off
    [ODBC]
    odbc.allow_persistent = On
    odbc.check_persistent = On
    odbc.max_persistent = -1
    odbc.max_links = -1
    odbc.defaultlrl = 4096
    odbc.defaultbinmode = 1
    [MySQLi]
    mysqli.max_persistent = -1
    mysqli.allow_persistent = On
    mysqli.max_links = -1
    mysqli.default_port = 3306
    mysqli.default_socket =
    mysqli.default_host =
    mysqli.default_user =
    mysqli.default_pw =
    mysqli.reconnect = Off
    [mysqlnd]
    mysqlnd.collect_statistics = On
    mysqlnd.collect_memory_statistics = Off
    [PostgreSQL]
    pgsql.allow_persistent = On
    pgsql.auto_reset_persistent = Off
    pgsql.max_persistent = -1
    pgsql.max_links = -1
    pgsql.ignore_notice = 0
    pgsql.log_notice = 0
    [bcmath]
    bcmath.scale = 0
    [Session]
    session.save_handler = files
    session.use_strict_mode = 0
    session.use_cookies = 1
    ;session.cookie_secure = 1
    session.use_only_cookies = 1
    session.name = PHPSESSID
    session.auto_start = 0
    session.cookie_lifetime = 0
    session.cookie_path = /
    session.cookie_domain =
    session.cookie_httponly = 1
    session.cookie_samesite =
    session.serialize_handler = php
    session.gc_probability = 1
    session.gc_divisor = 1000
    session.gc_maxlifetime = 1440
    session.referer_check =
    session.cache_limiter = nocache
    session.cache_expire = 180
    session.use_trans_sid = 0
    session.sid_length = 26
    session.trans_sid_tags = "a=href,area=href,frame=src,form="
    session.sid_bits_per_character = 5
    [Assertion]
    zend.assertions = -1
    [Tidy]
    tidy.clean_output = Off
    [soap]
    soap.wsdl_cache_enabled=1
    soap.wsdl_cache_dir="/tmp"
    soap.wsdl_cache_ttl=86400
    soap.wsdl_cache_limit = 5
    [ldap]
    ldap.max_links = -1
    '@
    
    # Créer ou remplacer le fichier C:\PHP\php.ini avec le contenu spécifié
    Set-Content -Path "C:\PHP\php.ini" -Value $content
    
    
    ######################################################
    # 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 WORDPRESS 6.5.3 ET L'INSTALLER DANS C:\inetpub\wwwroot
    
    # URL de téléchargement
    $url = "https://wordpress.org/latest.zip"
    
    # Chemin temporaire où le fichier sera téléchargé
    $tempPath = "C:\Temp\latest.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
    Expand-Archive -Path "$tempPath" -DestinationPath "$wwwroot"
    
    Write-Host "WORDPRESS a été installé dans $wwwroot."
    
    
    ######################################################
    # CREER LE NOUVEAU SITE POUR WORDPRESS :
    
    # Nom du nouveau site web
    $websiteName = "WORDPRESS"
    
    # Chemin du dossier racine de WORDPRESS
    $websitePath = "C:\inetpub\wwwroot\WORDPRESS"
    
    # 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
    Write-Host "Informations du nouveau site web :"
    Get-Website | Where-Object { $_.Name -eq $websiteName } | Select-Object Name, ID, State
    
    
    ######################################################
    # METTRE EN PLACE LE MAPPAGE DE MODULES PHP
    
    # Unlocker afin de pouvoir ajouter le module de mappage
    & $env:windir\system32\inetsrv\appcmd.exe unlock config -section:system.webServer/handlers
    
    Start-sleep -seconds 5
    
    
    $php = 'C:\PHP\php-cgi.exe'
    $configPath = get-webconfiguration 'system.webServer/fastcgi/application' | where-object { $_.fullPath -eq $php }
    if (!$configPath) {
        add-webconfiguration 'system.webserver/fastcgi' -value @{'fullPath' = $php }
    }
    
    
    $handlerName = "PHP 8.3.7"
    $handler = get-webconfiguration 'system.webserver/handlers/add' | where-object { $_.Name -eq $handlerName }
    if (!$handler) {
        add-webconfiguration 'system.webServer/handlers' -Value @{
            Name = $handlerName;
            Path = "*.php";
            Verb = "*";
            Modules = "FastCgiModule";
            scriptProcessor=$php;
            resourceType='Either' 
        }
    }
    
    # Configurer les paramètres de FastCGI
    $configPath = "system.webServer/fastCgi/application[@fullPath='$php']/environmentVariables/environmentVariable"
    $config = Get-WebConfiguration $configPath
    if (!$config) {
        $configPath = "system.webServer/fastCgi/application[@fullPath='$php']/environmentVariables"
        Add-WebConfiguration $configPath -Value @{ 'Name' = 'PHP_FCGI_MAX_REQUESTS'; Value = 10050 }
    }
    
    # Configure the settings
    # Available settings: 
    #     instanceMaxRequests, monitorChangesTo, stderrMode, signalBeforeTerminateSeconds
    #     activityTimeout, requestTimeout, queueLength, rapidFailsPerMinute, 
    #     flushNamedPipe, protocol   
    $configPath = "system.webServer/fastCgi/application[@fullPath='$php']"
    Set-WebConfigurationProperty $configPath -Name instanceMaxRequests -Value 10000
    Set-WebConfigurationProperty $configPath -Name monitorChangesTo -Value 'C:\PHP\php.ini'
    
    
    ######################################################
    # CREER UN DOCUMENT PAR DEFAUT POUR index.php
    
    # Ajoute "index.php" comme document par défaut
    Add-WebConfiguration -Filter "/system.webServer/defaultDocument/files" -PSPath "IIS:\Sites\$websiteName" -Value @{value='index.php'} -AtIndex 0
    
    Write-Host "Document par défaut ajouté."
    
    
    ######################################################
    # OCTROI DES DROITS D'ACCES
    
    $folders = @(
        "$websitePath"
    
    )
    
    $users = @("IIS_IUSRS", "Utilisateurs")
    
    foreach ($folder in $folders) {
        foreach ($user in $users) {
            Start-Process cmd.exe -ArgumentList "/c icacls `"$folder`" /grant `"$($user):(OI)(CI)M`"" -NoNewWindow -Wait
        }
    }
    
    
    ######################################################
    # COMPLETER wp-config
    
    # Chemin du fichier source et destination
    $fichierSource = "$websitePath\wp-config-sample.php"
    $fichierDest = "$websitePath\wp-config.php"
    
    # Copier le fichier wp-config-sample.php vers wp-config.php
    Copy-Item -Path $fichierSource -Destination $fichierDest
    
    # Lire le contenu du fichier, effectuer les remplacements et écrire le contenu modifié dans le même fichier
    (Get-Content $fichierDest) -replace 'database_name_here', $dbName `
                                -replace 'username_here', $dbUser `
                                -replace 'password_here', $dbPassword `
                                | Set-Content $fichierDest
    
    
    ######################################################
    # RECHARGER IIS ET LA NOUVELLE CONFIG
    
    invoke-command -scriptblock {iisreset /restart }
    
    
    ######################################################
    # FIN DE L'INSTALLATION
    
    clear
    Write-Host "L'INSTALLATION DE WORDPRESS EST TERMINEE"
    Write-Host "LE SITE EST ACCESSIBLE VIA http://IP-SERVEUR-CORE DEPUIS UN POSTE CLIENT SUR LE RESEAU"
    Write-Host "EN L'ETAT, L'INSTALLATION DU SITE N'EST PAS SECURISEE. IL FAUDRA REVOIR CELA"
    
    
    }
    New-Alias -Name INSTALLER.WORDPRESS -Value fINSTALLER.WORDPRESS

     

     


    votre commentaire
  • Je n'ai plus le temps de continuer à mettre à jour l'application .exe de déploiement, donc à la place je vais laisser le script, que je viens de remettre à jour.

    Au passage ce script est désormais intégré au module de gestion des serveurs core Windows.

    Il s'agît d'un script permettant l'installation automatique de GLPI dans sa dernière version 10.0.15, avec mariadb 11.4.2 et PHP 8.3.7
    Le script fonctionnera aussi bien sur Windows Server 2022 Desktop Environnement ou Windows Server 2022 Core

    Pour le déployer, c'est simple, on le copie-colle dans un Shell PowerShell ouvert en mode Administrateur, puis on tappe "INSTALLER.GLPI".

    Il suffira de répondre aux questions pour créer la base SQL de GLPI et c'est tout.

    Attention : ce n'est pas une installation sécurisée de GLPI. C'est juste pour du testing.
    GLPI requiert désormais que des fichiers soient déplacés après installation. Si j'ai le temps, je le ferai pour Windows.

     

    Voici le script :

    function fINSTALLER.GLPI {
    
    ####################################
    # INSTALLATION DE IIS
    
    # (5) - Installer IIS
    Install-WindowsFeature -Name Web-Server
    # Installe les outils de gestion, y compris la console de gestion IIS
    Install-WindowsFeature -Name Web-Mgmt-Tools
    # Installe les fonctionnalités HTTP communes
    Install-WindowsFeature -Name Web-Default-Doc
    Install-WindowsFeature -Name Web-Dir-Browsing
    Install-WindowsFeature -Name Web-Http-Errors
    Install-WindowsFeature -Name Web-Static-Content
    # Installe les fonctionnalités d'intégrité et de diagnostic
    Install-WindowsFeature -Name Web-Http-Logging
    # Installe les fonctionnalités de performance
    Install-WindowsFeature -Name Web-Stat-Compression
    # Installe les fonctionnalités de sécurité
    Install-WindowsFeature -Name Web-Request-Monitor
    # Installer FastCGI
    Install-WindowsFeature -Name Web-CGI
    # Redémarrer le service IIS
    Restart-Service w3svc
    
    ####################################
    # INSTALLATION DE MARIADB 11.4
    
    # Vérifier si le dossier C:\Temp existe, sinon le créer
    if (-not (Test-Path "C:\Temp")) {
        New-Item -Path "C:\Temp" -ItemType Directory
    }
    
    # Définir l'URL et le chemin de destination pour le téléchargement
    $mariadbUrl = "https://mirrors.ircam.fr/pub/mariadb/mariadb-11.4.2/winx64-packages/mariadb-11.4.2-winx64.msi"
    $destinationPath = "C:\Temp\mariadb-11.4.2-winx64.msi"
    
    # Télécharger MariaDB
    Invoke-WebRequest -Uri $mariadbUrl -OutFile $destinationPath
    
    # Installer MariaDB, configurer le service mariadb et le démarrer
    msiexec /i "C:\Temp\mariadb-11.4.2-winx64.msi" /qn
    Start-sleep -seconds 30
    Set-Location "C:\Program Files\MariaDB 11.4\bin" 
    .\mysqld.exe --install
    Start-sleep -Seconds 10
    # L'installation est répétée une seconde fois car plusieurs erreurs étranges sont parfois survenues.
    # Ne tenez pas compte de l'erreur 'FATAL ERREUR' si elle s'affiche.
    .\mysqld.exe --install
    Start-Service -Name 'MySQL'
    Start-Sleep -Seconds 5
    
    # 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);C:\Program Files\MariaDB 11.4\bin"
    # Recharger les variables d'environnement :
    $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
    Write-Host " "
    
    ####################################
    # CREATION DE LA BASE SQL POUR GLPI
    
    # Mot de passe root et base SQL pour GLPI
    $rootPassword = Read-Host "ENTRER LE MOT DE PASSE ROOT POUR MARIADB"
    $dbName = Read-Host "ENTRER LE NOM POUR LA BASE GLPI"
    $dbUser = Read-Host "ENTRER UN NOM POUR L'UTILISATEUR ADMINISTRATEUR DE LA BASE GLPI"
    $dbPassword = Read-Host "ENTRER UN MOT DE PASSE POUR L'UTILISATEUR ADMINISTRATEUR"
    
    # (11) - Créer la base et l'utilisateur privilégié
    Set-Location "C:\Program Files\MariaDB 11.4\bin" 
    .\mysqladmin.exe -uroot create "$dbName"
    .\mariadb.exe -uroot -e"CREATE USER '${dbUser}'@'localhost' IDENTIFIED BY '${dbPassword}'"
    .\mariadb.exe -uroot -e"GRANT ALL ON ${dbName}.* TO '${dbUser}'@'localhost'"
    
    ######################################################
    # INSTALLER PHP 8.3.7 ET VCS 16
    
    # Définir l'URL et le chemin de destination pour le téléchargement
    $VCUrl = "https://aka.ms/vs/16/release/VC_redist.x64.exe"
    $destinationPath = "C:\Temp\VC_redist.x64.exe"
    
    # Télécharger VC
    Invoke-WebRequest -Uri $VCUrl -OutFile $destinationPath
    
    # Installer VC
    Start-Process -Wait -FilePath "$destinationPath" -ArgumentList "/S" -PassThru
    
    # Télécharger et Installer PHP 8.3.7
    $PHPUrl="https://windows.php.net/downloads/releases/php-8.3.7-nts-Win32-vs16-x64.zip"
    $destinationPath = "C:\Temp\php-8.3.7-nts-Win32-vs16-x64.zip"
    Invoke-WebRequest -Uri $PHPUrl -OutFile $destinationPath
    
    New-Item -Path "C:\PHP" -ItemType directory
    Expand-Archive -LiteralPath $destinationPath -DestinationPath "C:\PHP"
    
    # 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);C:\PHP"
    # Recharger les variables d'environnement :
    $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
    
    # CHARGER LES EXTENSIONS PHP NECESSAIRES :
    # Le contenu du fichier php.ini
    $content = @'
    [PHP]
    engine = On
    short_open_tag = Off
    precision = 14
    output_buffering = 4096
    zlib.output_compression = Off
    implicit_flush = Off
    unserialize_callback_func =
    serialize_precision = -1
    disable_functions =
    disable_classes =
    zend.enable_gc = On
    zend.exception_ignore_args = On
    zend.exception_string_param_max_len = 0
    expose_php = On
    max_execution_time = 300
    max_input_time = 60
    memory_limit = 128M
    error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
    display_errors = Off
    display_startup_errors = Off
    log_errors = On
    ignore_repeated_errors = Off
    ignore_repeated_source = Off
    report_memleaks = On
    variables_order = "GPCS"
    request_order = "GP"
    register_argc_argv = Off
    auto_globals_jit = On
    post_max_size = 8M
    auto_prepend_file =
    auto_append_file =
    default_mimetype = "text/html"
    default_charset = "UTF-8"
    doc_root =
    user_dir =
    extension_dir = "C:\PHP\ext"
    enable_dl = Off
    cgi.force_redirect = 0
    file_uploads = On
    upload_max_filesize = 2M
    max_file_uploads = 20
    allow_url_fopen = On
    allow_url_include = Off
    default_socket_timeout = 60
    
    ;;;; ---- EXTENSIONS NECESSAIRES A GLPI ---- ;;;;
    extension=zip
    extension=bz2
    extension=curl
    extension=fileinfo
    extension=gd
    extension=intl
    extension=ldap
    extension=mbstring
    extension=exif
    extension=mysqli
    extension=openssl
    extension=sodium
    zend_extension=opcache
    error_log  = "C:\Windows\Temp\FastCGI - PHP_errors.log"
    upload_tmp_dir = "C:\Windows\Temp\"
    cgi.fix_pathinfo = 1
    fastcgi.impersonate = 1
    ;;;; --------------------------------------- ;;;;
    
    [CLI Server]
    cli_server.color = On
    [Date]
    date.timezone = Europe/Paris
    [Pdo_mysql]
    pdo_mysql.default_socket=
    [mail function]
    SMTP = localhost
    smtp_port = 25
    mail.add_x_header = Off
    [ODBC]
    odbc.allow_persistent = On
    odbc.check_persistent = On
    odbc.max_persistent = -1
    odbc.max_links = -1
    odbc.defaultlrl = 4096
    odbc.defaultbinmode = 1
    [MySQLi]
    mysqli.max_persistent = -1
    mysqli.allow_persistent = On
    mysqli.max_links = -1
    mysqli.default_port = 3306
    mysqli.default_socket =
    mysqli.default_host =
    mysqli.default_user =
    mysqli.default_pw =
    mysqli.reconnect = Off
    [mysqlnd]
    mysqlnd.collect_statistics = On
    mysqlnd.collect_memory_statistics = Off
    [PostgreSQL]
    pgsql.allow_persistent = On
    pgsql.auto_reset_persistent = Off
    pgsql.max_persistent = -1
    pgsql.max_links = -1
    pgsql.ignore_notice = 0
    pgsql.log_notice = 0
    [bcmath]
    bcmath.scale = 0
    [Session]
    session.save_handler = files
    session.use_strict_mode = 0
    session.use_cookies = 1
    ;session.cookie_secure = 1
    session.use_only_cookies = 1
    session.name = PHPSESSID
    session.auto_start = 0
    session.cookie_lifetime = 0
    session.cookie_path = /
    session.cookie_domain =
    session.cookie_httponly = 1
    session.cookie_samesite =
    session.serialize_handler = php
    session.gc_probability = 1
    session.gc_divisor = 1000
    session.gc_maxlifetime = 1440
    session.referer_check =
    session.cache_limiter = nocache
    session.cache_expire = 180
    session.use_trans_sid = 0
    session.sid_length = 26
    session.trans_sid_tags = "a=href,area=href,frame=src,form="
    session.sid_bits_per_character = 5
    [Assertion]
    zend.assertions = -1
    [Tidy]
    tidy.clean_output = Off
    [soap]
    soap.wsdl_cache_enabled=1
    soap.wsdl_cache_dir="/tmp"
    soap.wsdl_cache_ttl=86400
    soap.wsdl_cache_limit = 5
    [ldap]
    ldap.max_links = -1
    '@
    
    # Créer ou remplacer le fichier C:\PHP\php.ini avec le contenu spécifié
    Set-Content -Path "C:\PHP\php.ini" -Value $content
    
    
    ######################################################
    # TELECHARGER 7z
    
    # Télécharge l'installateur de 7-Zip
    Invoke-WebRequest -Uri "https://www.7-zip.org/a/7z2406-x64.exe" -OutFile "C:\Temp\7z2406-x64.exe"
    
    # Installe 7-Zip
    Start-Process -FilePath "C:\Temp\7z2406-x64.exe" -Args "/S" -Wait
    
    # Recharger les variables d'environnement :
    $7zPath = "C:\Program Files\7-Zip"
    $env:Path += ";$7zPath"
    
    # 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);C:\Program Files\7-Zip"
    # Recharger les variables d'environnement :
    $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
    
    
    ######################################################
    # 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 GLPI 10.0.15 ET L'INSTALLER DANS C:\inetpub\wwwroot
    
    # URL de téléchargement
    $url = "https://github.com/glpi-project/glpi/releases/download/10.0.15/glpi-10.0.15.tgz"
    
    # Chemin temporaire où le fichier sera téléchargé
    $tempPath = "C:\Temp\glpi-10.0.15.tgz"
    
    # 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
    Set-Location "$wwwroot"
    tar -xvzf "C:\Temp\glpi-10.0.15.tgz"
    
    Write-Host "GLPI a été installé dans $wwwroot."
    
    
    ######################################################
    # CREER LE NOUVEAU SITE POUR GLPI :
    
    # Nom du nouveau site web
    $websiteName = "GLPI"
    
    # Chemin du dossier racine de GLPI
    $websitePath = "C:\inetpub\wwwroot\glpi"
    
    # 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
    Write-Host "Informations du nouveau site web :"
    Get-Website | Where-Object { $_.Name -eq $websiteName } | Select-Object Name, ID, State
    
    
    ######################################################
    # METTRE EN PLACE LE MAPPAGE DE MODULES PHP
    
    # Unlocker afin de pouvoir ajouter le module de mappage
    & $env:windir\system32\inetsrv\appcmd.exe unlock config -section:system.webServer/handlers
    
    Start-sleep -seconds 5
    
    
    $php = 'C:\PHP\php-cgi.exe'
    $configPath = get-webconfiguration 'system.webServer/fastcgi/application' | where-object { $_.fullPath -eq $php }
    if (!$configPath) {
        add-webconfiguration 'system.webserver/fastcgi' -value @{'fullPath' = $php }
    }
    
    
    $handlerName = "PHP 8.3.7"
    $handler = get-webconfiguration 'system.webserver/handlers/add' | where-object { $_.Name -eq $handlerName }
    if (!$handler) {
        add-webconfiguration 'system.webServer/handlers' -Value @{
            Name = $handlerName;
            Path = "*.php";
            Verb = "*";
            Modules = "FastCgiModule";
            scriptProcessor=$php;
            resourceType='Either' 
        }
    }
    
    # Configurer les paramètres de FastCGI
    $configPath = "system.webServer/fastCgi/application[@fullPath='$php']/environmentVariables/environmentVariable"
    $config = Get-WebConfiguration $configPath
    if (!$config) {
        $configPath = "system.webServer/fastCgi/application[@fullPath='$php']/environmentVariables"
        Add-WebConfiguration $configPath -Value @{ 'Name' = 'PHP_FCGI_MAX_REQUESTS'; Value = 10050 }
    }
    
    # Configure the settings
    # Available settings: 
    #     instanceMaxRequests, monitorChangesTo, stderrMode, signalBeforeTerminateSeconds
    #     activityTimeout, requestTimeout, queueLength, rapidFailsPerMinute, 
    #     flushNamedPipe, protocol   
    $configPath = "system.webServer/fastCgi/application[@fullPath='$php']"
    Set-WebConfigurationProperty $configPath -Name instanceMaxRequests -Value 10000
    Set-WebConfigurationProperty $configPath -Name monitorChangesTo -Value 'C:\PHP\php.ini'
    
    
    ######################################################
    # CREER UN DOCUMENT PAR DEFAUT POUR index.php
    
    # Ajoute "index.php" comme document par défaut
    Add-WebConfiguration -Filter "/system.webServer/defaultDocument/files" -PSPath "IIS:\Sites\$websiteName" -Value @{value='index.php'} -AtIndex 0
    
    Write-Host "Document par défaut ajouté."
    
    
    ######################################################
    # OCTROI DES DROITS D'ACCES
    
    
    $folders = @(
        "$websitePath\config",
        "$websitePath\files",
        "$websitePath\marketplace"
    )
    
    $users = @("IIS_IUSRS", "Utilisateurs")
    
    foreach ($folder in $folders) {
        foreach ($user in $users) {
            Start-Process cmd.exe -ArgumentList "/c icacls `"$folder`" /grant `"$($user):(OI)(CI)M`"" -NoNewWindow -Wait
        }
    }
    
    ######################################################
    # RECHARGER IIS ET LA NOUVELLE CONFIG
    
    invoke-command -scriptblock {iisreset /restart }
    
    
    ######################################################
    # FIN DE L'INSTALLATION
    
    clear
    Write-Host "L'INSTALLATION DE GLPI EST TERMINEE"
    Write-Host "LE SITE EST ACCESSIBLE VIA http://IP-SERVEUR-CORE DEPUIS UN POSTE CLIENT SUR LE RESEAU"
    Write-Host "EN L'ETAT, L'INSTALLATION DU SITE N'EST PAS SECURISEE. IL FAUDRA REVOIR CELA"
    
    }
    New-Alias -Name INSTALLER.GLPI -Value fINSTALLER.GLPI

    votre commentaire
  • MariaDB peut être géré en ligne de commandes, sur Windows Server... Bien que beaucoup préfèrent utiliser HeidiSQL installé en même temps que MariaDB

    La procédure ci-dessous est à exécuter directement en PowerShell, afin qu'il y ait une compatibilité avec Windows Server en mode Core :

    Voici comment faire :

    ######################################################
    # TELECHARGER ET INSTALLER MARIADB
    
    # Vérifier si le dossier C:\Temp existe, sinon le créer
    if (-not (Test-Path "C:\Temp")) {
        New-Item -Path "C:\Temp" -ItemType Directory
    }
    
    # Définir l'URL et le chemin de destination pour le téléchargement
    $mariadbUrl = "https://mirrors.ircam.fr/pub/mariadb/mariadb-10.11.5/winx64-packages/mariadb-10.11.5-winx64.msi"
    $destinationPath = "C:\Temp\mariadb-10.11.5-winx64.msi"
    
    # Télécharger MariaDB
    Invoke-WebRequest -Uri $mariadbUrl -OutFile $destinationPath
    
    # Installer MariaDB, configurer le service mariadb et le démarrer
    msiexec /i "C:\Temp\mariadb-10.11.5-winx64.msi" /qn
    Set-Location "C:\Program Files\MariaDB 10.11\bin" 
    .\mysqld.exe --install
    Start-Service -Name 'MySQL'
    
    # 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);C:\Program Files\MariaDB 10.11\bin"
    
    # Pour l'activation du service mysql via powershell ou le cmd, il faudra redémarrer le serveur.

     
    Une fois l'installation terminée (et lorsque vous avez redémarré),
    Vous voudrez naturellement savoir comment créer une base et un utilisateur privilégié sur cette base.
    Je vous mets les commandes de base.
    Respectez SCRUPULEUSEMENT les guillemets simples et doubles préconisés ci-dessous lorsqu'il s'agît d'appeler vos variables !

    - Les variables :

    $dbName = "glpidb"
    $dbUser = "adminglpi"
    $dbPassword = "password"

    - Créer la base :

    mysqladmin -uroot create "$dbName"

    - Créer un utilisateur :

    mariadb -uroot -e"CREATE USER '${dbUser}'@'localhost' IDENTIFIED BY '${dbPassword}'"

    - Octroyer tous les droits à l'utilisateur sur la base créée :
    NE PAS METTRE DE GUILLEMENTS AUTOUR DE ${dbName} !!

    mariadb -uroot -e"GRANT ALL ON ${dbName}.* TO '${dbUser}'@'localhost'"

    votre commentaire
  • On veut parfois permettre à un (ou plusieurs) utilisateur(s) d'avoir son (leur) répertoire de base utilisateur directement sur le serveur.

    On parle de profil(s) itinérant(s)

    1) Créer un dossier "Profils" sur un disque dur ou une partition réservée aux dossiers partagés (pas sur C: !)

    Création d'un profil itinérant

     

    2) Créer le partage du dossier "Profils"

    Création d'un profil itinérant

     

    3) On attribue les droits d'accès au dossier partagé

    Création d'un profil itinérant

     

    4) On ajoute le chemin du profil dans les propriétés du compte de l'utilisateur AD

    Création d'un profil itinérant

     

    5)  Ouvrir une session au nom de l'utilisateur concerné

    Création d'un profil itinérant

     

    6) Connectez-vous et déconnectez-vous 2 fois d'affilée avec cet utilisateur et vous retrouverez les données de son profil sur le serveur.
    (Les fichiers modifiés par l'utilisateur sont synchronisés à la déconnexion de sa session)

    Création d'un profil itinérant

     


    votre commentaire
  • (dans l'éventualité où vous voudriez tester dans une VM Hyper-V.. n'oubliez pas d'autoriser la virtualisation imbriquée sur votre VM avant).

    Hyper-V n'est pas le meilleur choix pour Vagrant... (soit-dit en passant)

    1) Installer le rôle Hyper-V

    2) Télécharger Vagrant

    New-Item -Path "C:\DOWNLOAD\" -ItemType directory
    Set-Location "C:\DOWNLOAD"
    Invoke-WebRequest -Uri "https://releases.hashicorp.com/vagrant/2.3.7/vagrant_2.3.7_windows_amd64.msi" -Outfile "C:\DOWNLOAD\vagrant_2.3.7_windows_amd64.msi"

     3) Installer Vagrant

    MsiExec /i vagrant_2.3.7_windows_amd64.msi

    4) Redémarrer votre serveur
    5) Chargez votre première box !
    Pour accéder aux boîtes publiques : https://app.vagrantup.com/boxes/search

    Filtrez les résultats des systèmes que vous recherchez en choisissant Hyper-V (oui, les containers ne sont pas vraiment compatibles d'un hyperviseur à l'autre :-S...)
    Je prends l'exemple d'une VM FreeBSD 13 :

    Installer Vagrant sur un serveur en Core

    (Récupérez les mots magiques : generic/freebsd13)

    - Créer un dossier où stocker votre container et vous y rendre

    Set-Location C:\Users\Administrateur
    New-Item VAGRANT\freebsd13 -ItemType directory
    Set-Location VAGRANT\freebsd13

    - Charger le fichier

    vagrant init generic/freebsd13

    Un fichier "vagrant" apparaît alors dans le dossier.. Vous pouvez l'ouvrir avec Notepad et changer les caractéristiques de votre futur container.

    - Chargez votre container et le démarrer

    vagrant up

    Lisez attentivement ce qui va s'afficher (notamment les noms d'utilisateurs etc...)

    - Accédez à votre container via ssh :

    vagrant ssh

     

     

     


    Vous voici dans votre container, en ssh !
    Changez ce que vous voulez !

    Si vous ouvrez Hyper-V, vous verrez la machine tourner !


    votre commentaire
  • 1) Installer JDK

    2) Télécharger OpenFire :

    New-Item -Path "C:\OPENFIRE" -ItemType directory
    Set-Location "C:\OPENFIRE"
    Invoke-WebRequest -Uri "https://www.igniterealtime.org/downloadServlet?filename=openfire/openfire_4_7_5_x64.exe" -Outfile "C:\OPENFIRE\openfire_4_7_5_x64.exe"

     3) Installer OpenFire

    .\openfire_4_7_5_x64.exe

    Vous pouvez lancer le service à l'issue de l'installation.
    Par défaut, on accès à la console web d'OpenFire en tappant l'URL http://127.0.0.1:9090 depuis le serveur.
    Sauf qu'ici, on est en Core !
    On a donc un problème...

    Il est possible d'indiquer une autre adresse IP dans C:\Program Files\Openfire\conf\openfire.xml, malheureusement, ça ne fonctionne pas pour l'initialisation d'OpenFire ! (En tout cas, moi, je n'y suis pas parvenu ! Si quelqu'un sait je suis preneur).
    Je ne suis pas parvenu à me connecter depuis un autre poste sur le même réseau lors de l'initialisation, d'où la combine suivante: le tunnel SSH)..

    4) Installer OpenSSH serveur

    5) Créez un tunnel SSH avec Putty depuis un client sur le même réseau pour accéder à la console Web d'OpenFire

    Donc Tunnel SSH !

    Les étapes sont à réaliser dans l'ordre :
    - Host Name : Indiquez l'adresse IP du serveur en core sur lequel nous avons installé Openfire.
    - Port : 22
    - Saved Sessions : TUNNEL SSH OPENFIRE (où ce que vous voulez)
    - Cliquez sur "Save"

    Installer OpenFire (serveur XMPP) sur Windows 2022 Core

    - Allez dans Connection/SSH/Tunnels (dans le menu de gauche)
    - Source Port : 9090 (nous allons garder le même port sur notre client que sur le serveur, pour faciliter)
    - Destination : 192.168.1.47:9090
    - Cliquer sur "Add, la ligne L9090 ... s'affiche

    Installer OpenFire (serveur XMPP) sur Windows 2022 Core

    - Retourner dans Session (menu de gauche)
    - Cliquez sur "Save" pour enregistrer
    - Cliquez sur "Open" pour lancer la connexion

    Installer OpenFire (serveur XMPP) sur Windows 2022 Core

    - Identifiez-vous en tant qu'Administrateur ... La session SSH doit être ouverte avant de continuer.

    Lancez à présent Edge (ou un autre navigateur), puis tappez l'URL : http://127.0.0.1:9090

    La console d'OpenFire va s'ouvrir.. ! Bonne configuration !

     


    votre commentaire

  • 1) Créer un dossier C:\DOWNLOAD et s'y rendre

    New-Item -Path "C:\DOWNLOAD" -ItemType directory
    Set-Location "C:\DOWNLOAD"

    2) Télécharger JDK.
    (Allez chercher le lien sur le site de Java et remplacez celui ci-dessous par le votre)

    Invoke-WebRequest -Uri https://aka.ms/download-jdk/microsoft-jdk-17.0.7-windows-x64.msi -Outfile C:\DOWNLOAD\microsoft-jdk-17.0.7.windows-x64.msi

    3) Installer JDK

    MsiExec /i microsoft-jdk-17.0.7.windows-x64.msi

    Laissez les paramètres d'installation par défaut (ne pas configurer la variable JAVA_HOME)




    votre commentaire
  • Générer un fichier RDP d'une VM Hyper-V Windows est relativement facile avec Hyper-V..
    On génère le fichier, on l'envoie, et les stagiaires peuvent se connecter à leur VM et travailler.

    Pour ne permettre à la personne de n'accéder en RDP qu'à la VM (et non à une session sur le serveur) voici comment faire :

    Pré-requis :
    - Le RDP doit être activé sur le serveur Hyper-V


    1) Sur le serveur Hyper-V, dans "Gestion de l'ordinateur" :

    Autoriser l'accès en RDP à une VM Hyper-Vsans autoriser la connexion à la session utilisateur et générer un fichier RDP

     
    - créer un utilisateur pour le stagiaire.
    - L'ajouter au groupe "Administrateurs Hyper-V"
    - Le retirer de TOUS les autres groupes. Y compris du groupe Utilisateurs !


    2) Générer un fichier RDP de connexion à une VM

    Il y a plusieurs façons de procéder... via WAC si vous l'avez installé, ou directement via le programme de Bureau à distance qui vous permet d'enregistrer une configuration de connexion, ou encore via powershell lorsque vous êtes en Core !

    Je ne montre ici que la méthode lorsqu'on est en Core ! Les autres étant très faciles.


    - Récupérer l'ID de la VM Hyper-V pour laquelle on veut octroyer un accès RDP :
    Ouvrir Powershell en mode administrateur :

    Get-VM

    affiche la liste des ordinateurs virtuels disponibles avec leurs noms.
    (nous choisissons la VM nommée "CLIENT" (c'est un windows 11)

    Get-VM CLIENT | Select-Object -Property Id

    - Générer le fichier RDP
    Avec le bloc-notes windows, créer un fichier "CLIENT.rdp" sur le bureau du serveur

    full address:s:IP-DU-SERVEUR-HYPERV
    pcb:s:c7ac8b54-7f39-4817-b109-5296b1bd054e;EnhancedMode=1
    server port:i:2179
    negotiate security layer:i:0
    username:s:utilisateur-autorise
    password:s:mot-de-passe-de-lutilisateur

    c7ac8b54-7f39-4817-b109-5296b1bd054e étant l'ID de ma VM dans cet exemple (à remplacer par la votre)

     


    votre commentaire
  • Supprimer tous les utilisateurs de l'OU "QUICONTIENTLESUSERS" à la racine du domaine BLABLA.LAN :

    Get-ADUser -SearchBase "OU=QUICONTIENTLESUSERS,DC=BLABLA,DC=LAN" -Filter * | Remove-ADUser -Confirm:$false -Verbose

     


    votre commentaire
  • # Voir tous les disques disponibles :

    Get-PhysicalDisk


    # Création d'un pool de stockage avec tous les disques capables d'être ajouté dans un pool (le disque système ne peut pas en faire partie)

    $PhysicalDisks = (Get-PhysicalDisk -CanPool $True)
    New-StoragePool -FriendlyName "DATA-MED" -StorageSubsystemFriendlyName "Windows Storage*" -PhysicalDisks $PhysicalDisks -ResiliencySettingNameDefault Mirror -ProvisioningTypeDefault Thin -Verbose


    # Création d'un disque dur virtuel unique (VirtualDisk1) avec données recopiées en miroir, occupant la taille maximale possible du pool.

    New-VirtualDisk -StoragePoolFriendlyName "DATA-MED" -FriendlyName VirtualDisk1 -ResiliencySettingName Mirror -NumberOfDataCopies 2 -UseMaximumSize -ProvisioningType Fixed

    (la doc microsoft : https://learn.microsoft.com/en-us/powershell/module/storage/new-virtualdisk?view=windowsserver2022-ps)

    # Formatage du disque, création d'une seule partition (taille maximale) et montage :

    Get-VirtualDisk –FriendlyName VirtualDisk1 | Get-Disk | Initialize-Disk –Passthru | New-Partition –AssignDriveLetter –UseMaximumSize | Format-Volume

    votre commentaire
  • Installer le rôle :

    Add-WindowsFeature AD-Domain-Services,RSAT-AD-AdminCenter,RSAT-ADDS-Tools

    Promouvoir en contrôleur de domaine et créer une forêt :

    Install-ADDSForest -DomainName AMALIA.MED -InstallDNS

    votre commentaire
  • Plusieurs méthodes :

    1) Depuis le serveur windows, par GPO (ou depuis un client avec les outils RSAT) :

    - Dans l'éditeur de gestion des stratégies de groupe :
    Configuration ordinateur, Stratégies, Modèles d'administration, Système, Accès au stockage
    amovible
    Activer « Toutes les classes de stockage amovible »

    OU

    - Configuration utilisateur, Préférences, Paramètres du Panneau de configuration, Périphériques.   
    On cible les 2 périphériques (USB et Lecteurs CD) que l’on interdit
    Dans les 2 cas, les volumes ne montent pas. Impossible de les manipuler.

     

    2) Directement depuis un poste client (ouvrez PowerShell en mode Administrateur)

    Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\USBSTOR\" -Name "start" -Value 4 

    (la valeur 3 réactive)


    votre commentaire


    Suivre le flux RSS des articles de cette rubrique
    Suivre le flux RSS des commentaires de cette rubrique