Powershell script for W10 DSI hosts
This commit is contained in:
parent
602125ac95
commit
f41d42a6dc
|
@ -0,0 +1,339 @@
|
|||
# ------------------------------------------------------------------------------------------------------------------------------
|
||||
# AUTEUR : François ALBERT le 28/06/2022
|
||||
# ------------------------------------------------------------------------------------------------------------------------------
|
||||
#
|
||||
# Paramètres possibles à l'exécution :
|
||||
#
|
||||
# -UnInstall = Désinstallation
|
||||
# -Install = Installation
|
||||
# -PostInstall = PostInstallation
|
||||
# -Trace = Débogage
|
||||
#
|
||||
Param(
|
||||
[Parameter(Mandatory=$False)]
|
||||
[Switch]$UnInstall,
|
||||
[Parameter(Mandatory=$False)]
|
||||
[Switch]$Install,
|
||||
[Parameter(Mandatory=$False)]
|
||||
[Switch]$PostInstall,
|
||||
[Parameter(Mandatory=$False)]
|
||||
[Switch]$RollBack,
|
||||
[Parameter(Mandatory=$False)]
|
||||
[Switch]$Trace
|
||||
)
|
||||
|
||||
# ------------------------------------------------------------------------------------------------------------------------------
|
||||
# PACKAGE / VERSION
|
||||
# ------------------------------------------------------------------------------------------------------------------------------
|
||||
[String]$AppName = 'Duplicati - IPR Foton'
|
||||
[String]$AppVersion = '2.0.6.3'
|
||||
|
||||
# ------------------------------------------------------------------------------------------------------------------------------
|
||||
# SCRIPT
|
||||
# ------------------------------------------------------------------------------------------------------------------------------
|
||||
Try {
|
||||
|
||||
# Positionnement du Débogage (Trace) si demandé
|
||||
If ($Trace) {
|
||||
$Global:EnableDebugMessage = $True
|
||||
}
|
||||
|
||||
# -----------------
|
||||
# INITIALISATIONS
|
||||
# -----------------
|
||||
$ScriptTime = [Diagnostics.Stopwatch]::StartNew()
|
||||
[String]$CurrentScript = $MyInvocation.MyCommand.Definition # Chemin complet de ce script
|
||||
[String]$CurrentPath = Split-Path -Path $CurrentScript -Parent # Dossier parent de ce script
|
||||
[String]$ScriptParameters = ($MyInvocation.BoundParameters.Keys | Out-String) -Replace("`r`n"," ") # Liste des paramètres
|
||||
[String]$LogPath = $($ENV:SystemRoot + '\Logs\UR1_Software') # Dossier parent du fichier de log
|
||||
[String]$Global:LogFile = $($LogPath + '\' + $AppName + '-' + $AppVersion + '-' + $(Get-Date -UFormat '%Y%m%d-%Hh%M') + '.log') # Chemin complet du fichier de log
|
||||
If ($RollBack) {
|
||||
[String]$Global:LogFile = $($LogPath + '\RollBack - ' + $AppName + '-' + $AppVersion + '-' + $(Get-Date -UFormat '%Y%m%d-%Hh%M') + '.log') # Chemin complet du fichier de log du RollBack
|
||||
}
|
||||
|
||||
# ---------------------
|
||||
# IMPORT DE MODULE(S)
|
||||
# ---------------------
|
||||
Import-Module "$CurrentPath\Bin\Module_UR1.psd1" -ErrorAction 'Stop'
|
||||
|
||||
# -----------------------
|
||||
# INITIALISATION DU LOG
|
||||
# -----------------------
|
||||
Write-Log -Message "****************************************************************************************************" -Component $CurrentScript -LogFile $LogFile
|
||||
Write-Log -Message "Début d'exécution de '$AppName - $AppVersion'" -Component $CurrentScript -LogFile $LogFile
|
||||
Write-Log -Message "Script : $CurrentScript" -Component $CurrentScript -LogFile $LogFile
|
||||
Write-Log -Message "Paramètres : $ScriptParameters" -Component $CurrentScript -LogFile $LogFile
|
||||
Write-Log -Message "****************************************************************************************************" -Component $CurrentScript -LogFile $LogFile
|
||||
|
||||
# -------------------------------------------
|
||||
# DÉFINITION DES VARIABLES SYSTÈME & SCRIPT
|
||||
# -------------------------------------------
|
||||
Set-ScriptVariables
|
||||
|
||||
# Variables disponibles : variables système standard +
|
||||
# $Arch, $CommonProgFiles, $CommonProgFiles86, $Default, $Desktop, $HomeDrive, $Msiexec, $OS, $OSName, $OSServicePack, $OSVersion,
|
||||
# $ProgFiles, $ProgFiles86, $ProcessArch, $Public, $Reg, $SchTasks, $StartMenu, $UserDesktop, $UsersProfile, $UserStartMenu
|
||||
#
|
||||
|
||||
# ------------------------------------------------------------------------------------------------------------------------------
|
||||
# UNINSTALL
|
||||
# ------------------------------------------------------------------------------------------------------------------------------
|
||||
If ($UnInstall) {
|
||||
[String]$Step = 'Désinstallation'
|
||||
Write-Verbose "$(Get-Date -UFormat '%H:%M:%S') - $Step en cours...`r`n"
|
||||
Write-Log -Message " " -LogFile $LogFile
|
||||
Write-Log -Message "***** $($Step.ToUpper()) **********************************************************************************************" -Component $CurrentScript -LogFile $LogFile
|
||||
|
||||
#
|
||||
# Début des commandes de Désinstallation
|
||||
# --------------------------------------
|
||||
#
|
||||
|
||||
# Interaction avec un utilisateur éventuellement connecté si process en cours
|
||||
#
|
||||
$Process = Invoke-KillProcessWithPopUp -AppName $AppName -PackageVersion $AppVersion -Process $('Duplicati.GUI.TrayIcon')
|
||||
If ($Process -gt '1') {
|
||||
# Le code retour de l'interaction est supérieur à 1, on sort du script
|
||||
$ExitUR1 = 1000
|
||||
Throw "Script annulé par l'utilisateur ou Process ouvert"
|
||||
}
|
||||
#
|
||||
# Le code retour de l'interaction est 0 ou 1, on poursuit
|
||||
|
||||
# Désinstallation toutes versions
|
||||
#
|
||||
[HashTable[]]$Versions =
|
||||
@{Version = "2.0.5.1" ; Guid = "{FC1F2B24-1783-4352-98E9-669896601613}"},
|
||||
@{Version = "2.0.6.3" ; Guid = "{D2A5D819-4FA0-493B-8D37-9531C659D95A}"}
|
||||
|
||||
ForEach ($Version in $Versions) {
|
||||
# Si exécutable
|
||||
Foreach ($Uninst in $Version.Uninst) {
|
||||
If ($Uninst -ne $null) {
|
||||
If (Test-Path -Path $Uninst -PathType 'Leaf') {
|
||||
If (!($Version.ExitCode)) { $Version.ExitCode = '0' }
|
||||
Write-Log -Message " " -LogFile $LogFile
|
||||
Write-Log -Message $('Désinstallation EXECUTABLE de la version : ' + $Version.Version) -Component $CurrentScript -LogFile $LogFile
|
||||
Write-Log -Message $(' --> Désinstalleur : "' + $Uninst + '"') -Component $CurrentScript -LogFile $LogFile
|
||||
Write-Log -Message $(' --> Arguments : "' + $Version.Arguments + '"') -Component $CurrentScript -LogFile $LogFile
|
||||
Write-Log -Message $(' --> ExitCode attendu : "' + $Version.ExitCode + '"') -Component $CurrentScript -LogFile $LogFile
|
||||
Invoke-LaunchProcess -Path $Uninst -ArgumentList $Version.Arguments -WorkingDirectory $(Split-Path -Path $Uninst -Parent) -ExitCode $Version.ExitCode -NoNewWindow -LogFile $LogFile | Out-Null
|
||||
}
|
||||
}
|
||||
}
|
||||
# Si MSI
|
||||
$RegUninst64 = 'Registry::HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\'
|
||||
$RegUninst = 'Registry::HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\'
|
||||
ForEach ($Guid in $Version.Guid) {
|
||||
If ($Guid -ne $null) {
|
||||
If ((Test-Path -Path $("$RegUninst64" + "$Guid")) -or (Test-Path -Path $("$RegUninst" + "$Guid"))) {
|
||||
Write-Log -Message " " -LogFile $LogFile
|
||||
Write-Log -Message $('Désinstallation MSI de la version : ' + $Version.Version) -Component $CurrentScript -LogFile $LogFile
|
||||
Write-Log -Message $(' --> Guid : "' + $Guid + '"') -Component $CurrentScript -LogFile $LogFile
|
||||
Write-Log -Message $(' --> ExitCode attendu : "' + $Version.ExitCode + '"') -Component $CurrentScript -LogFile $LogFile
|
||||
Invoke-MsiInstall -Action 'Uninstall' -ProductCode $Guid -ExitCode $Version.ExitCode -NoLog | Out-Null
|
||||
If (Test-Path -Path $("$RegUninst64" + "$Guid")) {
|
||||
Write-Log -Message $('Suppression dans le registre : ' + $("$RegUninst64" + "$Guid")) -Component $CurrentScript -LogFile $LogFile
|
||||
Remove-Item -Path $("$RegUninst64" + "$Guid") -Recurse -Force -ErrorAction SilentlyContinue | Out-Null
|
||||
}
|
||||
If (Test-Path -Path $("$RegUninst" + "$Guid")) {
|
||||
Write-Log -Message $('Suppression dans le registre : ' + $("$RegUninst" + "$Guid")) -Component $CurrentScript -LogFile $LogFile
|
||||
Remove-Item -Path $("$RegUninst" + "$Guid") -Recurse -Force -ErrorAction SilentlyContinue | Out-Null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Write-Log -Message " " -LogFile $LogFile
|
||||
|
||||
# Suppression de la clé de registre indiquant la présence de l'application
|
||||
#
|
||||
Remove-RegistryKey -Key "HKEY_LOCAL_MACHINE\SOFTWARE\UR1_Software\$AppName" -Recurse -LogFile $LogFile
|
||||
|
||||
#
|
||||
# Fin des commandes de Désinstallation
|
||||
# ------------------------------------
|
||||
#
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------------------------------------------------------------------
|
||||
# INSTALL
|
||||
# ------------------------------------------------------------------------------------------------------------------------------
|
||||
If ($Install) {
|
||||
[String]$Step = 'Installation'
|
||||
Write-Verbose "$(Get-Date -UFormat '%H:%M:%S') - $Step en cours...`r`n"
|
||||
Write-Log -Message " " -LogFile $LogFile
|
||||
Write-Log -Message "***** $($Step.ToUpper()) **************************************************************************************************" -Component $CurrentScript -LogFile $LogFile
|
||||
|
||||
#
|
||||
# Début des commandes d'Installation
|
||||
# ----------------------------------
|
||||
#
|
||||
|
||||
Invoke-MsiInstall -Path "$Currentpath\Sources\duplicati-2.0.6.3_beta_2021-06-17-x64.msi" -LogFile $LogFile | Out-Null
|
||||
|
||||
#
|
||||
# Fin des commandes d'Installation
|
||||
# --------------------------------
|
||||
#
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------------------------------------------------------------------
|
||||
# POSTINSTALL
|
||||
# ------------------------------------------------------------------------------------------------------------------------------
|
||||
If ($PostInstall) {
|
||||
[String]$Step = 'PostInstallation'
|
||||
Write-Verbose "$(Get-Date -UFormat '%H:%M:%S') - $Step en cours...`r`n"
|
||||
Write-Log -Message " " -LogFile $LogFile
|
||||
Write-Log -Message "***** $($Step.ToUpper()) ********************************************************************************************" -Component $CurrentScript -LogFile $LogFile
|
||||
|
||||
#
|
||||
# Début des commandes de PostInstallation
|
||||
# ---------------------------------------
|
||||
#
|
||||
[String]$NOMMACHINE = "$ENV:COMPUTERNAME"
|
||||
[String]$ENTITE = 'IPR'
|
||||
|
||||
$GetWMIObject = Get-WMIObject Win32_ComputerSystem -Computername $NOMMACHINE
|
||||
[String]$CurrentUser = ($GetWMIObject.UserName).Substring(3,($GetWMIObject.UserName).length-3)
|
||||
|
||||
|
||||
# Ménage
|
||||
#
|
||||
[String[]]$AllItems = "$Desktop\Duplicati 2.lnk"
|
||||
ForEach ($Item in $AllItems) {
|
||||
If (Test-Path -Path $Item -PathType 'Container') {
|
||||
Write-Log -Message $('Suppression de dossier : ' + $Item) -Component $CurrentScript -LogFile $LogFile
|
||||
Remove-Item -Path $Item -Recurse -Force -ErrorAction Stop | Out-Null
|
||||
} Else {
|
||||
If (Test-Path -Path $Item -PathType 'Leaf') {
|
||||
Write-Log -Message $('Suppression de fichier : ' + $Item) -Component $CurrentScript -LogFile $LogFile
|
||||
Remove-Item -Path $Item -Force -ErrorAction Stop | Out-Null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# ----------------------------------------
|
||||
# Creation et copie du fichier de config
|
||||
# ----------------------------------------
|
||||
|
||||
if (!(test-path "D:\Home\$CurrentUser\Duplicati\"))
|
||||
{
|
||||
New-Item "D:\Home\$CurrentUser\Duplicati\" -itemType Directory
|
||||
}
|
||||
if (!(test-path "D:\Home\$CurrentUser\Duplicati\.ssh\"))
|
||||
{
|
||||
New-Item "D:\Home\$CurrentUser\Duplicati\.ssh\" -itemType Directory
|
||||
}
|
||||
|
||||
$Fichier = get-content "$Currentpath\Files\sauvegarde.duplicati.config.json"
|
||||
|
||||
#Detection si la machine fait partie de l'entitée FOTON sinon on fait la config pour l'IPR
|
||||
if (("$ENV:COMPUTERNAME").Substring(2,3) -eq "034" )
|
||||
{
|
||||
$ENTITE = "FOTON"
|
||||
}
|
||||
|
||||
switch ($ENTITE)
|
||||
{
|
||||
IPR
|
||||
{
|
||||
if (!(test-path "D:\Home\$CurrentUser\Duplicati\.ssh\duplicati_id_ed25519"))
|
||||
{
|
||||
ssh-keygen -t ed25519 -f "D:\Home\$CurrentUser\Duplicati\.ssh\duplicati_id_ed25519" -q -N '""'
|
||||
Write-Log -Message "Création des clefs SSH ed25519 IPR" -Component $CurrentScript -LogFile $LogFile
|
||||
|
||||
Send-MailMessage -SmtpServer smtpint.univ-rennes1.fr -From "$CurrentUser@univ-rennes.fr" -To IPR.ADMIN.EMAIL@univ-rennes.fr -Subject "$Hostname $CurrentUser - Nouvelle clef Duplicati" -Attachments D:\Home\$CurrentUser\Duplicati\.ssh\duplicati_id_ed25519.pub
|
||||
}
|
||||
$fichier = $fichier -replace "TARGETURLUR", "ssh://duplicati.ipr.univ-rennes1.fr//home//$CurrentUser//$NOMMACHINE//?auth-username=$CurrentUser&ssh-fingerprint=ssh-ed25519 32 4A:2D:A0:5F:66:7A:D5:3A:F4:B2:63:EC:EE:1E:D0:21&ssh-keyfile=D:\\Home\\$CurrentUser\\Duplicati\\.ssh\\duplicati_id_ed25519"
|
||||
}
|
||||
FOTON
|
||||
{
|
||||
if (!(test-path "D:\Home\$CurrentUser\Duplicati\.ssh\id_rsa_duplicati"))
|
||||
{
|
||||
ssh-keygen -t rsa -f "D:\Home\$CurrentUser\Duplicati\.ssh\id_rsa_duplicati" -q -N '""'
|
||||
Write-Log -Message "Création des clefs SSH RSA FOTON" -Component $CurrentScript -LogFile $LogFile
|
||||
|
||||
Send-MailMessage -SmtpServer smtpint.univ-rennes1.fr -From "$CurrentUser@univ-rennes.fr" -To FOTON.ADMIN.EMAIL@univ-rennes.fr -Subject "$Hostname $CurrentUser - Nouvelle clef Duplicati" -Attachments D:\Home\$CurrentUser\Duplicati\.ssh\duplicati_id_ed25519.pub
|
||||
}
|
||||
$fichier = $fichier -replace "TARGETURLUR", "ssh://bkpdop.univ-rennes1.fr//mnt//datastore_backuppc//duplicati//$CurrentUser.$NOMMACHINE//?auth-username=$CurrentUser&ssh-fingerprint=ssh-rsa 2048 02:b9:38:a6:17:66:ba:90:e0:be:bb:7e:fb:a7:e6:14&ssh-keyfile=D:\\Home\\$CurrentUser\\Duplicati\\.ssh\\id_rsa_duplicati"
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
$fichier = $fichier -replace "SESAME",$CurrentUser
|
||||
|
||||
$Fichier | set-content "D:\Home\$CurrentUser\Duplicati\sauvegarde.duplicati.config.json"
|
||||
Write-Log -Message "Creation du fichier de configuration pour l'entitée $entite , Utilisateur : $CurrentUser" -Component $CurrentScript -LogFile $LogFile
|
||||
Write-Log -Message " " -Component $CurrentScript -LogFile $LogFile
|
||||
|
||||
|
||||
Invoke-LaunchProcess -Path "$ProgFiles\Duplicati 2\Duplicati.GUI.TrayIcon.exe" -Argumentlist "--webservice-interface=loopback" -nowait -NoNewWindow -LogFile $LogFile | Out-Null
|
||||
|
||||
|
||||
|
||||
# Création de la clé de registre indiquant la présence de l'application ("Version" à utiliser en méthode de détection avec SCCM)
|
||||
#
|
||||
Set-RegistryKey -Key "HKEY_LOCAL_MACHINE\SOFTWARE\UR1_Software\$AppName" -Name "Version" -Type String -Value $AppVersion -LogFile $LogFile
|
||||
Set-RegistryKey -Key "HKEY_LOCAL_MACHINE\SOFTWARE\UR1_Software\$AppName" -Name "Date" -Type String -Value $(Get-Date -UFormat '%Y%m%d') -LogFile $LogFile
|
||||
|
||||
#
|
||||
# Fin des commandes de PostInstallation
|
||||
# -------------------------------------
|
||||
#
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------------------------------------------------------------------
|
||||
# SCRIPT EN ERREUR
|
||||
# ------------------------------------------------------------------------------------------------------------------------------
|
||||
Catch {
|
||||
|
||||
Write-Log -Message $(' -- Erreur : ' + $_ + ' --') -Severity '2' -Component $CurrentScript -LogFile $LogFile
|
||||
Write-Log -Message " " -Component $CurrentScript -LogFile $LogFile
|
||||
#
|
||||
If (!($RollBack)) {
|
||||
If ($Step -ne 'Désinstallation') {
|
||||
Write-Log -Message 'RollBack lancé' -Severity '2' -Component $CurrentScript -LogFile $LogFile
|
||||
Invoke-AppRollback -FileName $CurrentScript
|
||||
Write-Log -Message 'RollBack terminé' -Severity '2' -Component $CurrentScript -LogFile $LogFile
|
||||
}
|
||||
Else {
|
||||
Write-Log -Message 'RollBack non lancé, erreur dans la partie Désinstallation' -Severity '3' -Component $CurrentScript -LogFile $LogFile
|
||||
}
|
||||
}
|
||||
Else {
|
||||
Write-Log -Message 'Erreur dans la partie Désinstallation du script de RollBack' -Severity '3' -Component $CurrentScript -LogFile $LogFile
|
||||
}
|
||||
|
||||
Write-Log -Message " " -LogFile $LogFile
|
||||
Write-Log -Message "****************************************************************************************************" -Component $CurrentScript -LogFile $LogFile
|
||||
Write-Log -Message "$Step EN ERREUR pour '$AppName - $AppVersion'" -Component $CurrentScript -LogFile $LogFile
|
||||
Write-Log -Message "A la ligne : $($_.InvocationInfo.ScriptLineNumber)" -Component $CurrentScript -LogFile $LogFile
|
||||
Write-Log -Message "****************************************************************************************************" -Component $CurrentScript -LogFile $LogFile
|
||||
Throw $_.Exception.ErrorRecord
|
||||
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------------------------------------------------------------------
|
||||
# FIN
|
||||
# ------------------------------------------------------------------------------------------------------------------------------
|
||||
Finally {
|
||||
|
||||
$ScriptTime.Stop()
|
||||
$ScriptDuration = $([String]::Format("{0:d2}:{1:d2}:{2:d2}", $ScriptTime.Elapsed.Hours, $ScriptTime.Elapsed.Minutes, $ScriptTime.Elapsed.Seconds))
|
||||
Write-Log -Message " " -LogFile $LogFile
|
||||
Write-Log -Message '****************************************************************************************************' -Component $CurrentScript -LogFile $LogFile
|
||||
Write-Log -Message "Fin d'exécution de '$AppName - $AppVersion'" -Component $CurrentScript -LogFile $LogFile
|
||||
Write-Log -Message "Script : $CurrentScript" -Component $CurrentScript -LogFile $LogFile
|
||||
Write-Log -Message "Paramètres : $ScriptParameters" -Component $CurrentScript -LogFile $LogFile
|
||||
Write-Log -Message "Durée d'exécution : $ScriptDuration" -Component $CurrentScript -LogFile $LogFile
|
||||
Write-Log -Message '****************************************************************************************************' -Component $CurrentScript -LogFile $LogFile
|
||||
#
|
||||
If ($ExitUR1) {
|
||||
Exit $ExitUR1
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue