Skip to content

Commit

Permalink
chore 🧹 (article): update sideload
Browse files Browse the repository at this point in the history
chore 🧹 (article): update sideload
  • Loading branch information
EtienneDeneuve authored Feb 13, 2024
2 parents 7e0ef2c + 6074c4e commit 4778cb6
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 144 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,9 @@ title: "Side loading application without SCCM - Part 1"
description: ""
tags:
- PowerShell
- Windows 8
- Windows
- Sideloading
- SCCM
- Automatisation
- Développement d'applications
- AppxBundle
- Signtool
- Déploiement logiciel
- Gestion de l'entreprise
slug: 2016/01/11/side-loading-app
pubDate: 2016-01-11 17:20:38
updateDate: 2024-02-12 11:16:00
Expand Down Expand Up @@ -46,10 +40,11 @@ Pour le chargement latéral et le changement de certificat pour un bon certifica
6. Créer le bundle et le signer
7. Créer un script PowerShell pour installer les dépendances et le bundle.
8. Trouver un moyen de lancer le script PowerShell sur tous nos clients.
La partie 2 arrive bientôt...

La partie 2 arrive bientôt...

Autres parties :

- [Part 2](./2016/01/11/side-loading-application-without-sccm-part-2/)
- [Part 3](./2016/01/11/side-loading-application-without-sccm-part-3/)
- [Part 2](/2016/01/11/side-loading-application-without-sccm-part-2)
- [Part 3](/2016/01/11/side-loading-application-without-sccm-part-3)
- The full script is on my (New) Git : [Go to Git !](https://github.com/EtienneDeneuve/Powershell)
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
---
title: "Side loading application without SCCM - Part 2"
description: ""
tags: [""]
description: "Automatisez le déploiement des applications avec Powershell : simplifiez le sideloading d'Appx et gérez les certificats. Découvrez le script complet sur GitHub."
tags:
- Déploiement d'applications
- Développement logiciel
- Automatisation des tâches
- Powershell
slug: 2016/01/11/side-loading-application-without-sccm-part-2
pubDate: 2016-01-11 18:25:02
img: /assets/stock-3.jpg
img_alt: "nice abstract image"
---

So you have read the first article of these little series ( part 1[here :](http://etienne.deneuve.xyz/2016/01/11/side-loading-application-without-sccm-part-1/)>
Normalement, vous avez lu le premier article de cette petite série (partie 1 [ici :](2016/01/11/side-loading-application-without-sccm-part-1)>

## Powershell

With powershell we can automate tasks and manage our servers. Some one asks me to publish an AppxBundle with a need certificate (a good one, sign by a 3rd party provider, not a crappy self signed) for a customer, for side loading the appx and doesn't have to renew the certificate every year. It's not very funny to rebuild a package each year for a certificate, and it's not possible to publish the apps to the market as no one will care about it and there's no use for others. Before making a script for it, I've made the process one time manually and found it too much longer and not very interesting. So I started my scripts by a function to make the XML modifications. Powershell handles XML files better, than me, so I just need to do [xml]$variable = Get-Content $myappxfile. But I realizes my files a differents and need multiples modifications, so created a Switch (hint : Use the Powershell ISE and hit Crtl + J to get Intellisense doing the work for you) and addsome parameters to the function and the ability to choose between multiple values, with the "ValidateSet", useful for autocompletion. (I don't publish the true function right now):
Avec Powershell, nous pouvons automatiser des tâches et gérer nos serveurs. Quelqu'un m'a demandé de publier un AppxBundle avec un certificat nécessaire (un bon, signé par un fournisseur tiers, pas un auto-signé de mauvaise qualité) pour un client, afin de charger latéralement l'Appx et de ne pas avoir à renouveler le certificat chaque année. Il n'est pas très amusant de reconstruire un package chaque année pour un certificat, et il n'est pas possible de publier les applications sur le marché car personne ne s'en souciera et il n'y aura aucun intérêt pour les autres. Avant de créer un script pour cela, j'ai effectué une fois le processus manuellement et j'ai trouvé que c'était trop long et pas très intéressant. J'ai donc commencé mes scripts par une fonction pour effectuer les modifications XML. Powershell gère mieux les fichiers XML que moi, donc je n'ai besoin que de faire `[xml]$variable = Get-Content $myappxfile`. Mais je me suis rendu compte que mes fichiers étaient différents et nécessitaient plusieurs modifications, j'ai donc créé un Switch (astuce : utilisez Powershell ISE et appuyez sur Ctrl + J pour obtenir l'Intellisense qui fait le travail pour vous) et ajouté des paramètres à la fonction ainsi que la possibilité de choisir entre plusieurs valeurs, avec "ValidateSet", utile pour l'autocomplétion. (Je ne publie pas la fonction actuelle pour le moment) :

```powershell
Function Update-AppxXML{
Expand All @@ -22,20 +26,21 @@ $param1,
$param2,
)
switch($param1){
"Option1" { do that }
"Option2" { do that }
"Option3" { do that }
"Option1" { faire cela }
"Option2" { faire cela }
"Option3" { faire cela }
}
}
```

When I wrote my script, I splitted in multiple functions. It's pretty cool to have a script almost ready, where you don't have to write it again completely from scratch. You can also have a "Main" function for calling all the functions instead of making an intensive use of the magic pipe.
Quand j'ai écrit mon script, je l'ai divisé en plusieurs fonctions. C'est plutôt cool d'avoir un script presque prêt, où vous n'avez pas à le réécrire complètement à partir de zéro. Vous pouvez également avoir une fonction "Main" pour appeler toutes les fonctions au lieu d'utiliser intensivement le tube magique.

In the part 3, I'll go deeper in the scripts. Stay tuned...
Dans la partie 3, j'approfondirai les scripts. Restez à l'écoute...

Other Parts  :
Autres parties  :

- [Part 1](http://etienne.deneuve.xyz/2016/01/11/side-loading-application-without-sccm-part-1/)
- [Part 2](http://etienne.deneuve.xyz/2016/01/11/side-loading-application-without-sccm-part-2/) (you are here)
- [Part 3](http://etienne.deneuve.xyz/2016/01/11/side-loading-application-without-sccm-part-3/)
- The full script is on my (New) Git : [Go to Git !](https://github.com/EtienneDeneuve/Powershell)
- [Partie 1](/2016/01/11/side-loading-application-without-sccm-part-1)
- [Partie 2](/2016/01/11/side-loading-application-without-sccm-part-2) (vous êtes ici)
- [Partie 3](/2016/01/11/side-loading-application-without-sccm-part-3)

- Le script complet est sur mon dépôt GitHub : [Allez sur Git !](https://github.com/EtienneDeneuve/Powershell)
Original file line number Diff line number Diff line change
@@ -1,152 +1,114 @@
---
title: "Side loading application without SCCM - Part 3"
description: ""
tags: [""]
title: "Side loading application without SCCM - Part 2"
description: "Automatisez le déploiement des applications avec Powershell : simplifiez le sideloading d'Appx et gérez les certificats. Découvrez le script complet sur GitHub."
tags:
[
"Powershell",
"Automatisation des tâches",
"Développement logiciel",
"Déploiement d'applications",
]
slug: 2016/01/11/side-loading-application-without-sccm-part-3
pubDate: 2016-01-11 19:57:23
img: /assets/stock-4.jpg
img_alt: "nice abstract image"
img_alt: "image abstraite intéressante"
---

So I assume you have read the part 1 and the part 2 of this little series.
Si vous avez suivi les parties précédentes de cette série, vous êtes prêt à approfondir l'automatisation du déploiement d'applications sans SCCM. Dans cette troisième partie, nous nous concentrons sur un script PowerShell essentiel pour le chargement latéral d'applications Appx.

## The first Function
## Première Fonction: Set-Manifest

Here is my Function called "Set-Manifest" because I create it for changing the XML and the Block Map :
La fonction `Set-Manifest` que j'ai créée permet de modifier le fichier XML et la BlockMap selon les besoins. Voici comment elle se présente :

```powershell
Function Set-Manifest {
param(
[String]
[ValidateSet("Bundle","Block","Manifest","BlockAppx")]
$Mode,
[XML]
$xmlfile,
[String]
$CertificateSAN,
[String]
$filename,
[String]
$BlockMap
)
switch ($Mode)
{
'Bundle'
{
$xmlfile.Bundle.Identity.Publisher = $CertificateSAN
$xmlfile.Save($filename)
param(
[String]
[ValidateSet("Bundle", "Block", "Manifest", "BlockAppx")]
$Mode,
[XML] $xmlfile,
[String] $CertificateSAN,
[String] $filename,
[String] $BlockMap
)
switch ($Mode) {
'Bundle' {
$xmlfile.Bundle.Identity.Publisher = $CertificateSAN
$xmlfile.Save($filename)
}
'Block' {
$xmlfile.BlockMap.File.RemoveAttribute("Size")
$xmlfile.BlockMap.File.RemoveAttribute("LfhSize")
$xmlfile.BlockMap.File.RemoveChild($xmlfile.BlockMap.File.Block)
$xmlfile.Save($filename)
}
'Manifest' {
$xmlfile.Package.Identity.Publisher = $CertificateSAN
$xmlfile.Save($filename)
}
'BlockAppx' {
$xmltemp = $xmlfile.BlockMap.File |? { $_.Name -eq "AppxManifest.xml" }
$xmlfile.BlockMap.RemoveChild($xmltemp)
$xmltemp.RemoveChild($xmltemp.Block)
$xmltemp.RemoveAttribute("Size")
$xmltemp.RemoveAttribute("LfhSize")
$xmlfile.BlockMap.AppendChild($xmltemp)
$xmlfile.Save($filename)
}
}
}
'Block'
{
$xmlfile.BlockMap.File.RemoveAttribute("Size")
$xmlfile.BlockMap.File.RemoveAttribute("LfhSize")
$xmlfile.BlockMap.File.RemoveChild($xmlfile.BlockMap.File.Block)
$xmlfile.Save($filename)
}
'Manifest'
{
$xmlfile.Package.Identity.Publisher = $CertificateSAN
$xmlfile.Save($filename)
}
'BlockAppx'
{
$xmltemp = $xmlfile.BlockMap.File |? { $_.Name -eq "AppxManifest.xml"}
$xmlfile.BlockMap.RemoveChild($xmltemp)
$xmltemp.RemoveChild($xmltemp.Block)
$xmltemp.RemoveAttribute("Size")
$xmltemp.RemoveAttribute("LfhSize")
$xmlfile.BlockMap.AppendChild($xmltemp)
$xmlfile.Save($filename)
}
}
}
```

I used this function like that in my "main" script:
### Utilisation dans le Script Principal

```powershell
Le script "principal" utilise `Set-Manifest` pour ajuster les manifestes et les cartes de blocage des applications. Le processus est détaillé ci-dessous :

## region manifest
Write-Host "Getting the manifest in :`t $("$($destinationroot)\expanded\") !" -ForegroundColor Green
```powershell
# Manifeste
Write-Host "Récupération du manifeste dans :`t $($destinationroot)\expanded\` !" -ForegroundColor Green
$ManifestBundle = Get-ChildItem -Filter AppxBundleManifest.xml -Path "$($destinationroot)\expanded\bundle" -Recurse
$ManifestAppxs = Get-ChildItem -Filter AppxManifest.xml -Path "$($destinationroot)\expanded\Appx\" -Recurse
## region bundle manifest
Write-Host "Settings the Bundle manifest in :`t $("$($destinationroot)\expanded\") !" -ForegroundColor Green
if($($ManifestBundle.count)){
foreach($Manifest in $ManifestBundle){
[xml]$manifestxml = Get-Content $Manifest.FullName
Set-Manifest -Mode Bundle -certificate $certificateSAN -filename $($Manifest.fullname)  -xmlfile $manifestxml | Out-Null
# Configuration du manifeste de bundle
Write-Host "Paramétrage du manifeste de bundle dans :`t $($destinationroot)\expanded\` !" -ForegroundColor Green
foreach ($Manifest in $ManifestBundle) {
[xml]$manifestxml = Get-Content $Manifest.FullName
Set-Manifest -Mode Bundle -certificate $certificateSAN -filename $Manifest.fullname -xmlfile $manifestxml | Out-Null
}
}else{
[xml]$ManifestXML = Get-Content $ManifestBundle.FullName
Set-Manifest -Mode Bundle -certificate $certificateSAN -filename $($ManifestBundle.fullname)  -xmlfile $ManifestXML | Out-Null
}
## endregion
## region Appxs Manifests
Write-Host "Settings the Appx manifest in :`t $("$($destinationroot)\expanded\") !" -ForegroundColor Green
if($($ManifestAppxs.count)){
foreach($ManifestAppx in $ManifestAppxs){
[xml]$ManifestXML = Get-Content $ManifestAppx.FullName
Set-Manifest -Mode Manifest -certificate $certificateSAN -filename $($ManifestAppx.fullname -xmlfile $ManifestXML | Out-Null
# Configuration du manifeste d'Appx
Write-Host "Paramétrage du manifeste d'Appx dans :`t $($destinationroot)\expanded\` !" -ForegroundColor Green
foreach ($ManifestAppx in $ManifestAppxs) {
[xml]$manifestxml = Get-Content $ManifestAppx.FullName
Set-Manifest -Mode Manifest -certificate $certificateSAN -filename $ManifestAppx.fullname -xmlfile $manifestxml | Out-Null
}
}else{
[xml]$manifestxml = Get-Content $ManifestAppx.FullName
Set-Manifest -Mode Manifest -certificate $certificateSAN -filename $($ManifestAppx.fullname)  -xmlfile $ManifestXML | Out-Null
}
## endregion
## endregion
## region bundle BlockMaps
# Cartes de Blocage de bundle
$ManifestBundleBlockMaps = Get-ChildItem -Filter AppxBlockMap.xml -Path "$($destinationroot)\expanded\bundle" -Recurse
$ManifestAppxBlockMaps = Get-ChildItem -Filter AppxBlockMap.xml -Path "$($destinationroot)\expanded\Appx\" -Recurse
Write-Host "Settings the Bundle Block Maps in :`t $("$($destinationroot)\expanded\") !" -ForegroundColor Green
if($($ManifestBundleBlockMaps.count)){
foreach($BlockMaps in $ManifestBundleBlockMaps){
[xml]$BlockMapsXml = Get-Content $BlockMaps.FullName
Set-Manifest -Mode Block -certificate $certificateSAN -filename $($BlockMaps.fullname)  -xmlfile $BlockMapsXml | Out-Null
}
}else{
[xml]$BlockMapsXML = Get-Content $BlockMaps.FullName
Set-Manifest -Mode Block -certificate $certificateSAN -filename $($BlockMaps.fullname)  -xmlfile $BlockMapsXML | Out-Null
Write-Host "Paramétrage des Cartes de Blocage de bundle dans :`t $($destinationroot)\expanded\` !" -ForegroundColor Green
foreach ($BlockMap in $ManifestBundleBlockMaps) {
[xml]$blockmapxml = Get-Content $BlockMap.FullName
Set-Manifest -Mode Block -certificate $certificateSAN -filename $BlockMap.fullname -xmlfile $blockmapxml | Out-Null
}
## endregion
## region Appxs BlockMaps
Write-Host "Settings the Appx Block Maps in :`t $("$($destinationroot)\expanded\") !" -ForegroundColor Green
if($($ManifestAppxBlockMaps.count)){
foreach($BlockMaps in $ManifestAppxBlockMaps){
[xml]$BlockMapsXml = Get-Content $BlockMaps.FullName
Set-Manifest -Mode BlockAppx -certificate $certificateSAN -filename $($BlockMaps.fullname)  -xmlfile $BlockMapsXML | Out-Null
}
}else{
[xml]$BlockMapsXml = Get-Content $ManifestAppxBlockMaps.FullName
Set-Manifest -Mode BlockAppx -certificate $certificateSAN -filename $($ManifestAppxBlockMaps.fullname)  -xmlfile $BlockMapsXml | Out-Null
# Cartes de Blocage d'Appx
$ManifestAppxBlockMaps = Get-ChildItem -Filter AppxBlockMap.xml -Path "$($destinationroot)\expanded\Appx\" -Recurse
Write-Host "Paramétrage des Cartes de Blocage d'Appx dans :`t $($destinationroot)\expanded\` !" -ForegroundColor Green
foreach ($BlockMap in $ManifestAppxBlockMaps) {
[xml]$blockmapxml = Get-Content $BlockMap.FullName
Set-Manifest -Mode BlockAppx -certificate $certificateSAN -filename $BlockMap.fullname -xmlfile $blockmapxml | Out-Null
}
```

## endregion
## endregion
Cette méthode simplifie le déploiement d'applications en ajustant automatiquement les fichiers nécessaires à l'aide de PowerShell, rendant le chargement latéral d'Appx plus accessible et moins dépendant d'outils externes comme SCCM.

```
Restez à l'écoute pour la partie 4, qui viendra compléter cette série en vous fournissant encore plus d'outils et de techniques pour l'automatisation de vos déploiements d'applications.

Part 4 is coming soon :)
Pour plus d'informations et pour accéder au script complet, consultez [mon GitHub](https://github.com/E).

Other Parts  :
_Autres parties de la série :_

- [Part 1](http://etienne.deneuve.xyz/2016/01/11/side-loading-application-without-sccm-part-1/)
- [Part 2](http://etienne.deneuve.xyz/2016/01/11/side-loading-application-without-sccm-part-2/)
- [Part 3 (you are here)](http://etienne.deneuve.xyz/2016/01/11/side-loading-application-without-sccm-part-3/)
- The full script is on my (New) Git : [Go to Git !](https://github.com/EtienneDeneuve/Powershell)
- [Partie 1](/2016/01/11/side-loading-application-without-sccm-part-1)
- [Partie 2](/2016/01/11/side-loading-application-without-sccm-part-2)
- [Partie 3 (Vous êtes ici)](/2016/01/11/side-loading-application-without-sccm-part-3)

0 comments on commit 4778cb6

Please sign in to comment.