String domain,String password,
UInt32 logonFlags,
String applicationName,
String commandLine,
UInt32 creationFlags,
UInt32 environment,
String currentDirectory,
ref StartupInfo startupInfo,
out ProcessInformation processInformation);
[DllImport("kernel32.dll", SetLastError=true)]
public static extern bool GetExitCodeProcess(IntPtr process, ref UInt32 exitCode);
[DllImport("Kernel32.dll", SetLastError=true)]
public static extern UInt32 WaitForSingleObject(IntPtr handle, UInt32 milliseconds);
[DllImport("Kernel32.dll", SetLastError=true)]
public static extern IntPtr GetStdHandle(IntPtr handle);
[DllImport("Kernel32.dll", SetLastError=true)]
public static extern bool CloseHandle(IntPtr handle);
public static void Launch(string command, string user, string domain, string pwd){
StartupInfo startupInfo = new StartupInfo();
startupInfo.reserved = null;
startupInfo.flags &= Startf_UseStdHandles;
startupInfo.stdOutput = (IntPtr)StdOutputHandle;
startupInfo.stdError = (IntPtr)StdErrorHandle;
UInt32 exitCode = 123456;
ProcessInformation processInfo = new ProcessInformation();
String currentDirectory = System.IO.Directory.GetCurrentDirectory();
try
{
CreateProcessWithLogonW(
user,
domain,
pwd,
(UInt32) 1,
command,
command,
(UInt32) 0,
(UInt32) 0,
currentDirectory,
ref startupInfo,
out processInfo);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
Console.WriteLine("Exécution ...");
WaitForSingleObject(processInfo.process, Infinite);
GetExitCodeProcess(processInfo.process, ref exitCode);
Console.WriteLine("Code sortie: {0}", exitCode);
CloseHandle(processInfo.process);
CloseHandle(processInfo.thread);
}}} 3. Dans le point d'entrée de l'application, j'ai ajouté le code pour vérifier l'existence du Framework .NET 3.5 sur le poste client en vérifiant la présence de clé dans la base de registre. using System.Windows.Forms;using System.Data;using System.Configuration;using System.Collections;using Microsoft.Win32;namespace Lanceur{////// Classe lanceur/// public class MainClass{/// /// Point d'entrée principal de l'application.///[STAThread]static void Main() {string application = ConfigurationSettings.AppSettings["application"];
try
{
Console.WriteLine("Vérification de composant requis.");
// Vérifier si framework .NET3.5 est installé
if(!NETInstalled())
{
Console.WriteLine("Installation de composant requis en cours ....");
string cmd = @ConfigurationSettings.AppSettings["cmd"];
// Installation en silence
cmd = cmd + " /q:a /c:'setup.exe /q /norestart' /norestart";
string user = ConfigurationSettings.AppSettings["user"];
string domain = ConfigurationSettings.AppSettings["domain"];
string pwd = ConfigurationSettings.AppSettings["pwd"];
// Installation du framework .NET 3.5
CreateProcessWithLogon.Launch(cmd, user,domain,pwd);
Console.WriteLine("Installation de composant requis est teminé.");
// Installation de l'application
Console.WriteLine("Installation de l'application.");
InstallApplication(application);
}
else
{
// Installation de l'application
Console.WriteLine("Installation de l'application.");
InstallApplication(application);
}
}
catch(Exception Ex)
{…}
// Lancement de l'application
try
{
// Code propre à l'application
Application.Run((System.Windows.Forms.Form)(IHMManager.Instance.getIhmPrincipale()));
}
catch(….)
{}
}}private static bool NETInstalled(){RegistryKey cle = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\NET Framework Setup\\NDP\\v3.5");
if(cle == null) {return false;
} return true;}private static void InstallApplication(string application){ try { // Prévenir l'utilisateur qi tout se passe bien, de passer par la nouvelle icône pour la prochaine connexion MessageBox.Show("L'application [NOMAPPLICATION] sera installée sur votre poste. Merci de cliquer sur la nouvelle icône sur votre bureau pour la prochaine connexion.");System.Threading.Thread.Sleep(500);
System.Diagnostics.Process.Start(@application);
System.Diagnostics.Process.Start(@application);
}catch(Exception Ex){throw Ex;
}}}}Cette solution n'a finalement pas été retenue. Mais cela me permet de découvrir une possibilité sur le moyen d'installation les éléments requis. On utilise finalement un outil PsTools->PsExec qui permet d'installer à distance et en masse une application sur un poste client sous contexte d'un administrateur.