PI Services

Le blog des collaborateurs de PI Services

Réaliser un package MSI multi-langues à partir de plusieurs MSI

 

L’objectif de ce tutoriel est de réaliser un package MSI multi-langues à partir de plusieurs MSI de différentes langues. InstallSite et Microsoft fournisse leur propre méthode à base de vbscript. Ici nous utiliserons InstEd.

Dans notre cas présent, nous avons 4 MSI de 4 langues. Nous en garderons un qui servira de référence. Ensuite, nous modifions le MSI de référence pour le rendre multi-langues. Nous générons les MST de chacune des langues. Finalement, nous les stockons dans le MSI de référence.

1. Rendre un MSI multi-langues

  • Ouvrir le MSI de référence avec InstEd
  • Parcourir le menu Tables/Summary info
  • Ajouter au champ « Languages » les langues à venir, par leur LangID et séparer par des virgules.

2. Générer les MST

  • Ouvrir le MSI d’une langue
  • Parcourir le menu Transform/Generate Against…
  • Sélectionner le MSI de référence
  • Enregistrer le différentiel dans un MST. Garder le nom de la langue dans le nom de fichier peut aider à s’organiser.

Répéter ces actions autant de fois que vous avez de langues différentes.

3. Stocker les MST dans le MSI de référence

  • Ouvrir le MSI de référence
  • Ajouter un enregistrement à la table _Storage en choisissant le MST d’une langue en guise de donnée et le LangID du MST pour le nom.

Il est important de respecter cette convention de nommage car c’est une clé du mécanisme Windows Installer permettant de charger le MST correspondant à la langue de l’utilisateur (UserLanguageID ) à l’exécution du MSI.

Répéter ces actions autant de fois qu’il y a de langues. En n’oubliant pas que chaque MST ajouté doit avoir sa LangID associée ajouté au champ « Languages » dans « Summary Info ».

Voilà, c’est fini.

Récupérer les informations de l'utilisateur connecté et réévaluer le chemin d'installation des composants

L’objectif est de récupérer les variables d’environnement de l’utilisateur en cours d’installation d’un package MSI. La difficulté est que l’installation par certain outil de télédistribution installent les packages avec le compte système.

Ci-joint vous trouverez un script vbs permettant de récupérer ces informations. Nous allons décrire les actions suivantes :

  • Ajout du vbscript dans une « custom action »
  • Séquencer cette « custom action »
  • Modifier l’installation d’un composant en fonction d’une variable utilisateur
  • Séquencer cette « custom action »
  • Utilisation de cette nouvelle valeur dans le chemin d’installation du composant

1. Créer une nouvelle « custom action » pour exécuter le vbscript

  • Ouvrir le MSI avec InstEd
  • Ajouter un nouvel enregistrement dans la table CustomAction, de type 38 (0x26 - VBScript - Source: Null - Target: script text | Scheduling: Always).
  • Recopier le contenu du script ci-joint dans le champ Target.

Par exemple :

clip_image003

Voici les variables d’environnement récupérées et les variables « windows installer » affectées :

clip_image005

 

2. Séquencer la « custom action »

Par exemple :

clip_image007

 

3. Créer une nouvelle « custom action » pour modifier les composants à partir des nouvelles informations

  • Ajouter un nouvel enregistrement dans la table CustomAction, de type 35 (0x23 - Directory - Source: Directory to be set - Target: formatted text | Scheduling: Always).

clip_image009

Cette « custom action » va donc affecter au répertoire « LogonUserProfile » la variable windows installer « LogonUserProfile »

 

4. Séquencer la « custom action »

Pas de condition à ajouter, car elle doit être exécutée dans tous les cas, installation, rollback, désinstallation et auto-réparation.

Par exemple :

clip_image011

Par exemple, ici nous avons positionné un fichier dans le profil de l’utilisateur. Ce fichier est contenu dans un composant :

clip_image013

Le chemin d’installation du composant sera donc automatique réévalué à l’installation, rollback, désinstallation et auto-réparation.

Ce principe pourra également être utilisé pour des package MSI x86/x64 pour des composants nécessitant un chemin différent suivant l’architecture du poste de travail.

***************************************

Get_LogonUsersVars.vbs

Option Explicit

Const HKEY_USERS = &H80000003

Dim strKeyPath, subKey, arrKeys

Dim oReg
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

Dim oShell
Set oShell = CreateObject("Wscript.Shell")

strKeyPath = "Volatile Environment"

'*** DEBUT DU MAIN ***

oReg.EnumKey HKEY_USERS, "", arrKeys
  
For Each subkey In arrKeys    
    
     If RegExists("HKEY_USERS\" & subkey & "\" & strKeyPath & "\") Then

    Session.Property("LogonUserSID") = subkey

    'Msgbox "User's SID : " & Session.Property("LogonUserSID")

    Session.Property("LogonUserName") = oShell.RegRead("HKEY_USERS\" & subkey & "\" & strKeyPath & "\USERNAME")

    'Msgbox "LogonUserName : " & Session.Property("LogonUserName")

    Session.Property("LogonUserAppData") = oShell.RegRead("HKEY_USERS\" & subkey & "\" & strKeyPath & "\APPDATA")

    'Msgbox "LogonUserAppData : " & Session.Property("LogonUserAppData")

    Session.Property("LogonUserProfile") = oShell.RegRead("HKEY_USERS\" & subkey & "\" & strKeyPath & "\USERPROFILE")

    'Msgbox "LogonUserProfile : " & Session.Property("LogonUserProfile")

                
     End If
 
Next     

'*** FIN DU MAIN ***

' Test d'existence d'une clé de registre
Function RegExists(value)

    On Error Resume Next

    Dim Val
            val = oShell.RegRead(value)

    If (Err.number = -2147024893) or (Err.number = -2147024894) Then
        RegExists = False
    Else
        RegExists = True
    End If

End Function

Passer du BootLoader de Windows 8 à Windows 7

 

Vous aviez sur votre poste Windows 7 et vous venez d’installer Windows 8 sur une seconde partition.

image

Windows 8 étant le dernier système d’exploitation à avoir été installé, vous serez donc confronté au bootloader de Windows 8. Cependant, la procédure de démarrage de Windows 8 détient une petite subtilité. Contrairement au gestionnaire de boot de Windows 7, celui de Windows 8 ne sera affiché qu’après chargement de ce nouvel OS.

clip_image001

Cela signifie que si vous souhaitez démarrer sous Windows 7, l’ordinateur va alors de nouveau redémarrer pour booter sur Windows 7. Cette situation peut être contraignante en termes de temps.

Nous allons donc voir comment remettre le BootLoader de Windows 7.

Démarrons par exemple sous Windows 8. (La méthode fonctionne également sous Windows 7)

Dans notre explorateur, on peut voir que la partition C : correspond à notre Windows 8.

Sur la partition D : est donc présente l’installation de Windows 7.

clip_image002

Ouvrez une commande cmd avec les droits administrateurs.

Tapez :

bcdboot d:\windows

(d: étant la partition hébergeant Windows 7)

la réponse suivante s’affiche

Sans titre2

Les fichiers de boot viennent alors de se mettre à jour.

Maintenant en redémarrant,

clip_image005

Le bootLoader de Windows 7 est désormais restauré.

Exchange 2010 – Retrouver les permissions d’une boite

On a souvent besoin de connaitre les permissions affectées à une boite aux lettres.

Le script ci-dessous permet d’obtenir les droits mis en place par un administrateur

(send as , send on behalf, full access) ainsi que les droits donnés par l’utilisateur

via Outlook.

Voici le résultat:

image

Le script peut s’utiliser de deux façons.

Utilisation en indiquant un argument:


./getmailboxperm.ps1 jean@domaine.fr
 
Utilisation avec une invite de saisie:

image

Il faut bien entendu adapter le script au choix souhaité.

Bonne utilisation.

############################################################################
# Affiche les droits spécifiques sur une boites ainsi que les autorisations MAPI Exchange 2010
#############################################################################
 
 
#/*MBX Permission*/

#/*Utilisation avec argument (exemple) : ./getmailboxperm.ps1 pascal@domaine.fr

#$Email=$Args[0]
 
#/*Utilisation avec une invite de saisie

$Email = read-host -prompt "Entrez l'adresse de messagerie "
 
[string]$Mailbox = Get-Mailbox -Identity $Email
 
Write-Host

Write-Host "*******************************************************************************" -foregroundcolor yellow
Write-Host "*********** Autorisation sur la boite de $Email" -foregroundcolor red
Write-Host "*******************************************************************************" -foregroundcolor yellow
Write-Host

#/*Full Access*/
$FullAccess = Get-MailboxPermission $Email | where { ($_.AccessRights -eq "FullAccess") -and ($_.IsInherited -eq $false)  -and -not ($_.User -like "NT AUTHORITY\SELF") } | Select User
Write-Host "Contrôle TOTAL:" -foregroundcolor Green
Write-Host
Foreach ($User in $FullAccess)
  {
   Write-Host $User.User
  }
Write-host
#/*Send As*/
#Get-ADPermission -Identity $Sam | Where {$_.ExtendedRights -like "Send-As" -and $_.User -notlike "NT AUTHORITY\SELF" -and $_.Deny -eq $false} | ft Identity,User,ExtendedRights,IsInherited
$SendAs = Get-ADPermission -Identity $Mailbox | Where {$_.ExtendedRights -like "Send-As" -and $_.User -notlike "NT AUTHORITY\SELF" -and $_.Deny -eq $false} | Select User
Write-Host "Envoyer en tant que (send as):" -foregroundcolor Green
Write-host
Foreach ($User in $SendAs)
  {
   Write-Host $User.User
  }
Write-Host
#/*Send on Behalf*/
#$SendOnBehalf = get-mailbox -Identity $Email | Select GrantSendOnBehalfTo
$SendOnBehalf = get-mailbox -Identity $Email | Select @{Name="SendOnBehalf";Expression={$_."GrantSendOnBehalfTo"}}
Write-Host "Envoyer de la part de:" -foregroundcolor Green
Write-Host
Foreach ($User in $SendOnBehalf)
  {
   Write-Host $User.SendOnBehalf
  }
Write-Host
#/*MailboxFolders*/
$folders = Get-MailboxFolderStatistics -Identity $Email | Where {$_.Foldertype -ne "SyncIssues" -and $_.Foldertype -ne "Conflicts" -and $_.Foldertype -ne "LocalFailures" -and $_.Foldertype -ne "ServerFailures" -and $_.Foldertype -ne "RecoverableItemsRoot" -and $_.Foldertype -ne "RecoverableItemsDeletions" -and $_.Foldertype -ne "RecoverableItemsPurges" -and $_.Foldertype -ne "RecoverableItemsVersions" -and $_.Foldertype -ne "Root"} | select folderpath
 
Write-Host "Dossiers de la boîte :" -foregroundcolor Green
Write-Host
Foreach ($Folder in $folders)
  {
   Write-Host $Folder.Folderpath
  }
Write-Host
 
#/*MAPI Permissions*/
Write-Host "MAPI Permissions:" -foregroundcolor Green
Write-Host
get-mailboxfolderpermission -identity $Email":\" | ft foldername, User, AccessRights
Foreach ($Folder in $folders)
  {
   $NormalizedFolder = $Folder.FolderPath.Replace("/","\")
   $NormalizedIdentity = $Email + ":" + $NormalizedFolder
   get-mailboxfolderpermission -identity $NormalizedIdentity | ft foldername, User, AccessRights
  }