public override void Install(IDictionary stateSaver) { this.Context.LogMessage(System.ServiceProcess.Res.GetString("InstallingService", new object[1] { (object)this.ServiceName })); try { ServiceInstaller.CheckEnvironment(); string servicesStartName = (string)null; string password = (string)null; ServiceProcessInstaller processInstaller = (ServiceProcessInstaller)null; if (this.Parent is ServiceProcessInstaller) { processInstaller = (ServiceProcessInstaller)this.Parent; } else { for (int index = 0; index < this.Parent.Installers.Count; ++index) { if (this.Parent.Installers[index] is ServiceProcessInstaller) { processInstaller = (ServiceProcessInstaller)this.Parent.Installers[index]; break; } } } if (processInstaller == null) { throw new InvalidOperationException(System.ServiceProcess.Res.GetString("NoInstaller")); } switch (processInstaller.Account) { case ServiceAccount.LocalService: servicesStartName = "NT AUTHORITY\\LocalService"; break; case ServiceAccount.NetworkService: servicesStartName = "NT AUTHORITY\\NetworkService"; break; case ServiceAccount.User: servicesStartName = processInstaller.Username; password = processInstaller.Password; break; } string binaryPath = this.Context.Parameters["assemblypath"]; if (string.IsNullOrEmpty(binaryPath)) { throw new InvalidOperationException(System.ServiceProcess.Res.GetString("FileName")); } if (binaryPath.IndexOf('"') == -1) { binaryPath = "\"" + binaryPath + "\""; } if (!ServiceInstaller.ValidateServiceName(this.ServiceName)) { throw new InvalidOperationException(System.ServiceProcess.Res.GetString("ServiceName", (object)this.ServiceName, (object)80.ToString((IFormatProvider)CultureInfo.CurrentCulture))); } else if (this.DisplayName.Length > (int)byte.MaxValue) { throw new ArgumentException(System.ServiceProcess.Res.GetString("DisplayNameTooLong", new object[1] { (object)this.DisplayName })); } else { string dependencies = (string)null; if (this.ServicesDependedOn.Length > 0) { StringBuilder stringBuilder = new StringBuilder(); for (int index = 0; index < this.ServicesDependedOn.Length; ++index) { string name = this.ServicesDependedOn[index]; try { name = new ServiceController(name, ".").ServiceName; } catch { } stringBuilder.Append(name); stringBuilder.Append(char.MinValue); } stringBuilder.Append(char.MinValue); dependencies = ((object)stringBuilder).ToString(); } IntPtr num1 = SafeNativeMethods.OpenSCManager((string)null, (string)null, 983103); IntPtr num2 = IntPtr.Zero; if (num1 == IntPtr.Zero) { throw new InvalidOperationException(System.ServiceProcess.Res.GetString("OpenSC", new object[1] { (object)"." }), (Exception) new Win32Exception()); } else { int serviceType = 16; int num3 = 0; for (int index = 0; index < this.Parent.Installers.Count; ++index) { if (this.Parent.Installers[index] is ServiceInstaller) { ++num3; if (num3 > 1) { break; } } } if (num3 > 1) { serviceType = 32; } try { num2 = System.ServiceProcess.NativeMethods.CreateService(num1, this.ServiceName, this.DisplayName, 983551, serviceType, (int)this.StartType, 1, binaryPath, (string)null, IntPtr.Zero, dependencies, servicesStartName, password); if (num2 == IntPtr.Zero) { throw new Win32Exception(); } if (this.Description.Length != 0) { System.ServiceProcess.NativeMethods.SERVICE_DESCRIPTION serviceDesc = new System.ServiceProcess.NativeMethods.SERVICE_DESCRIPTION(); serviceDesc.description = Marshal.StringToHGlobalUni(this.Description); bool flag = System.ServiceProcess.NativeMethods.ChangeServiceConfig2(num2, 1U, ref serviceDesc); Marshal.FreeHGlobal(serviceDesc.description); if (!flag) { throw new Win32Exception(); } } if (Environment.OSVersion.Version.Major > 5 && this.StartType == ServiceStartMode.Automatic) { if (!System.ServiceProcess.NativeMethods.ChangeServiceConfig2(num2, 3U, ref new System.ServiceProcess.NativeMethods.SERVICE_DELAYED_AUTOSTART_INFO() { fDelayedAutostart = this.DelayedAutoStart })) { throw new Win32Exception(); } } stateSaver[(object)"installed"] = (object)true; } finally { if (num2 != IntPtr.Zero) { SafeNativeMethods.CloseServiceHandle(num2); } SafeNativeMethods.CloseServiceHandle(num1); } this.Context.LogMessage(System.ServiceProcess.Res.GetString("InstallOK", new object[1] { (object)this.ServiceName })); } } } finally { base.Install(stateSaver); } }
public static bool ChangeServiceConfig2(IntPtr serviceHandle, uint infoLevel, ref System.ServiceProcess.NativeMethods.SERVICE_DESCRIPTION serviceDesc);
public override void Install(IDictionary stateSaver) { base.Context.LogMessage(System.ServiceProcess.Res.GetString("InstallingService", new object[] { this.ServiceName })); try { CheckEnvironment(); string servicesStartName = null; string password = null; ServiceProcessInstaller parent = null; if (base.Parent is ServiceProcessInstaller) { parent = (ServiceProcessInstaller)base.Parent; } else { for (int j = 0; j < base.Parent.Installers.Count; j++) { if (base.Parent.Installers[j] is ServiceProcessInstaller) { parent = (ServiceProcessInstaller)base.Parent.Installers[j]; break; } } } if (parent == null) { throw new InvalidOperationException(System.ServiceProcess.Res.GetString("NoInstaller")); } switch (parent.Account) { case ServiceAccount.LocalService: servicesStartName = @"NT AUTHORITY\LocalService"; break; case ServiceAccount.NetworkService: servicesStartName = @"NT AUTHORITY\NetworkService"; break; case ServiceAccount.User: servicesStartName = parent.Username; password = parent.Password; break; } string str3 = base.Context.Parameters["assemblypath"]; if (string.IsNullOrEmpty(str3)) { throw new InvalidOperationException(System.ServiceProcess.Res.GetString("FileName")); } if (str3.IndexOf('"') == -1) { str3 = "\"" + str3 + "\""; } if (!ValidateServiceName(this.ServiceName)) { object[] args = new object[] { this.ServiceName, 80.ToString(CultureInfo.CurrentCulture) }; throw new InvalidOperationException(System.ServiceProcess.Res.GetString("ServiceName", args)); } if (this.DisplayName.Length > 0xff) { throw new ArgumentException(System.ServiceProcess.Res.GetString("DisplayNameTooLong", new object[] { this.DisplayName })); } string dependencies = null; if (this.ServicesDependedOn.Length > 0) { StringBuilder builder = new StringBuilder(); for (int k = 0; k < this.ServicesDependedOn.Length; k++) { string name = this.ServicesDependedOn[k]; try { ServiceController controller = new ServiceController(name, "."); name = controller.ServiceName; } catch { } builder.Append(name); builder.Append('\0'); } builder.Append('\0'); dependencies = builder.ToString(); } IntPtr databaseHandle = SafeNativeMethods.OpenSCManager(null, null, 0xf003f); IntPtr zero = IntPtr.Zero; if (databaseHandle == IntPtr.Zero) { throw new InvalidOperationException(System.ServiceProcess.Res.GetString("OpenSC", new object[] { "." }), new Win32Exception()); } int serviceType = 0x10; int num4 = 0; for (int i = 0; i < base.Parent.Installers.Count; i++) { if (base.Parent.Installers[i] is ServiceInstaller) { num4++; if (num4 > 1) { break; } } } if (num4 > 1) { serviceType = 0x20; } try { zero = System.ServiceProcess.NativeMethods.CreateService(databaseHandle, this.ServiceName, this.DisplayName, 0xf01ff, serviceType, (int)this.StartType, 1, str3, null, IntPtr.Zero, dependencies, servicesStartName, password); if (zero == IntPtr.Zero) { throw new Win32Exception(); } if (this.Description.Length != 0) { System.ServiceProcess.NativeMethods.SERVICE_DESCRIPTION serviceDesc = new System.ServiceProcess.NativeMethods.SERVICE_DESCRIPTION { description = Marshal.StringToHGlobalUni(this.Description) }; bool flag = System.ServiceProcess.NativeMethods.ChangeServiceConfig2(zero, 1, ref serviceDesc); Marshal.FreeHGlobal(serviceDesc.description); if (!flag) { throw new Win32Exception(); } } if ((Environment.OSVersion.Version.Major > 5) && (this.StartType == ServiceStartMode.Automatic)) { System.ServiceProcess.NativeMethods.SERVICE_DELAYED_AUTOSTART_INFO service_delayed_autostart_info = new System.ServiceProcess.NativeMethods.SERVICE_DELAYED_AUTOSTART_INFO { fDelayedAutostart = this.DelayedAutoStart }; if (!System.ServiceProcess.NativeMethods.ChangeServiceConfig2(zero, 3, ref service_delayed_autostart_info)) { throw new Win32Exception(); } } stateSaver["installed"] = true; } finally { if (zero != IntPtr.Zero) { SafeNativeMethods.CloseServiceHandle(zero); } SafeNativeMethods.CloseServiceHandle(databaseHandle); } base.Context.LogMessage(System.ServiceProcess.Res.GetString("InstallOK", new object[] { this.ServiceName })); } finally { base.Install(stateSaver); } }
public override void Install(IDictionary stateSaver) { base.Context.LogMessage(System.ServiceProcess.Res.GetString("InstallingService", new object[] { this.ServiceName })); try { CheckEnvironment(); string servicesStartName = null; string password = null; ServiceProcessInstaller parent = null; if (base.Parent is ServiceProcessInstaller) { parent = (ServiceProcessInstaller) base.Parent; } else { for (int j = 0; j < base.Parent.Installers.Count; j++) { if (base.Parent.Installers[j] is ServiceProcessInstaller) { parent = (ServiceProcessInstaller) base.Parent.Installers[j]; break; } } } if (parent == null) { throw new InvalidOperationException(System.ServiceProcess.Res.GetString("NoInstaller")); } switch (parent.Account) { case ServiceAccount.LocalService: servicesStartName = @"NT AUTHORITY\LocalService"; break; case ServiceAccount.NetworkService: servicesStartName = @"NT AUTHORITY\NetworkService"; break; case ServiceAccount.User: servicesStartName = parent.Username; password = parent.Password; break; } string str3 = base.Context.Parameters["assemblypath"]; if (string.IsNullOrEmpty(str3)) { throw new InvalidOperationException(System.ServiceProcess.Res.GetString("FileName")); } if (str3.IndexOf('"') == -1) { str3 = "\"" + str3 + "\""; } if (!ValidateServiceName(this.ServiceName)) { object[] args = new object[] { this.ServiceName, 80.ToString(CultureInfo.CurrentCulture) }; throw new InvalidOperationException(System.ServiceProcess.Res.GetString("ServiceName", args)); } if (this.DisplayName.Length > 0xff) { throw new ArgumentException(System.ServiceProcess.Res.GetString("DisplayNameTooLong", new object[] { this.DisplayName })); } string dependencies = null; if (this.ServicesDependedOn.Length > 0) { StringBuilder builder = new StringBuilder(); for (int k = 0; k < this.ServicesDependedOn.Length; k++) { string name = this.ServicesDependedOn[k]; try { ServiceController controller = new ServiceController(name, "."); name = controller.ServiceName; } catch { } builder.Append(name); builder.Append('\0'); } builder.Append('\0'); dependencies = builder.ToString(); } IntPtr databaseHandle = SafeNativeMethods.OpenSCManager(null, null, 0xf003f); IntPtr zero = IntPtr.Zero; if (databaseHandle == IntPtr.Zero) { throw new InvalidOperationException(System.ServiceProcess.Res.GetString("OpenSC", new object[] { "." }), new Win32Exception()); } int serviceType = 0x10; int num4 = 0; for (int i = 0; i < base.Parent.Installers.Count; i++) { if (base.Parent.Installers[i] is ServiceInstaller) { num4++; if (num4 > 1) { break; } } } if (num4 > 1) { serviceType = 0x20; } try { zero = System.ServiceProcess.NativeMethods.CreateService(databaseHandle, this.ServiceName, this.DisplayName, 0xf01ff, serviceType, (int) this.StartType, 1, str3, null, IntPtr.Zero, dependencies, servicesStartName, password); if (zero == IntPtr.Zero) { throw new Win32Exception(); } if (this.Description.Length != 0) { System.ServiceProcess.NativeMethods.SERVICE_DESCRIPTION serviceDesc = new System.ServiceProcess.NativeMethods.SERVICE_DESCRIPTION { description = Marshal.StringToHGlobalUni(this.Description) }; bool flag = System.ServiceProcess.NativeMethods.ChangeServiceConfig2(zero, 1, ref serviceDesc); Marshal.FreeHGlobal(serviceDesc.description); if (!flag) { throw new Win32Exception(); } } if ((Environment.OSVersion.Version.Major > 5) && (this.StartType == ServiceStartMode.Automatic)) { System.ServiceProcess.NativeMethods.SERVICE_DELAYED_AUTOSTART_INFO service_delayed_autostart_info = new System.ServiceProcess.NativeMethods.SERVICE_DELAYED_AUTOSTART_INFO { fDelayedAutostart = this.DelayedAutoStart }; if (!System.ServiceProcess.NativeMethods.ChangeServiceConfig2(zero, 3, ref service_delayed_autostart_info)) { throw new Win32Exception(); } } stateSaver["installed"] = true; } finally { if (zero != IntPtr.Zero) { SafeNativeMethods.CloseServiceHandle(zero); } SafeNativeMethods.CloseServiceHandle(databaseHandle); } base.Context.LogMessage(System.ServiceProcess.Res.GetString("InstallOK", new object[] { this.ServiceName })); } finally { base.Install(stateSaver); } }