f3-logo-flexerasoftware

Voici un article que vous propose un collègue Thomas RIBEIRO sur l’active Setup.

  • 1 – Fonctionnement :

Un active Setup est similaire à un RunOnce, cela permet de lancer une commande.
La commande sera lancée une seule fois pour les utilisateurs (existants ou nouveaux) lors de l’ouverture de session.

Les clés de registre à mettre en place pour utiliser un ActiveSetup se trouvent dans :

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\<UID>

Lors de l’exécution de l’ActiveSetup à l’ouverture de session, une clé de registre sera placée dans :

  • HKEY_CURRENT_USER\Software\Microsoft\Active Setup\Installed Components\<UID>

Si la clé utilisateur existe, l’Active setup ne sera plus joué pour l’utilisateur.

Le <UID> doit être unique; il est conseillé d’utiliser le GUID (Product Code).
Si l’entrée registre n’est pas trouvée dans le HKCU, le contenu de la valeur StubPath est alors exécuté.
La valeur de StubPath peut correspondre au lancement d’un script, d’une commande DOS, d’un MSI, etc.

  • 2 – Réécriture des entrées registre utilisateur

Pour réécrire les clés registre utilisateur, il faut réparer le msi avec la commande suivante:

Msiexec.exe /fu <ProductCode> /qn
/f – Repair
/u – all required user-specific registry entries
/qn – Silent mode with no UI.

Voici en quelques étapes, comment créer un active setup avec l’outil InstallShield.

Etape 1 : ouvrir le .msi ou créer un transform et aller dans la section ‘Registry’

activesetup1

Etape 2 : Créer la clé

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\[ProductCode]

activesetup2

Note: [ProductCode] est une variable du .msi qui est remplacée par la valeur du Product Code lorsque le package est installé. On peut également nommer la clé avec la valeur du Product Code ou la valeur du Product Name plutôt que la variable.
Pour récupérer la valeur du Product Code, aller dans la section ‘General Information’ :

activesetup3

Etape 3 : Créer une nouvelle valeur de type String et la nommer ‘StubPath’

activesetup4

Etape 4 : Double cliquer sur ‘StubPath’  et taper msiexec /fu [ProductCode] /qn

activesetup5

Etape 5 : Lorsque l’Active Setup est joué, une fenêtre apparaît avec la commande écrite dans la valeur de StubPath. Pour modifier cet affichage, on peut ajouter, toujours sous InstallShield, la valeur de type ‘Default Value’ et la paramétrer pour qu’elle soit plus explicite (Dans cet exemple : Configuration de mon logiciel).

activesetup6

N.B. : Dans cet exemple, nous avons repare seulement les entrees registre. pour reparer l’integralite du package, il faut utiliser la commande suivante :
msiexec.exe /fauvs <prodcutcode> /qn

  • 3 – Vérification de l’exécution

Pour vérifier que la clé Active Setup s’est bien installée, il faut ouvrir l’éditeur de registre et vérifier que la présence de la clé dans :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\<UID>
Ou
HKEY_LOCAL_MACHINE\SOFTWARE\ Wow6432Node\Microsoft\ Active Setup\Installed Components\<UID>

Dans la capture ci-dessous, on peut voir que la variable [ProductCode] a bien été remplacée par le Product Code.

activesetup7

Pour vérifier que la clé s’est bien jouée, il faut ouvrir l’éditeur de registre et vérifier la présence de la clé dans :
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Active Setup\Installed Components\<UID>
Ou
HKEY_CURRENT_USER \SOFTWARE\ Wow6432Node\Microsoft\ Active Setup\Installed Components\<UID>

activesetup8

  • 4 – Supprimer un active Setup

Créer une custom action de désinstallation et insérer le code suivant en l’adaptant à vos besoins (il suffit de modifier le product code {B4C18CC8-B2B6-4083-8FBE-7ED35A5CFA5E} par le votre).


'DeleteActiveSetup "{B4C18CC8-B2B6-4083-8FBE-7ED35A5CFA5E}"
'Fonctions
'Fonction delete active setup
Sub DeleteActiveSetup(KeyName)
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_USERS = &H80000003
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
Set WshShell = CreateObject("WScript.Shell")
strKeyPath = ""
objReg.EnumKey HKEY_USERS, strKeyPath, arrSubKeys
'Vérification du type de processeur
If Get_TypeOS="x64" Then
KeyPath = "\Software\Wow6432Node\Microsoft\Active Setup\Installed Components\" & KeyName
Else
KeyPath = "\Software\Microsoft\Active Setup\Installed Components\" & KeyName
End If
'Liste de tous les profils dans la HKEY_USERS
For Each subkey In arrSubKeys
'Suppression des profils locaux et "Classes"
If (InStr(subkey, "S-1-5-21-")>0 And InStr(subkey, "Classes")=0) Then
strKeyPath = subkey & KeyPath
'Suppression de la clé
If VerifRegKeyExist("HKEY_USERS\" & strKeyPath) = 0 Then WshShell.Run "REG DELETE " & chr(34) & "HKEY_USERS\" & strKeyPath & Chr(34) &" /f",0,True End If                End If
Next
'Recuperation du chemin où se trouvent les profils utilisateurs
strProfilePath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
strValueName = "ProfilesDirectory"
objReg.GetStringValue HKEY_LOCAL_MACHINE,strProfilePath,strValueName,strValueProfile
ProfilesDirectory = strValueProfile
'Parcours des dossiers utilisateurs pour monter leur ruche
Set objFolder = objFSO.GetFolder(ProfilesDirectory)
Set colSubfolders = objFolder.SubFolders
Path2="\NTUSER.DAT"
For Each objSubfolder in colSubfolders
If objFSO.FileExists(objSubFolder.Path & Path2) Then
'Chargement de la ruche dans l'arborescence HKEY_USERS\Temp
WshShell.Run "REG LOAD HKEY_USERS\Temp " & objSubFolder.Path & Path2,0,True
'Modifications
If VerifRegKeyExist("HKEY_USERS\Temp" & KeyPath) = 0 Then  WshShell.Run "REG DELETE " & chr(34) & "HKEY_USERS\Temp" & KeyPath & chr(34) & " /f",0,True End if
'Dechargement de la ruche
WshShell.Run "REG UNLOAD HKEY_USERS\Temp ",0,True
End If
Next
Set objFSO = Nothing
Set objReg = Nothing
Set WshShell = Nothing
Set objFolder = Nothing
Set colSubfolders = Nothing
End Sub
'Fonction pour verifier la presence d'une cle
Function VerifRegKeyExist(path)
Const HKEY_CLASSES_ROOT = &H80000000
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_USERS = &H80000003
Const HKEY_CURRENT_CONFIG = &H80000005
VerifRegKeyExist = 0
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
HKEYType = Mid(path,1,InStr(path, "\")-1)
KeyName = Mid(path,InStrRev(path, "\")+1,Len(path))
HKEYpath = Split(path,"\")
Select Case HKEYType
Case "HKEY_CLASSES_ROOT"    HKEY = HKEY_CLASSES_ROOT
Case "HKEY_CURRENT_USER"    HKEY = HKEY_CURRENT_USER
Case "HKEY_LOCAL_MACHINE"   HKEY = HKEY_LOCAL_MACHINE
Case "HKEY_USERS"            HKEY = HKEY_USERS
Case "HKEY_CURRENT_CONFIG"  HKEY = HKEY_CURRENT_CONFIG
Case Else
VerifRegKeyExist = -1
Exit Function
End Select
strKeyPathSearch = ""
strKeyPath = ""
j = 0
For i=1 To UBound(HKEYpath) Step 1
oReg.EnumKey HKEY, strKeyPath, arrSubKeys
For Each subkey In arrSubKeys
If subkey = HKEYpath(i) Then
j = j + 1
End If
Next
If (i > j) Then
VerifRegKeyExist = -1
Exit Function
End If
strKeyPathSearch = strKeyPathSearch & "\" & HKEYpath(i)
strKeyPath = Mid(strKeyPathSearch,2,Len(strKeyPathSearch))
Next
End Function
'Fonction pour recuperer l'architecture processeur
Function Get_TypeOS()
Set WshShell = CreateObject("WScript.Shell")
OsType = WshShell.RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\PROCESSOR_ARCHITECTURE")
If OsType = "x86" then
Get_TypeOS = "x86"
elseif OsType = "AMD64" then
Get_TypeOS = "x64"
end If
End Function