Introduction à Hyper-V Server 2016

J’ai eu le luxe de pouvoir préparer aujourd’hui une petite plateforme de test basée sur Hyper-V Server 2016 avec quelques machines virtuelles. Je vais donc détailler dans cet article l’installation d’Hyper-V Server 2016 (à ne pas confondre avec un Windows Server 2016 ayant le rôle Hyper-V !), ses configuration côté OS et hyperviseurs, la mise en place d’un switch virtuel pour mettre les machines en réseau et enfin le déploiement de quelques machines virtuelles Windows.

Tout d’abord, il suffit de récupérer l’ISO d’Hyper-V Server 2016, disponible gratuitement. La phase de boot se déroule comme pour n’importe quel OS Windows usuel.

Il faut accepter le contrat de licence, partir sur une installation fraîche de Windows si jamais il existait déjà un OS Windows sur le serveur :

On en arrive au partitionnement. J’ai utilisé une configuration à 3 disques virtuels : le premier pour l’OS, le deuxième pour les données du serveur (images ISO, sauvegardes de fichiers de configuration, applications supplémentaires, scripts….) et le troisième pour les fichiers des VM (fichiers de configuration et disques virtuels des VM). En fonction de la configuration du RAID de la machine physique, il peut être malin de séparer système et données sur deux arrays différents.

Puis on lance l’installation. Une fois celle-ci terminée, le serveur redémarre et l’on arrive sur une interface en ligne de commande, identique à celle des serveurs installés sans GUI.

Choisissez un mot de passe, et ensuite, l’outil de configuration sconfig s’exécute.

Le management à distance est activé par défaut (ce qui signifie que le serveur sera attaquable par les consoles de management déployées sur les stations de travail), à l’inverse du RDP. Il faut ensuite s’occuper de la configuration réseau, renommer le serveur pour lui donner un nom lisible et si besoin effectuer la jonction au domaine. Une fois celle-ci réalisée, il peut être nécessaire de pousser un compte du domaine d’administration sur le serveur en tant qu’administrateur local pour que l’on puisse y accéder via la console de management Hyper-V. On choisira alors l’option 3 et saisira le nom du compte d’administration.

Côté OS, tout est prêt, tout se passe désormais sur la station de travail cliente. Il suffit d’installer la console de management Hyper-V, en allant dans le panneau de configuration et les options de fonctionnalités.

Attention à ne pas installer « Plateforme Hyper-V », qui installerait l’hyperviseur complet sur la station !

Une fois l’opération terminée, la console est accessible depuis le menu démarrer. Il est possible de se connecter au serveur Hyper-V fraîchement installé si tout s’est bien déroulé :

Si jamais cela ne fonctionne pas, pas de panique. Les 2 cas les plus fréquents de soucis de connexion à Hyper-V via la console de management sont l’authentification (la console n’a pas été exécutée avec un compte ayant les droits sur le serveur Hyper-V, d’où ma remarque plus haut sur un éventuel besoin d’ajouter un compte de domaine dans le groupe des administrateurs locaux), et la communication. Normalement, si le remote management est bien activé sur le serveur, les règles dans le pare-feu Windows ont été adaptées pour laisser les flux passer. Si malgré tout la console vous indique qu’elle est incapable de dialoguer avec le serveur, désactiver le pare-feu de l’Hyper-V pour voir si c’est cela qui pose problème est possible avec cette instruction à envoyer dans le cmd :

netsh advfirewall set currentprofile state off

Plusieurs choses à faire une fois que l’on a bien accès à l’hyperviseur. En premier, la création des répertoires. On peut monter les partages administratifs d$ et e$ (en fonction de votre partitionnement) sur la station locale si on ne veut pas créer les répertoires en cmd directement depuis le serveur. Dans mon cas, j’ai créé un répertoire iso sur D: et deux répertoires vms et disks sur E:. Je vais configurer ces répertoires dans les paramètres Hyper-V accessibles d’un clic droit sur le serveur.

Bien qu’il soit possible de tout placer dans le même répertoire, j’ai décidé de séparer configuration et disque.

En second, la création du switch virtuel pour que nos machines soient sur un réseau privé. Plusieurs options sont disponibles en fonction de ce qui est désiré ; dans mon cas, je souhaitais que les machines soient dans leur propre bulle sans interaction possible avec l’extérieur.

On lui donne un nom et on choisit à quoi raccorder ce switch virtuel. J’ai choisi l’option du réseau privé pour l’isolation.

On peut maintenant créer notre première VM. Dans cet exemple, je vais installer 2 machines Windows Server 2016, un contrôleur de domaine et un client. Comme spécifié plus haut, je vais copier mon ISO de Windows dans le répertoire dédié.

On peut passer à la création de la VM elle-même ; peu de surprises dans l’assistant, c’est similaire à ce qui existe dans les autres solutions de virtualisation. Pour cet exemple, une VM de deuxième génération fait l’affaire.

On raccorde la machine au switch virtuel qui a été créé avant.

On ne manquera pas de vérifier que les disques soient bien stockés dans le répertoire qui a été paramétré avant la création de la VM.

Une fois la VM créé, l’installation commence après le boot sur l’ISO.

Le réseau étant complètement isolé, la configuration est entièrement libre.

J’installe par la suite les rôles AD et DNS sur cette machine, puis je m’installe un deuxième serveur 2016, à qui j’affecte une autre adresse IP en mettant en passerelle mon serveur AD.

Cette seconde VM est donc placée sur le même réseau que la première sur notre switch virtuel, il est donc possible de réaliser la jonction au domaine et d’interagir avec d’autres VM sur le réseau.

Sur cette capture, j’ai ajouté mon deuxième DC installé en mode Core au server manager de mon 2016.

Voici donc comment se monter une petite plateforme de tests basée sur Hyper-V Server 2016 et mettre les machines en réseau sans qu’il n’y ait d’impact en dehors de cette bulle virtuelle. 😃

Powershell : liste des utilisateurs de tous les partages SMB d’un serveur

J’ai réalisé un script permettant de générer une liste d’utilisateurs des partages SMB d’un serveur, ce qui peut être pratique à des fins d’audit ou si l’on souhaite simplement contacter les utilisateurs d’un serveur de fichiers pour une maintenance par exemple.

Il existe bien l’instruction Get-SmbShare mais elle n’est disponible qu’à partir de 2012 R2 ! Afin de permettre une compatibilité avec les OS 2008 (qui seront par ailleurs bientôt plus maintenus 😱), j’ai utilisé la classe WMI Win32_share.

Le script fonctionne en plusieurs phases : tout d’abord, il liste les partages existants (tels qu’on peut les voir dans la console de Computer Management), puis liste leurs ACL et récupère les membres des groupes AD éventuellement positionnés pour n’obtenir au final que des identifiants utilisateur. Naturellement, il est nécessaire de lancer le script avec des droits d’administration sur la machine afin d’être sûr de pouvoir lire toutes les ACL et d’avoir les modules AD pour Powershell ; sans quoi il vous faudra vous résoudre à utiliser un Invoke-Command qui a de grandes chances d’être bloqué par le pare-feu.

function parse{
param($objectName)
$doneparsing = $false
for($i=0; $doneparsing -eq $false; $i++){
if ($i+1 -gt $parsedArray.Count) { Write-Host "Added user $objectName." ; $parsedArray.Add($objectName) > $null; $doneparsing = $true }
if ($parsedArray[$i] -eq $objectName){ $doneparsing = $true }
}
}

Write-Host "Share user ACL listing script"
Write-Host "============================="
Write-Host "This script will retrieve all the SMB shares and their ACLs with a 'MYDOMAIN' domain object filter to a file located in the temp folder."
$parsedArray = New-Object System.Collections.ArrayList
$sharelist = Get-WmiObject -Class Win32_Share
foreach($share in $shareList){
if ($share.Path -ne ""){
$aclList = (Get-Acl $share.Path).Access | Where-Object {$_.IdentityReference.ToString().Contains('MYDOMAIN') }
foreach ($acl in $aclList){
$objectName = $acl.IdentityReference.Value
$canoName = $objectName.ToString().SubString(9,$objectName.Length-9)
$objectType = Get-ADObject -Filter {CN -eq $canoName}
if ($objectType.ObjectClass -eq "user"){ parse($objectName) }
if ($objectType.ObjectClass -eq "group") {
Write-Host "Processing group $canoName..."
$PplInGrp = Get-ADGroupMember $canoName
foreach($ppl in $PplInGrp){ parse($ppl.SamAccountName) }
}
}
}
}
cd $env:temp
foreach ($line in $parsedArray){
Add-Content share-acl.txt $line }
Write-host "Done processing."

Fausse alerte de quota maximal atteint sur un répertoire partagé

J’ai eu le cas aujourd’hui d’un répertoire partagé limité par un quota d’1 Go sur un serveur Windows 2008 R2 qui était considéré comme plein par la station de travail l’ayant monté alors que la taille des fichiers présents n’excède pas 200 Mo. Un démontage et remontage du répertoire ainsi qu’un redémarrage de la station n’ayant rien changé, je me suis connecté sur le serveur pour vérifier l’occupation réelle du répertoire : même résultat que sur la station cliente, et pourtant, dans la console des partages, j’obtiens un espace libre de 670 Ko.

Afin de forcer un rafraîchissement des données du quota, il existe l’outil utilisable en ligne de commande dirquota qui est installé en même temps que le rôle de serveurs de fichiers. Pour rafraîchir le quota du répertoire, en assumant que son chemin local soit C:\sharesengue :

dirquota quota scan /path:C:\sharesengue

Ensuite, un petit tour dans la console permet de voir que le quota a bien été mis à jour et qu’on ne se fera plus jeter par l’OS client pour cause d’espace disque insuffisant :