<# .SYNOPSIS Interface de supervision des machines virtuelles du service support .DESCRIPTION Auteur : Maxime Tertrais Date creation : 27/11/2023 /Dernier modificateur : Maxime Tertrais Date derniere modification : Ce script permet de superviser les machines virtuelles du service support: - gestion des machines: - démarrer, arréter les machines - renommer les machines (attention le renommage ne concerne que le nom dans l'hyper-V, l'ID du serveur au niveau du domaine ne change pas) - legende : # : ligne de commentaire ### : ligne de debug (les logs) .EXAMPLE exemple1 : .\supervision .NOTES Des améliorations pourraient etre apportées : - #> ################################################################################################################################################ ################################################################################################################################################ ###################################################### Définition variable pour les logs ####################################################### ################################################################################################################################################ ################################################################################################################################################ $logfilepath = ".\Logs_supervision_vm_v4.0.log" function WriteToLogFile0 ($message) { (Get-Date).ToString() +" - "+ $message >> $logfilepath } if(Test-Path $logfilepath) { Remove-Item $logfilepath } ###WriteToLogFile0 "Id du process ouvert $monPID " ################################################################################################################################################ ################################################################################################################################################ ################################################# Assembly nécessaire pour la fenêtre graphique ################################################ ################################################################################################################################################ ################################################################################################################################################ try { $assembly_list = "PresentationFramework","System.Windows.Forms","PresentationCore","WindowsBase","System.Xaml","UIAutomationClient","UIAutomationTypes","WindowsFormsIntegration","System","System.Core","mscorlib","System.Management.Automation","System.Threading" foreach ($assembly in $assembly_list) { # Chargement des assemblies Add-Type -AssemblyName $assembly # Test des assemblies chargées $loadedAssemblies = [System.AppDomain]::CurrentDomain.GetAssemblies()| Where-Object { $_.GetName().Name -eq $assembly } $assemblyLoaded = $loadedAssemblies.FullName -contains $assembly if ($null -ne $assemblyLoaded) { $logassembly = "L'assembly '$assembly' est chargé correctement." WriteToLogFile0 $logassembly } else { $logassembly = "L'assembly '$assembly' n'est pas chargé correctement." WriteToLogFile0 $logassembly } } $loaded_assembly_list = [System.AppDomain]::CurrentDomain.GetAssemblies()| Select-Object -Property FullName foreach ($loaded_assembly in $loaded_assembly_list) { $logloadedassembly = "L'assembly suivante est chargé: '$loaded_assembly'" WriteToLogFile0 $logloadedassembly } } catch { $logwpf = "ligne 55 - une exeption s'est produite $_.Exception.Message " WriteToLogFile0 $logwpf } ################################################################################################################################################ ################################################################################################################################################ ############################################################### prérequis ###################################################################### ################################################################################################################################################ ################################################################################################################################################ ## rendre disponible l'optional feature de windows Hyper-V: # => dans la recherche windows : fonctionnalitées facultatives # => se loguer en admin local # => chercher dans le pop-up le module hyper-v pour powershell # => Hyper-V # =>Outils d'administration Hyper-V # => Module Hyper-V pour Windows Powershell # => cocher la case correspondante et valider sur ok, un redémarrage est peut-être nécessaire ################################################################################################################################################ ################################################################################################################################################ ############################## Déclaration de la Hash table qui sera synchronisée entre les différents runspaces ############################### ################################################################################################################################################ ################################################################################################################################################ try { # création de la table de hachage synchronisé $syncHash = [hashtable]::Synchronized(@{}) # test de la bonne création de la table de hachage synchronisé if ($syncHash -is [System.Collections.Hashtable] -and $syncHash -is [System.Collections.ICollection]) { $loghashtabl = "La création de l'hashtable synchronisé s'est déroulée correctement." WriteToLogFile0 $loghashtabl } else { $loghashtabl = "Il y a eu un problème lors de la création de l'hashtable synchronisé." WriteToLogFile0 $loghashtabl } } catch { $loghashtabl = "ligne 93 - une exeption s'est produite $_.Exception.Message " WriteToLogFile0 $loghashtabl } ################################################################################################################################################ ################################################################################################################################################ ############################################ Déclaration du premier runspace pour l'interface graphique ######################################## ################################################################################################################################################ ################################################################################################################################################ try { $newRunspace =[runspacefactory]::CreateRunspace() $newRunspace.ApartmentState = "STA" ## Le STA est là pour l'interface en WPF $newRunspace.ThreadOptions = "ReuseThread" $newRunspace.Open() $newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash) # vérification création du Runspace if ($newRunspace.ApartmentState -like "STA") { $logrunspace1 = "le runspace créé avec un ApartmentState correct en STA ." WriteToLogFile0 $logrunspace1 }else { $logrunspace1 = "le runspace créé avec un ApartmentState incorrect ." WriteToLogFile0 $logrunspace1 } if ($newRunspace.ThreadOptions -like "ReuseThread") { $logrunspace2 = "le runspace créé avec un ThreadOptions correct en ReuseThread ." WriteToLogFile0 $logrunspace2 }else { $logrunspace2 = "le runspace créé avec un ThreadOptions incorrect ." WriteToLogFile0 $logrunspace2 } # vérification de la variable sesion state proxy $testSessionStateProxy = $newRunspace.SessionStateProxy.GetVariable("syncHash") if ($null -ne $testSessionStateProxy) { $logrunspace3 = "le runspace créé avec un SessionStateProxy correct en associé à synchash ." WriteToLogFile0 $logrunspace3 }else { $logrunspace3 = "le runspace créé avec un SessionStateProxy incorrect ." WriteToLogFile0 $logrunspace3 } } catch { $logdeclarunspace = "ligne 137 - une exeption s'est produite $_.Exception.Message " WriteToLogFile0 $logdeclarunspace } $psCmd = [PowerShell]::Create().AddScript({ ################################################################################################################################################ ################################################################################################################################################ ############################################ Déclaration du code XAML de l'interface graphique WPF ############################################# ################################################################################################################################################ ################################################################################################################################################ [xml]$Fenetre_principale = @"