Disques RAID invisibles par le setup de 2012 R2 sur HPE ProLiant Gen10

Je devais installer un Windows Server 2012 R2 sur un serveur HPE ProLiant DL360 Gen10 flambant neuf, équipé d’un contrôleur RAID HP SmartArray P408i-a SR Gen10. Une fois le RAID configuré proprement, impossible pour le setup d’install de 2012 R2 de voir la configuration.

La carte RAID n’est plus détectée directement par le wizard d’installation ; il faut donc télécharger un driver externe, extraire le contenu de l’exécutable fraîchement téléchargé, le monter en tant que répertoire sur la carte ILO, et ensuite, spécifier lors de la recherche des disques que l’on souhaite utiliser un driver externe. En choisissant le répertoire monté plus tôt, on installe donc ces 2 pilotes :

Une fois le driver installé, la configuration RAID est visible et l’OS est installable.

A noter que le driver est également nécessaire pour installer Windows Server 2016 ; celui-ci n’étant pas disponible pour des versions plus anciennes que 2012 R2, je doute qu’il soit possible d’installer autre chose que les 2 dernières versions sur un stockage RAID.

Tous les crédits aux participants de ce thread sur les forums HPE pour la résolution de ce problème.

Impossible d’exécuter un script VBS sur 2012

J’ai rencontré sur quelques serveurs des messages d’erreurs suite à des tentatives de traitement de scripts VBS, comme quoi le système était incapable de trouver le moteur VBScript : Can’t find script engine « VBScript » for script … étant donné que VBS est utilisé pour des générer des indicateurs, sans le moteur de script il n’y avait donc aucune remontée d’informations.

Le moteur VBS est une vulgaire librairie située dans le répertoire C:\Windows\System32 :

Ensuite, une clef de registre bien planquée permet de faire le lien entre cette DLL et le système ; c’est celle-ci qui sera appelée par Windows lorsqu’un script VBS sera exécuté. Cette clef de registre est la suivante : HKCR\CLSID{B54F3741-5B07-11cf-A4B0-00AA004A55E8}\InprocServer32 et c’est sa valeur par défaut qui contient le chemin vers la DLL.

Certains programmes – principalement des antivirus – remplacent la valeur par un chemin vers une autre DLL, qui leur permet d’exécuter des scripts VBS mais qui communiquent avec l’antivirus afin de détecter du code malveillant ; ce qui était exactement mon cas :

Seulement, en allant dans le repértoire de cette DLL, elle n’y était pas, d’où le message d’erreur donné plus haut. Il y avait donc trois solutions ou workarounds possibles :

  1. Réinstaller l’antivirus pour forcer ce dernier à réécrire tous ses fichiers proprement et à recopier la DLL ; ou à défaut copier la DLL d’un serveur qui la possède.
  2. Modifier la clef de registre pour reprendre sa valeur originale.
  3. Copier la DLL d’origine et la renommer pour correspondre au nom donné dans la base de registre.

D’emblée, la solution 2 n’est pas envisageable car cela serait trop facile pour un virus ou code malveillant de modifier la clef de registre afin de bypasser les contrôles de l’AV sur les scripts VBS. Même en tant qu’administrateur local de la machine et en ayant shunté l’AV, il m’a été impossible de modifier la valeur dans la clef, ni même de modifier les autorisations sur celles-ci, que ce soit directement ou via un fichier .reg ; la solution 3 fonctionne mais n’est pas la plus sécurisante car de ce fait, les scripts VBS ne sont pas contrôlés par l’antivirus.

J’ai donc choisi la première solution : la réinstallation. Une simple copie de la DLL d’un autre serveur aurait pu suffire mais après avoir comparé les répertoires des AV entre le serveur posant problème et un autre sain, j’ai constaté de belles différences, preuve que l’AV n’avait pas correctement été déployé et que l’installation a été d’une manière ou d’une autre avortée.

Une fois la réinstallation de l’AV effectuée, la DLL était en effet visible dans le répertoire et il m’a été possible d’appeler des scripts VBS sans message d’erreur.

Le KB2919355 n’est jamais disponible au téléchargement via Windows Update sur Windows Server 2012 R2

Le KB2919355, ce patch récalcitrant apparu il y a quelques années en portant le nom de « Update 1 » pour les systèmes Windows de bureau, est un patch cumulatif de mises à jour également disponible pour Windows Server 2012 R2 ayant posé quelques soucis lors de ses premiers jours. Nécessaire pour certaines applications ainsi que globalement pour la sécurité du système par les failles qu’il corrige, j’ai été confronté plusieurs fois de manière aléatoire sur plusieurs serveurs à une indisponibilité dans Windows Update ; c’est-à-dire que Windows Update ne se voyait jamais proposer le téléchargement et l’installation de ce KB uniquement sur certains de mes serveurs virtuels, sans qu’il n’y ait jamais de variable commune.

Et c’est exactement cette absence de paramètre commun qui était étrange : 1 vCPU et 1 Go de RAM pour mes deux contrôleurs de domaine installés initialement en Core, 4 vCPU et 4 Go de RAM sur un serveur classique sans rôle avec interface graphique, des serveurs qui ne sont fatalement pas dans la même OU, qui ne se voient pas gérés de la même manière au niveau de ma GPO Windows Update… De plus, ils étaient installés avec le même ISO, utilisant la même licence.

Voulant éviter autant que possible une installation à la main, j’ai donc essayé plusieurs remèdes :

Le premier, la désactivation de Windows Update, la suppression du répertoire SoftwareDistribution localisé dans C:\Windows et la relance du service. Cela permet de réinitialiser Windows Update et son cache, et ainsi de repartir comme si vous n’aviez jamais installé de KB sur le système (c’est-à-dire que Windows Update perd son historique, les mises à jour restent installées). Avant de réaliser la suppression du répertoire, j’ai quand même procédé à une copie de sauvegarde au cas où.

net stop wuauserv
rd c:\windows\softwaredistribution /s /q
net start wuauserv

Pas mieux après cette tentative.

Le deuxième essai aura été celui de désactiver la GPO influant sur Windows Update (indiquant à mes serveurs de télécharger les mises à jours sans les installer). Même en indiquant aux serveurs de ne plus rechercher les mises à jour automatiquement et en lançant une recherche après un redémarrage, point de salut.

Troisième tentative de correction avec l’outil DISM, afin de vérifier que tous les composants systèmes sont bien installés et ne sont pas endommagés.

dism /online /cleanup-image /scanhealth

Et… tout va bien sur le système.

Quatrième et dernière commande, sans espoir :

sfc /scannow

Espoir vain, bien évidemment. Mes serveurs ne présentaient aucun bug, aucune corruption et étaient en parfait état de marche. Mais pour autant, j’avais toujours une disparité au niveau des patchs déployés car certains de mes serveurs avaient eu le droit à l’Update 1 et pas les autres.

En réalité, ce qui empêche Windows Update de voir ce gros KB2919355 de presque 900 Mo, c’est le KB2919442, qui pour des raisons inconnues, n’est pas toujours visible par Windows Update, il faut donc l’installer à la main. Il pèse 10 Mo et est disponible sur le site de Microsoft.

Une fois ce patch ridicule installé, on relance Windows Update et… miracle !

Le patch tant attendu apparaît et est enfin disponible au téléchargement, et à l’installation. Une fois toute l’opération déroulée, on retrouve parmi les changements esthétiques les boutons sur l’écran d’accueil.

Sauvegarde wbadmin impossible sur contrôleur de domaine virtuel 2012 R2

Comme premier article, je vais aborder le problème auquel j’ai été confronté récemment après avoir mis en place ma petite infrastructure que je présenterai éventuellement dans un prochain billet.

Je possède un contrôleur de domaine fonctionnant sous Windows Server 2012 R2, le seul de la forêt. Je possède un autre serveur 2012 R2, qui va recevoir sur un disque virtuel dédié les fichiers de sauvegarde des autres serveurs Windows ainsi que les fichiers des quelques scripts de sauvegardes de mes machines Linux.

Je veux donc concentrer sur ce serveur les sauvegardes Windows Server afin de pouvoir les sauvegarder en ligne plus facilement par la suite.

Sur mon contrôleur de domaine, j’installe donc la fonctionnalité Windows Server, et tente d’exécuter une première sauvegarde. Pour des raisons de performances disques (disques mécaniques en SATA3) et vu le peu de criticité, je ne souhaite pas effectuer de sauvegarde planifiée mais des sauvegardes uniques que je réaliserai de temps en temps. Je choisis donc de sauvegarder le serveur complet.

Je précise l’emplacement réseau du lecteur de sauvegarde, et je lance l’opération. Quelques minutes plus tard, la sauvegarde rentre en erreur au moment de sauvegarder le disque C:.

Dans les logs, rien de bien transcendant : c:\windows\logs\WindowsImageBackup

J’essaye donc de sauvegarder un autre serveur exactement de la même manière et avec le même compte de sauvegarde (un compte de service qui est le seul à avoir les droits complets sur le dossier du partage réseau, et qui est membre du groupe Opérateurs de Sauvegarde). Cela fonctionne, cela signifie que ce n’est pas le partage réseau qui pose problème.

Autre piste suggérée : la taille des secteurs n’est pas la même. En regardant sur les deux machines grâce à msinfo32.exe, je vois qu’ils font bien la même taille de 512 K.

Je tente un sfc /scannow sur le contrôleur de domaine afin de vérifier l’état des fichiers système, même si le serveur a été installé il y a moins de 48 heures. Pas d’erreur décelée. Je monte un second disque virtuel afin d’effectuer une sauvegarde en local, toujours impossible, le problème semble donc venir de l’accès au C:.

Finalement, je décide alors de boycotter l’interface graphique de wbadmin ainsi que l’utilisation en ligne de commande qui ne donne pas plus de résultats, même avec un lancement en tant qu’administrateur du domaine. Je recherche rapidement sur le web comment utiliser PowerShell pour se substituer au cmd et tombe sur un script fourni sur une plateforme Microsoft.
Etant donné que je n’ai pas besoin de toute la partie envoi de mail ni suivi du nombre de sauvegarde, je l’ai quelque peu simplifié.

Add-PsSnapin Windows.ServerBackup
$Server = « \\serveur »
$Folder = ($Server+ »\dossier »)
$WBPolicy = New-WBPolicy
Add-WBBareMetalRecovery -Policy $WBPolicy | Out-Null
$BackupLocation = New-WBBackupTarget -network ($Folder)
Add-WBBackupTarget -Policy $WBPolicy -Target $BackupLocation -force | Out-Null
$WBPolicy | Out-Null
Start-WBBackup -Policy $WBPolicy

On spécifie donc un serveur de sauvegarde, un répertoire accessible, on spécifie les paramètres souhaités dans la policy, et on exécute.
Via PowerShell, la sauvegarde s’est bien déroulée, il ne me restera plus qu’à appeler ce script lorsque je souhaiterai réaliser une sauvegarde. A noter que le script d’origine permet de sauvegarder également les autres volumes du systèmes qui sont non critiques (non swap, non système), mais n’ayant qu’un volume sur ce DC, l’option ne me concerne pas. Vous pouvez trouver le script d’origine en suivant ce lien. Apparemment la fonctionnalité WBBackup de PowerShell est conseillée par rapport au wbadmin. Question d’habitudes, j’utilisais toujours wbadmin avant.

Il ne me reste plus qu’à uploader sur mon ftp la sauvegarde pour être tranquille, et la faire redescendre sur ma station de travail au cas où.

Vous pouvez récupérer le script présent dans ce billet en le téléchargeant sur mon miroir de fichiers.