Bläddra i källkod

Fix issue where SyncTrayzor would be started as admin after auto-upgrade

Antony Male 10 år sedan
förälder
incheckning
51878e0483

+ 1 - 1
installer/x64/installer-x64.iss

@@ -74,7 +74,7 @@ Name: "{commondesktop}\{#AppName}"; Filename: "{app}\{#AppExeName}"; Tasks: desk
 
 [Run]
 Filename: "{tmp}\dotNet451Setup.exe"; Parameters: "/passive /promptrestart"; Check: FrameworkIsNotInstalled; StatusMsg: "Microsoft .NET Framework 4.5.1 is being installed. Please wait..."
-Filename: "{app}\{#AppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(AppName, '&', '&&')}}"; Flags: nowait postinstall
+Filename: "{app}\{#AppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(AppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
 
 [Code]
 function FrameworkIsNotInstalled: Boolean;

+ 1 - 1
installer/x86/installer-x86.iss

@@ -72,7 +72,7 @@ Name: "{commondesktop}\{#AppName}"; Filename: "{app}\{#AppExeName}"; Tasks: desk
 
 [Run]
 Filename: "{tmp}\dotNet451Setup.exe"; Parameters: "/passive /promptrestart"; Check: FrameworkIsNotInstalled; StatusMsg: "Microsoft .NET Framework 4.5.1 is being installed. Please wait..."
-Filename: "{app}\{#AppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(AppName, '&', '&&')}}"; Flags: nowait postinstall
+Filename: "{app}\{#AppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(AppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
 
 [Code]
 function FrameworkIsNotInstalled: Boolean;

+ 33 - 3
src/InstallerRunner/Program.cs

@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Diagnostics;
+using System.IO;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
@@ -12,14 +13,39 @@ namespace InstallerRunner
     {
         private const int ERROR_CANCELLED = 1223;
 
-        static int Main(string[] args)
+        static int Main(string[] argsIn)
         {
-            if (args.Length == 0)
+            var args = new List<string>(argsIn);
+
+            string launch = null;
+            var indexOfLaunch = args.IndexOf("-launch");
+            if (indexOfLaunch > -1)
+            {
+                if (indexOfLaunch >= args.Count - 1)
+                {
+                    Console.Error.WriteLine("Must provide an argument to -launch");
+                    return 1;
+                }
+
+                launch = args[indexOfLaunch + 1];
+                args.RemoveAt(indexOfLaunch + 1);
+                args.RemoveAt(indexOfLaunch);
+            }
+
+            if (args.Count == 0)
             {
                 Console.Error.WriteLine("Must provide at least one command-line argument");
                 return 1;
             }
 
+            if (!File.Exists(args[0]))
+            {
+                Console.Error.WriteLine("Could not find {0}", args[0]);
+                return 4;
+            }
+
+            Console.WriteLine(String.Join(", ", args));
+
             var startInfo = new ProcessStartInfo()
             {
                 FileName = args[0],
@@ -30,7 +56,11 @@ namespace InstallerRunner
 
             try
             {
-                Process.Start(startInfo);
+                var process = Process.Start(startInfo);
+                process.WaitForExit();
+
+                if (!String.IsNullOrWhiteSpace(launch))
+                    Process.Start(launch);
             }
             catch (Win32Exception e)
             {

+ 8 - 2
src/SyncTrayzor/Services/ProcessStartProvider.cs

@@ -14,7 +14,7 @@ namespace SyncTrayzor.Services
         void Start(string filename);
         void Start(string filename, string arguments);
         void StartDetached(string filename);
-        void StartElevatedDetached(string filename, string arguments);
+        void StartElevatedDetached(string filename, string arguments, string launchAfterFinished = null);
     }
 
     public class ProcessStartProvider : IProcessStartProvider
@@ -50,8 +50,14 @@ namespace SyncTrayzor.Services
             Process.Start(startInfo);
         }
 
-        public void StartElevatedDetached(string filename, string arguments)
+        public void StartElevatedDetached(string filename, string arguments, string launchAfterFinished = null)
         {
+            if (arguments == null)
+                arguments = String.Empty;
+
+            if (launchAfterFinished != null)
+                arguments += String.Format(" -launch \"{0}\"", launchAfterFinished);
+
             var startInfo = new ProcessStartInfo()
             {
                 FileName = Path.Combine(Path.GetDirectoryName(this.exeDir), installerRunner),

+ 4 - 2
src/SyncTrayzor/Services/UpdateManagement/InstalledUpdateVariantHandler.cs

@@ -10,16 +10,18 @@ namespace SyncTrayzor.Services.UpdateManagement
     {
         private readonly IUpdateDownloader updateDownloader;
         private readonly IProcessStartProvider processStartProvider;
+        private readonly IAssemblyProvider assemblyProvider;
 
         private string installerPath;
 
         public string VariantName { get { return "installed"; } }
         public bool CanAutoInstall { get; private set; }
 
-        public InstalledUpdateVariantHandler(IUpdateDownloader updateDownloader, IProcessStartProvider processStartProvider)
+        public InstalledUpdateVariantHandler(IUpdateDownloader updateDownloader, IProcessStartProvider processStartProvider, IAssemblyProvider assemblyProvider)
         {
             this.updateDownloader = updateDownloader;
             this.processStartProvider = processStartProvider;
+            this.assemblyProvider = assemblyProvider;
         }
 
         public async Task<bool> TryHandleUpdateAvailableAsync(VersionCheckResults checkResult)
@@ -48,7 +50,7 @@ namespace SyncTrayzor.Services.UpdateManagement
             if (this.installerPath == null)
                 throw new InvalidOperationException("TryHandleUpdateAvailableAsync returned false: cannot call AutoInstall");
 
-            this.processStartProvider.StartElevatedDetached(this.installerPath, "/SILENT");
+            this.processStartProvider.StartElevatedDetached(this.installerPath, "/SILENT", this.assemblyProvider.Location);
         }
     }
 }