mirror of https://github.com/winsw/winsw
				
				
				
			Merge <domain> and <user> to support User Principal Name
							parent
							
								
									eac8b8ca45
								
							
						
					
					
						commit
						8beb21568e
					
				| 
						 | 
					@ -211,7 +211,7 @@ namespace winsw
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    if (descriptor.HasServiceAccount())
 | 
					                    if (descriptor.HasServiceAccount())
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        username = descriptor.ServiceAccountUser;
 | 
					                        username = descriptor.ServiceAccountUserName;
 | 
				
			||||||
                        password = descriptor.ServiceAccountPassword;
 | 
					                        password = descriptor.ServiceAccountPassword;
 | 
				
			||||||
                        allowServiceLogonRight = descriptor.AllowServiceAcountLogonRight;
 | 
					                        allowServiceLogonRight = descriptor.AllowServiceAcountLogonRight;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
| 
						 | 
					@ -219,7 +219,7 @@ namespace winsw
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (allowServiceLogonRight)
 | 
					                if (allowServiceLogonRight)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    Security.AddServiceLogonRight(descriptor.ServiceAccountDomain!, descriptor.ServiceAccountName!);
 | 
					                    Security.AddServiceLogonRight(descriptor.ServiceAccountUserName!);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                using Service sc = scm.CreateService(
 | 
					                using Service sc = scm.CreateService(
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,7 +23,7 @@ namespace winsw.Configuration
 | 
				
			||||||
        // Installation
 | 
					        // Installation
 | 
				
			||||||
        public bool AllowServiceAcountLogonRight => false;
 | 
					        public bool AllowServiceAcountLogonRight => false;
 | 
				
			||||||
        public string? ServiceAccountPassword => null;
 | 
					        public string? ServiceAccountPassword => null;
 | 
				
			||||||
        public string? ServiceAccountUser => null;
 | 
					        public string? ServiceAccountUserName => null;
 | 
				
			||||||
        public Native.SC_ACTION[] FailureActions => new Native.SC_ACTION[0];
 | 
					        public Native.SC_ACTION[] FailureActions => new Native.SC_ACTION[0];
 | 
				
			||||||
        public TimeSpan ResetFailureAfter => TimeSpan.FromDays(1);
 | 
					        public TimeSpan ResetFailureAfter => TimeSpan.FromDays(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,7 @@ namespace winsw.Configuration
 | 
				
			||||||
        // Installation
 | 
					        // Installation
 | 
				
			||||||
        bool AllowServiceAcountLogonRight { get; }
 | 
					        bool AllowServiceAcountLogonRight { get; }
 | 
				
			||||||
        string? ServiceAccountPassword { get; }
 | 
					        string? ServiceAccountPassword { get; }
 | 
				
			||||||
        string? ServiceAccountUser { get; }
 | 
					        string? ServiceAccountUserName { get; }
 | 
				
			||||||
        Native.SC_ACTION[] FailureActions { get; }
 | 
					        Native.SC_ACTION[] FailureActions { get; }
 | 
				
			||||||
        TimeSpan ResetFailureAfter { get; }
 | 
					        TimeSpan ResetFailureAfter { get; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,9 +8,9 @@ namespace winsw.Native
 | 
				
			||||||
    internal static class Security
 | 
					    internal static class Security
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        /// <exception cref="Win32Exception" />
 | 
					        /// <exception cref="Win32Exception" />
 | 
				
			||||||
        internal static void AddServiceLogonRight(string domain, string user)
 | 
					        internal static void AddServiceLogonRight(string userName)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            IntPtr sid = GetAccountSid(domain, user);
 | 
					            IntPtr sid = GetAccountSid(userName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            try
 | 
					            try
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
| 
						 | 
					@ -24,17 +24,16 @@ namespace winsw.Native
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <exception cref="Win32Exception" />
 | 
					        /// <exception cref="Win32Exception" />
 | 
				
			||||||
        private static IntPtr GetAccountSid(string domain, string user)
 | 
					        private static IntPtr GetAccountSid(string accountName)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            int sidSize = 0;
 | 
					            int sidSize = 0;
 | 
				
			||||||
            int domainNameLength = 0;
 | 
					            int domainNameLength = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (domain == ".")
 | 
					            if (accountName.StartsWith(".\\"))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                domain = Environment.MachineName;
 | 
					                accountName = Environment.MachineName + accountName.Substring(1);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            string accountName = domain + "\\" + user;
 | 
					 | 
				
			||||||
            _ = LookupAccountName(null, accountName, IntPtr.Zero, ref sidSize, IntPtr.Zero, ref domainNameLength, out _);
 | 
					            _ = LookupAccountName(null, accountName, IntPtr.Zero, ref sidSize, IntPtr.Zero, ref domainNameLength, out _);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            IntPtr sid = Marshal.AllocHGlobal(sidSize);
 | 
					            IntPtr sid = Marshal.AllocHGlobal(sidSize);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -645,17 +645,13 @@ namespace winsw
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        protected string? AllowServiceLogon => GetServiceAccountPart("allowservicelogon");
 | 
					        protected string? AllowServiceLogon => GetServiceAccountPart("allowservicelogon");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        protected internal string? ServiceAccountDomain => GetServiceAccountPart("domain");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        protected internal string? ServiceAccountName => GetServiceAccountPart("user");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        public string? ServiceAccountPassword => GetServiceAccountPart("password");
 | 
					        public string? ServiceAccountPassword => GetServiceAccountPart("password");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public string? ServiceAccountUser => ServiceAccountName is null ? null : (ServiceAccountDomain ?? ".") + "\\" + ServiceAccountName;
 | 
					        public string? ServiceAccountUserName => GetServiceAccountPart("username");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public bool HasServiceAccount()
 | 
					        public bool HasServiceAccount()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return !string.IsNullOrEmpty(ServiceAccountName);
 | 
					            return !string.IsNullOrEmpty(ServiceAccountUserName);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public bool AllowServiceAcountLogonRight
 | 
					        public bool AllowServiceAcountLogonRight
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,8 +30,7 @@ $@"<service>
 | 
				
			||||||
  <arguments>My Arguments</arguments>
 | 
					  <arguments>My Arguments</arguments>
 | 
				
			||||||
  <log mode=""roll""></log>
 | 
					  <log mode=""roll""></log>
 | 
				
			||||||
  <serviceaccount>
 | 
					  <serviceaccount>
 | 
				
			||||||
    <domain>{Domain}</domain>
 | 
					    <username>{Domain}\{Username}</username>
 | 
				
			||||||
    <user>{Username}</user>
 | 
					 | 
				
			||||||
    <password>{Password}</password>
 | 
					    <password>{Password}</password>
 | 
				
			||||||
    <allowservicelogon>{AllowServiceAccountLogonRight}</allowservicelogon>
 | 
					    <allowservicelogon>{AllowServiceAccountLogonRight}</allowservicelogon>
 | 
				
			||||||
  </serviceaccount>
 | 
					  </serviceaccount>
 | 
				
			||||||
| 
						 | 
					@ -60,8 +59,7 @@ $@"<service>
 | 
				
			||||||
  <startmode>roll</startmode>
 | 
					  <startmode>roll</startmode>
 | 
				
			||||||
  <log mode=""roll""></log>
 | 
					  <log mode=""roll""></log>
 | 
				
			||||||
  <serviceaccount>
 | 
					  <serviceaccount>
 | 
				
			||||||
    <domain>{Domain}</domain>
 | 
					    <username>{Domain}\{Username}</username>
 | 
				
			||||||
    <user>{Username}</user>
 | 
					 | 
				
			||||||
    <password>{Password}</password>
 | 
					    <password>{Password}</password>
 | 
				
			||||||
    <allowservicelogon>{AllowServiceAccountLogonRight}</allowservicelogon>
 | 
					    <allowservicelogon>{AllowServiceAccountLogonRight}</allowservicelogon>
 | 
				
			||||||
  </serviceaccount>
 | 
					  </serviceaccount>
 | 
				
			||||||
| 
						 | 
					@ -86,8 +84,7 @@ $@"<service>
 | 
				
			||||||
  <startmode>manual</startmode>
 | 
					  <startmode>manual</startmode>
 | 
				
			||||||
  <log mode=""roll""></log>
 | 
					  <log mode=""roll""></log>
 | 
				
			||||||
  <serviceaccount>
 | 
					  <serviceaccount>
 | 
				
			||||||
    <domain>{Domain}</domain>
 | 
					    <username>{Domain}\{Username}</username>
 | 
				
			||||||
    <user>{Username}</user>
 | 
					 | 
				
			||||||
    <password>{Password}</password>
 | 
					    <password>{Password}</password>
 | 
				
			||||||
    <allowservicelogon>{AllowServiceAccountLogonRight}</allowservicelogon>
 | 
					    <allowservicelogon>{AllowServiceAccountLogonRight}</allowservicelogon>
 | 
				
			||||||
  </serviceaccount>
 | 
					  </serviceaccount>
 | 
				
			||||||
| 
						 | 
					@ -116,7 +113,7 @@ $@"<service>
 | 
				
			||||||
        public void VerifyUsername()
 | 
					        public void VerifyUsername()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Debug.WriteLine("_extendedServiceDescriptor.WorkingDirectory :: " + _extendedServiceDescriptor.WorkingDirectory);
 | 
					            Debug.WriteLine("_extendedServiceDescriptor.WorkingDirectory :: " + _extendedServiceDescriptor.WorkingDirectory);
 | 
				
			||||||
            Assert.That(_extendedServiceDescriptor.ServiceAccountUser, Is.EqualTo(Domain + "\\" + Username));
 | 
					            Assert.That(_extendedServiceDescriptor.ServiceAccountUserName, Is.EqualTo(Domain + "\\" + Username));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Test]
 | 
					        [Test]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue