/// <include file='doc\ServiceProcessInstaller.uex' path='docs/doc[@for="ServiceProcessInstaller.Rollback"]/*' /> /// <devdoc> /// <para>Rolls back service application information that was /// written to the registry by the installation procedure. This method is meant to be used by installation tools, which process /// the appropriate methods automatically.</para> /// </devdoc> public override void Rollback(IDictionary savedState) { try { // remove the SeServiceLogonRight from the account if we added it. if (((ServiceAccount)savedState["Account"]) == ServiceAccount.User && !((bool)savedState["hadServiceLogonRight"])) { string username = (string)savedState["Username"]; IntPtr policyHandle = OpenSecurityPolicy(); try { byte[] sid = GetAccountSid(username); RemoveAccountRight(policyHandle, sid, "SeServiceLogonRight"); } finally { SafeNativeMethods.LsaClose(policyHandle); } } } finally { base.Rollback(savedState); } }
/// <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); } }
/// <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); } }
/// <summary>Rolls back service application information written to the registry by the installation procedure. This method is meant to be used by installation tools, which process the appropriate methods automatically.</summary> /// <param name="savedState">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="savedState" /> is null.-or- The <paramref name="savedState" /> is corrupted or non-existent. </exception> /// <PermissionSet> /// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="UnmanagedCode" /> /// </PermissionSet> public override void Rollback(IDictionary savedState) { try { if ((ServiceAccount)savedState["Account"] == ServiceAccount.User && !(bool)savedState["hadServiceLogonRight"]) { string accountName = (string)savedState["Username"]; IntPtr intPtr = this.OpenSecurityPolicy(); try { byte[] accountSid = this.GetAccountSid(accountName); ServiceProcessInstaller.RemoveAccountRight(intPtr, accountSid, "SeServiceLogonRight"); } finally { SafeNativeMethods.LsaClose(intPtr); } } } finally { base.Rollback(savedState); } }
public override void Rollback(IDictionary savedState) { try { if ((((ServiceAccount)savedState["Account"]) == ServiceAccount.User) && !((bool)savedState["hadServiceLogonRight"])) { string accountName = (string)savedState["Username"]; IntPtr policyHandle = this.OpenSecurityPolicy(); try { byte[] accountSid = this.GetAccountSid(accountName); RemoveAccountRight(policyHandle, accountSid, "SeServiceLogonRight"); } finally { SafeNativeMethods.LsaClose(policyHandle); } } } finally { base.Rollback(savedState); } }