static void Main(string[] args) { bool newConsole = ConsoleControl.AllocConsole(); ConsoleControl.SetConsoleIcon(ConsoleControl.ApplicationIcon); // we need that early on (for error reporting) OptionName = CommandLineUtilities.GetArgument <string>(args, "name", DefaultName); OptionEncoding = CommandLineUtilities.GetArgument <Encoding>(args, "encoding", null); if (OptionEncoding != null) { _oldEncoding = Console.OutputEncoding; Console.WriteLine("Switching output encoding from '" + _oldEncoding.WebName + "' to '" + OptionEncoding.WebName + "'"); Console.OutputEncoding = OptionEncoding; } _closed = new AutoResetEvent(true); _service = new Program(); _service.AutoLog = false; _service.EventLog.Source = OptionName; SetErrorMode(SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS); AppDomain.CurrentDomain.UnhandledException += OnCurrentDomainUnhandledException; try { SafeMain(args); } catch (Exception e) { bool reported = false; if (_service != null) { try { _service.EventLog.WriteEntry("Service Host '" + OptionName + "' was stopped due to an error: " + e, EventLogEntryType.Error); reported = true; } catch { } } if (!reported) { EventLog.WriteEntry(OptionName, "Service Host '" + OptionName + "' was stopped due to an error: " + e, EventLogEntryType.Error); } EventLog.WriteEntry(OptionName, "Service Host '" + OptionName + "' was stopped due to an error: " + e, EventLogEntryType.Error); Log("Fatal error. Details:"); Log(e); } if (_oldEncoding != null) { Console.OutputEncoding = _oldEncoding; } if (newConsole) { ConsoleControl.FreeConsole(); } ConsoleControl.SetConsoleIcon(0); }
static void SafeMain(string[] args) { AddERExcludedApplication(Process.GetCurrentProcess().MainModule.ModuleName); Console.WriteLine("TraceSpy Service - " + (Environment.Is64BitProcess ? "64" : "32") + "-bit - Build Number " + Assembly.GetExecutingAssembly().GetInformationalVersion()); Console.WriteLine("Copyright (C) SoftFluent S.A.S 2012-" + DateTime.Now.Year + ". All rights reserved."); var token = Extensions.GetTokenElevationType(); if (token != TokenElevationType.Full) { Console.WriteLine(""); Console.WriteLine("Warning: token elevation type (UAC level) is " + token + ". You may experience access denied errors from now on. You may fix these errors if you restart with Administrator rights or without UAC."); Console.WriteLine(""); } OptionHelp = CommandLineUtilities.GetArgument(args, "?", false); if (!OptionHelp) { OptionHelp = CommandLineUtilities.GetArgument(args, "h", false); if (!OptionHelp) { OptionHelp = CommandLineUtilities.GetArgument(args, "help", false); } } OptionService = CommandLineUtilities.GetArgument(args, "s", false); if (!OptionService) { if (OptionHelp) { Console.WriteLine("Format is " + Assembly.GetExecutingAssembly().GetName().Name + ".exe [options]"); Console.WriteLine("[options] can be a combination of the following:"); Console.WriteLine(" /? Displays this help"); Console.WriteLine(" /i Installs the <name> service"); Console.WriteLine(" /k Kills this process on any exception"); Console.WriteLine(" /u Uninstalls the <name> service"); Console.WriteLine(" /t Displays traces on the console"); Console.WriteLine(" /l:<name> Locale used"); Console.WriteLine(" default is " + CultureInfo.CurrentCulture.LCID); Console.WriteLine(" /name:<name> (Un)Installation uses <name> for the service name"); Console.WriteLine(" default is \"" + DefaultName + "\""); Console.WriteLine(" /displayName:<dname> (Un)Installation uses <dname> for the display name"); Console.WriteLine(" default is \"" + DefaultDisplayName + "\""); Console.WriteLine(" /description:<desc.> Installation ses <desc.> for the service description"); Console.WriteLine(" default is \"" + DefaultDisplayName + "\""); Console.WriteLine(" /startType:<type> Installation uses <type> for the service start mode"); Console.WriteLine(" default is \"" + ServiceStartMode.Manual + "\""); Console.WriteLine(" Values are " + ServiceStartMode.Automatic + ", " + ServiceStartMode.Disabled + " or " + ServiceStartMode.Manual); Console.WriteLine(" /user:<name> Name of the account under which the service should run"); Console.WriteLine(" default is Local System"); Console.WriteLine(" /password:<text> Password to the account name"); Console.WriteLine(" /config:<path> Path to the configuration file"); Console.WriteLine(" /dependson:<list> A comma separated list of service to depend on"); Console.WriteLine(""); Console.WriteLine("Examples:"); Console.WriteLine(Assembly.GetExecutingAssembly().GetName().Name + " /i /name:MyService /displayName:\"My Service\" /startType:Automatic"); Console.WriteLine(Assembly.GetExecutingAssembly().GetName().Name + " /u /name:MyOtherService"); return; } } OptionTrace = CommandLineUtilities.GetArgument(args, "t", false); OptionKillOnException = CommandLineUtilities.GetArgument(args, "k", false); OptionInstall = CommandLineUtilities.GetArgument(args, "i", false); OptionStartType = (ServiceStartMode)CommandLineUtilities.GetArgument(args, "starttype", ServiceStartMode.Manual); OptionLcid = CommandLineUtilities.GetArgument <string>(args, "l", null); OptionUninstall = CommandLineUtilities.GetArgument(args, "u", false); OptionAccount = (ServiceAccount)CommandLineUtilities.GetArgument(args, "user", ServiceAccount.User); OptionPassword = CommandLineUtilities.GetArgument <string>(args, "password", null); OptionUser = CommandLineUtilities.GetArgument <string>(args, "user", null); string dependsOn = CommandLineUtilities.GetArgument <string>(args, "dependson", null); if (!string.IsNullOrEmpty(dependsOn)) { OptionDependsOn = dependsOn.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); } else { OptionDependsOn = null; } OptionConfigPath = CommandLineUtilities.GetArgument <string>(args, "config", null); if (!string.IsNullOrEmpty(OptionConfigPath) && !Path.IsPathRooted(OptionConfigPath)) { OptionConfigPath = Path.GetFullPath(OptionConfigPath); } _configuration = ServiceSection.Get(OptionConfigPath); OptionDisplayName = CommandLineUtilities.GetArgument(args, "displayname", DefaultDisplayName); OptionDescription = CommandLineUtilities.GetArgument(args, "description", DefaultDescription); if (OptionInstall) { ServiceInstaller si = new ServiceInstaller(); ServiceProcessInstaller spi = new ServiceProcessInstaller(); si.ServicesDependedOn = OptionDependsOn; Console.WriteLine("OptionAccount=" + OptionAccount); Console.WriteLine("OptionUser="******"Password cannot be empty if Account is set to User."); return; } spi.Username = OptionUser; spi.Password = OptionPassword; } } else { spi.Account = OptionAccount; } si.Parent = spi; si.DisplayName = OptionDisplayName; si.Description = OptionDescription; si.ServiceName = OptionName; si.StartType = OptionStartType; si.Context = new InstallContext(Assembly.GetExecutingAssembly().GetName().Name + ".install.log", null); string asmpath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, AppDomain.CurrentDomain.FriendlyName); // TODO: add instance specific parameters here (ports, etc...) string binaryPath = "\"" + asmpath + "\"" // exe path + " /s" // we run as a service + " /name:" + OptionName; // our name if (!string.IsNullOrEmpty(OptionConfigPath)) { binaryPath += " /c:\"" + OptionConfigPath + "\""; } si.Context.Parameters["assemblypath"] = binaryPath; IDictionary stateSaver = new Hashtable(); si.Install(stateSaver); // see remarks in the function FixServicePath(si.ServiceName, binaryPath); return; } if (OptionUninstall) { ServiceInstaller si = new ServiceInstaller(); ServiceProcessInstaller spi = new ServiceProcessInstaller(); si.Parent = spi; si.ServiceName = OptionName; si.Context = new InstallContext(Assembly.GetExecutingAssembly().GetName().Name + ".uninstall.log", null); si.Uninstall(null); return; } if (!OptionService) { if (OptionTrace) { Trace.Listeners.Add(new ConsoleListener()); } if (!string.IsNullOrEmpty(OptionLcid)) { Extensions.SetCurrentThreadCulture(OptionLcid); } Console.WriteLine("Console Mode"); Console.WriteLine("Service Host name: " + OptionName); WindowsIdentity identity = WindowsIdentity.GetCurrent(); Console.WriteLine("Service Host identity: " + (identity != null ? identity.Name : "null")); Console.WriteLine("Service Host bitness: " + (IntPtr.Size == 4 ? "32-bit" : "64-bit")); Console.WriteLine("Service Host display name: '" + OptionDisplayName + "'"); Console.WriteLine("Service Host event log source: " + _service.EventLog.Source); Console.WriteLine("Service Host trace enabled: " + OptionTrace); Console.WriteLine("Service Host administrator mode: " + IsAdministrator()); string configPath = OptionConfigPath; if (configPath == null) { configPath = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; } Console.WriteLine("Service Host config file path: " + configPath); Console.WriteLine("Service Host current locale: " + Thread.CurrentThread.CurrentCulture.LCID + " (" + Thread.CurrentThread.CurrentCulture.Name + ")"); Console.Title = OptionDisplayName; ConsoleControl cc = new ConsoleControl(); cc.Event += OnConsoleControlEvent; _service.InternalStart(args); if (!_stopping) { _service.InternalStop(); } else { int maxWaitTime = Configuration.ConsoleCloseMaxWaitTime; if (maxWaitTime <= 0) { maxWaitTime = Timeout.Infinite; } _closed.WaitOne(maxWaitTime, Configuration.WaitExitContext); } return; } ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { _service }; Run(ServicesToRun); }