ib1.psm1

###########################################################
# Variables globales #
###########################################################
#
$global:ib1Version='1.0.0.8'
$global:ib1DISMUrl="https://msdn.microsoft.com/en-us/windows/hardware/dn913721(v=vs.8.5).aspx"
$global:ib1DISMPath='C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\amd64\DISM\dism.exe'

function compare-ib1PSVersion ($ibVersion='4.0') {
if ($PSVersionTable.PSCompatibleVersions -notcontains $ibVersion) {
  write-warning "Attention, script pr�vu pour Fonctionner avec Powershell $ibVersion"}}

function get-ib1elevated ($ibElevationNeeded=$false) {
if ((New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
{ if (-not $ibElevationNeeded) { return $true}}
else {
if ($ibElevationNeeded) {
  write-error "Attention, cette commande n�cessite d'�tre execut�e en tant qu'administrateur"; break}
else { return $false}}}

function start-ib1VMWait ($SWVmname) {
  if ((get-vm $SWVmname).state -ne "Running") {
    Start-VM $SWVmname
    while ((get-vm $SWVmname).heartbeat -ne 'OKApplicationsHealthy') {
      write-progress -Activity "D�marrage de $SWVmname" -currentOperation "Attente de signal de d�marrage r�ussi de la VM"
      start-sleep 2}
    write-progress -Activity "D�marrage de $SWVmname" -complete}}

function get-ib1VM ($gVMName) {
  if ($gVMName -eq '') {
  try { $gResult=Get-VM -ErrorAction stop }
  catch {
    write-error "Impossible de trouver des machines virtuelles sur ce Windows."
    break}}
  else {
  try { $gResult=Get-VM $gVMName -ErrorAction stop }
  catch {
  write-error "Impossible de trouver une machine virtuelle nomm�e $gVMName."
    break}}
  return $gResult}

function global:reset-ib1VM {
<#
.SYNOPSIS
Cette commande permet de r�tablir les VMs du serveur Hyper-v � leur dernier checkpoint.
.PARAMETER VMName
Nom de la VMs � r�tablir. si ce param�tre est omis toutes les VMs trouv�es seront r�tablies
.PARAMETER keepVMUp
N'arr�te pas les VMs dont le dernier checkpoint est dans l'�tat allum� avant de les r�tablir
.EXAMPLE
reset-ib1VM -VMName 'lon-dc1'
R�tablit la VM 'lon-dc1' � son dernier point de contr�le.
.EXAMPLE
reset-ib1VM -keepVMUp
R�tablir toutes les VMS � leur dernier point de contr�le, sans les �teindre.
#>

[CmdletBinding(
DefaultParameterSetName='keepVMUp')]
PARAM(
[switch]$keepVMUp=$false,
[string]$VMName)
begin{get-ib1elevated $true; compare-ib1PSVersion "4.0"}
process {
$VMs2Reset=get-ib1VM $VMName
foreach ($VM2reset in $VMs2Reset) {
  if ($snapshot=Get-VMSnapshot -VMName $VM2reset.vmname|sort creationtime|select -last 1 -ErrorAction SilentlyContinue) {
    if (-not $keepVMUp -and $VM2reset.state -ieq 'running') {
      Write-Debug "Arr�t de la VM $($VM2reset.vmname)."
      stop-vm -VMName $VM2reset.vmname -confirm:$false}
    Write-Debug "Restauration du snapshot $($snapshot.Name) sur la VM $($VM2reset.vmname)."
    Restore-VMSnapshot $snapshot -confirm:$false}
  else {write-debug "La VM $($VM2reset.vmname) n'a pas de snapshot"}}}
  end {echo "Fin de l'op�ration"}}

function global:set-ib1VhdBoot {
<#
.SYNOPSIS
Cette commande permet de monter le disque virtuel contenu dans le fichier VHD sp�cifi� et de rajouter le d�marrage sur la partition non r�serv�e contenue au BCD.
.PARAMETER VHDFile
Nom du fichier VHD contenant le disque virtuel � monter.
.PARAMETER restart
Red�marre l'ordinateur � la fin du script (inactif par d�faut)
.EXAMPLE
set-ib1vhboot -VHDFile 'c:\program files\microsoft learning\base\20470b-lon-host1.vhd
Monte la partition contenue dans le fichier VHD fourni.
.EXAMPLE
set-ib1vhboot -VHDFile 'c:\program files\microsoft learning\base\20470b-lon-host1.vhd -restart
Monte la partition contenue dans le fichier VHD fourni et red�marre dessus.
#>

[CmdletBinding(
DefaultParameterSetName='VHDFile')]
PARAM(
[parameter(Mandatory=$true,ValueFromPipeLine=$true,HelpMessage='Fichier VHD contenant le disque virtuel � monter (avec une partition syst�me)')]
[string]$VHDfile,
[switch]$restart=$false)
begin{get-ib1elevated $true; compare-ib1PSVersion "4.0"; import-module storage}
# Attacher un VHD et le rajouter au menu de d�marrage
process {
write-debug "`$VHDfile=$VHDfile"
try { Mount-VHD -Path $vhdFile -ErrorAction stop }
catch {
  write-error "Impossible de monter le disque virtuel contenu dans le fichier $VHDFile."
  break}
$dLetter=(get-disk|where friendlyname -ilike "*microsoft*"|Get-Partition|Get-Volume|where {$_.filesystemlabel -ine "system reserved" -and $_.filesystemlabel -ine "r�serv�e au syst�me"}).driveletter+":"
write-debug "Disque(s) de lecteur Windows trouv�(s) : $dLetter"
if ($dLetter.Count -ne 1) {
 write-error 'Impossible de trouver un disque virtuel mont� qui contienne une unique partition non r�serv�e au syst�me.'
 break}
bcdboot $dLetter\windows /l fr-FR >> $null
bcdedit /set '{default}' Description ([io.path]::GetFileNameWithoutExtension($VHDFile)) >> $null
echo 'BCD modifi�'
if ($restart) {Restart-Computer}}}

function global:remove-ib1VhdBoot {
<#
.SYNOPSIS
Cette commande permet de supprimer l'entr�e par d�faut du BCD et de d�monter tous les disques virtuels mont�s sur la machine.
.PARAMETER restart
Red�marre l'ordinateur � la fin du script (inactif par d�faut)
.EXAMPLE
remove-ib1vhboot -restart
supprimer l'entr�e par d�faut du BCD et red�marre la machine.
#>

[CmdletBinding(
DefaultParameterSetName='restart')]
PARAM(
[switch]$restart=$false)
begin{get-ib1elevated $true; compare-ib1PSVersion "4.0"; import-module storage}
#Trouve tous les disques virtuels pour les d�monter
process {
get-disk|where FriendlyName -ilike "*microsoft*"|foreach {write-debug $_;get-partition|dismount-vhd -erroraction silentlycontinue}
write-debug "Supression de l'entr�e {Default} du BCD"
bcdedit /delete '{default}' >> $null
echo 'BCD modifi�'
if ($restart) {Restart-Computer}}}

function global:switch-ib1VMFr {
<#
.SYNOPSIS
Cette commande permet de changer le clavier d'une marchine virtuelle en Fran�ais.
.PARAMETER VMName
Nom de la VM sur laquelle agir
.PARAMETER noCheckpoint
Ne cr�e pas les points de contr�le sur la VM avant et apr�s action
.EXAMPLE
switch-ib1VMFr
Change le clavier de la VM en Fran�ais.
#>

[CmdletBinding(
DefaultParameterSetName='VMName')]
PARAM(
[string]$VMName='',
[switch]$restart=$false)
begin{get-ib1elevated $true; compare-ib1PSVersion "4.0"; import-module storage}
process {
$VMs2switch=get-ib1VM $VMName
foreach ($VM2switch in $VMs2switch) {
  if ($VM2switch.state -ine 'off') {echo "La VM $($VM2switch.name) n'est pas �teinte et ne sera pas trait�e"}
  else {
    Remove-VMSnapshot -vm $VM2switch -ErrorAction SilentlyContinue
    Checkpoint-VM -VM $VM2switch -SnapshotName "Original"
    Write-Debug "Changement des param�tres lingustiques de la VM $($VM2switch.name)"
    write-progress -Activity "Traitement de $($VM2switch.name)" -currentOperation "Montage du disque virtuel."
    $vhdPath=($VM2switch|Get-VMHardDiskDrive|where {$_.ControllerNumber -eq 0 -and $_.controllerLocation -eq 0}).path
    $testMount=$null
    mount-vhd -path $vhdPath -NoDriveLetter -passthru -ErrorVariable testMount -ErrorAction SilentlyContinue|get-disk|Get-Partition|where isactive -eq $false|Set-Partition -newdriveletter Z
    if ($testMount -eq $null) {Write-Error "Impossible de monter le disque dur... de la VM $($VM2switch.name)"}
    else {
      write-progress -Activity "Traitement de $($VM2switch.name)" -currentOperation "Changement des options linguistiques."
      & $ib1DISMPath /image:z: /set-allIntl:en-US /set-inputLocale:0409:0000040c
      if ($LASTEXITCODE -ne 0) {
        Start-Process -FilePath $ib1DISMUrl
        write-error "Si le probl�me vient de la version de DISM, merci de l'installer depuis la fen�tre de navigateur ouverte, avant de red�marrer la machine"
        dismount-vhd $vhdpath
        break}
      write-progress -Activity "Traitement de $($VM2switch.name)" -currentOperation "D�montage du disque."
      dismount-vhd $vhdpath
      Start-Sleep 1}
    write-progress -Activity "Traitement de $($VM2switch.name)" -currentOperation "Snapshot."
    Checkpoint-VM -VM $VM2switch -SnapshotName "Clavier FR"
    write-progress -Activity "Traitement de $vmName" -complete}}
}}