コード例 #1
0
        /// <include file='doc\ServiceProcessInstaller.uex' path='docs/doc[@for="ServiceProcessInstaller.Install"]/*' />
        /// <devdoc>
        ///    <para>Writes service application information to the registry.
        ///       This method is meant to be used by installation tools, which call the appropriate methods automatically.</para>
        /// </devdoc>
        public override void Install(IDictionary stateSaver)
        {
            try
            {
                ServiceInstaller.CheckEnvironment();
                try
                {
                    if (!haveLoginInfo)
                    {
                        try
                        {
                            GetLoginInfo();  // if the user hits "cancel" this will throw
                        }
                        catch
                        {
                            stateSaver["hadServiceLogonRight"] = true;  // this prevents rollback from trying to remove logonRights for the user
                            throw;
                        }
                    }
                }
                finally
                {
                    // save out that information (but not the password)
                    stateSaver["Account"] = Account;
                    if (Account == ServiceAccount.User)
                    {
                        stateSaver["Username"] = Username;
                    }
                }

                if (Account == ServiceAccount.User)
                {
                    // grant the right to run as a service to the given username. If we don't do this,
                    // the service will be unable to start under that account.
                    IntPtr policyHandle         = OpenSecurityPolicy();
                    bool   hasServiceLogonRight = true; // we use 'true' here for the default because later in rollback we do
                                                        //   "if not hasServiceLogon revoke logon priviledge"
                    try
                    {
                        byte[] sid = GetAccountSid(Username);
                        hasServiceLogonRight = AccountHasRight(policyHandle, sid, "SeServiceLogonRight");
                        if (!hasServiceLogonRight)
                        {
                            GrantAccountRight(policyHandle, sid, "SeServiceLogonRight");
                        }
                    }
                    finally
                    {
                        stateSaver["hadServiceLogonRight"] = hasServiceLogonRight;
                        SafeNativeMethods.LsaClose(policyHandle);
                    }
                }
            }
            finally
            {
                // now install all the contained services. They will use the Username and Password properties to do
                // their installation.
                base.Install(stateSaver);
            }
        }
コード例 #2
0
 /// <summary>Writes service application information to the registry. This method is meant to be used by installation tools, which call the appropriate methods automatically.</summary>
 /// <param name="stateSaver">An <see cref="T:System.Collections.IDictionary" /> that contains the context information associated with the installation. </param>
 /// <exception cref="T:System.ArgumentException">The <paramref name="stateSaver" /> is null. </exception>
 /// <PermissionSet>
 ///   <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="UnmanagedCode" />
 ///   <IPermission class="System.Security.Permissions.UIPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />
 /// </PermissionSet>
 public override void Install(IDictionary stateSaver)
 {
     try
     {
         ServiceInstaller.CheckEnvironment();
         try
         {
             if (!this.haveLoginInfo)
             {
                 try
                 {
                     this.GetLoginInfo();
                 }
                 catch
                 {
                     stateSaver["hadServiceLogonRight"] = true;
                     throw;
                 }
             }
         }
         finally
         {
             stateSaver["Account"] = this.Account;
             if (this.Account == ServiceAccount.User)
             {
                 stateSaver["Username"] = this.Username;
             }
         }
         if (this.Account == ServiceAccount.User)
         {
             IntPtr intPtr = this.OpenSecurityPolicy();
             bool   flag   = true;
             try
             {
                 byte[] accountSid = this.GetAccountSid(this.Username);
                 flag = ServiceProcessInstaller.AccountHasRight(intPtr, accountSid, "SeServiceLogonRight");
                 if (!flag)
                 {
                     ServiceProcessInstaller.GrantAccountRight(intPtr, accountSid, "SeServiceLogonRight");
                 }
             }
             finally
             {
                 stateSaver["hadServiceLogonRight"] = flag;
                 SafeNativeMethods.LsaClose(intPtr);
             }
         }
     }
     finally
     {
         base.Install(stateSaver);
     }
 }
コード例 #3
0
ファイル: ServiceInstaller.cs プロジェクト: zyj0021/Topshelf
        /// <summary>Installs the service by writing service application information to the registry. This method is meant to be used by installation tools, which process the appropriate methods automatically.</summary>
        /// <param name="stateSaver">An <see cref="T:System.Collections.IDictionary" /> that contains the context information associated with the installation. </param>
        /// <exception cref="T:System.InvalidOperationException">The installation does not contain a <see cref="T:System.ServiceProcess.ServiceProcessInstaller" /> for the executable.-or- The file name for the assembly is null or an empty string.-or- The service name is invalid.-or- The Service Control Manager could not be opened. </exception>
        /// <exception cref="T:System.ArgumentException">The display name for the service is more than 255 characters in length.</exception>
        /// <exception cref="T:System.ComponentModel.Win32Exception">The system could not generate a handle to the service. -or-A service with that name is already installed.</exception>
        /// <PermissionSet>
        ///   <IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />
        ///   <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="UnmanagedCode" />
        ///   <IPermission class="System.Security.Permissions.UIPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />
        /// </PermissionSet>
        public override void Install(IDictionary stateSaver)
        {
            base.Context.LogMessage(Res.GetString("InstallingService", this.ServiceName));
            try
            {
                ServiceInstaller.CheckEnvironment();
                string servicesStartName = null;
                string password          = null;
                ServiceProcessInstaller serviceProcessInstaller = null;
                if (base.Parent is ServiceProcessInstaller)
                {
                    serviceProcessInstaller = (ServiceProcessInstaller)base.Parent;
                }
                else
                {
                    int num = 0;
                    while (num < base.Parent.Installers.Count)
                    {
                        if (!(base.Parent.Installers[num] is ServiceProcessInstaller))
                        {
                            num++;
                            continue;
                        }
                        serviceProcessInstaller = (ServiceProcessInstaller)base.Parent.Installers[num];
                        break;
                    }
                }
                if (serviceProcessInstaller == null)
                {
                    throw new InvalidOperationException(Res.GetString("NoInstaller"));
                }
                switch (serviceProcessInstaller.Account)
                {
                case ServiceAccount.LocalService:
                    servicesStartName = "NT AUTHORITY\\LocalService";
                    break;

                case ServiceAccount.NetworkService:
                    servicesStartName = "NT AUTHORITY\\NetworkService";
                    break;

                case ServiceAccount.User:
                    servicesStartName = serviceProcessInstaller.Username;
                    password          = serviceProcessInstaller.Password;
                    break;
                }
                string text = base.Context.Parameters["assemblypath"];
                if (string.IsNullOrEmpty(text))
                {
                    throw new InvalidOperationException(Res.GetString("FileName"));
                }
                if (text.IndexOf('"') == -1)
                {
                    text = "\"" + text + "\"";
                }
                if (!ServiceInstaller.ValidateServiceName(this.ServiceName))
                {
                    throw new InvalidOperationException(Res.GetString("ServiceName", this.ServiceName, 80.ToString(CultureInfo.CurrentCulture)));
                }
                if (this.DisplayName.Length > 255)
                {
                    throw new ArgumentException(Res.GetString("DisplayNameTooLong", this.DisplayName));
                }
                string dependencies = null;
                if (this.ServicesDependedOn.Length != 0)
                {
                    StringBuilder stringBuilder = new StringBuilder();
                    for (int i = 0; i < this.ServicesDependedOn.Length; i++)
                    {
                        string text2 = this.ServicesDependedOn[i];
                        try
                        {
                            text2 = new ServiceController(text2, ".").ServiceName;
                        }
                        catch
                        {
                        }
                        stringBuilder.Append(text2);
                        stringBuilder.Append('\0');
                    }
                    stringBuilder.Append('\0');
                    dependencies = stringBuilder.ToString();
                }
                IntPtr intPtr  = SafeNativeMethods.OpenSCManager(null, null, 983103);
                IntPtr intPtr2 = IntPtr.Zero;
                if (intPtr == IntPtr.Zero)
                {
                    throw new InvalidOperationException(Res.GetString("OpenSC", "."), new Win32Exception());
                }
                int serviceType = 16;
                int num2        = 0;
                for (int j = 0; j < base.Parent.Installers.Count; j++)
                {
                    if (base.Parent.Installers[j] is ServiceInstaller)
                    {
                        num2++;
                        if (num2 > 1)
                        {
                            break;
                        }
                    }
                }
                if (num2 > 1)
                {
                    serviceType = 32;
                }
                try
                {
                    intPtr2 = NativeMethods.CreateService(intPtr, this.ServiceName, this.DisplayName, 983551, serviceType, (int)this.StartType, 1, text, null, IntPtr.Zero, dependencies, servicesStartName, password);
                    if (intPtr2 == IntPtr.Zero)
                    {
                        throw new Win32Exception();
                    }
                    if (this.Description.Length != 0)
                    {
                        NativeMethods.SERVICE_DESCRIPTION sERVICE_DESCRIPTION = default(NativeMethods.SERVICE_DESCRIPTION);
                        sERVICE_DESCRIPTION.description = Marshal.StringToHGlobalUni(this.Description);
                        bool num3 = NativeMethods.ChangeServiceConfig2(intPtr2, 1u, ref sERVICE_DESCRIPTION);
                        Marshal.FreeHGlobal(sERVICE_DESCRIPTION.description);
                        if (!num3)
                        {
                            throw new Win32Exception();
                        }
                    }
                    if (Environment.OSVersion.Version.Major > 5 && this.StartType == ServiceStartMode.Automatic)
                    {
                        NativeMethods.SERVICE_DELAYED_AUTOSTART_INFO sERVICE_DELAYED_AUTOSTART_INFO = default(NativeMethods.SERVICE_DELAYED_AUTOSTART_INFO);
                        sERVICE_DELAYED_AUTOSTART_INFO.fDelayedAutostart = this.DelayedAutoStart;
                        if (!NativeMethods.ChangeServiceConfig2(intPtr2, 3u, ref sERVICE_DELAYED_AUTOSTART_INFO))
                        {
                            throw new Win32Exception();
                        }
                    }
                    stateSaver["installed"] = true;
                }
                finally
                {
                    if (intPtr2 != IntPtr.Zero)
                    {
                        SafeNativeMethods.CloseServiceHandle(intPtr2);
                    }
                    SafeNativeMethods.CloseServiceHandle(intPtr);
                }
                base.Context.LogMessage(Res.GetString("InstallOK", this.ServiceName));
            }
            finally
            {
                base.Install(stateSaver);
            }
        }
コード例 #4
0
        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);
            }
        }