From 7aa4018451e6d2ff252dd12d98d5f20552329d32 Mon Sep 17 00:00:00 2001 From: The LateRooms Group Date: Wed, 17 Jul 2013 13:18:04 +0100 Subject: [PATCH] Read username/password & working dir from XML It is possible to specify the useraccount (and password) that the service will run as. In addition, the working directory for the service can be supplied. --- Main.cs | 13 +++- README.markdown | 14 ++++ ServiceDescriptor.cs | 56 +++++++++++++- Tests/Lib/nunit.framework.dll | Bin 0 -> 147456 bytes Tests/winswTests/Properties/AssemblyInfo.cs | 36 +++++++++ Tests/winswTests/ServiceDescriptorTests.cs | 78 ++++++++++++++++++++ Tests/winswTests/winswTests.csproj | 60 +++++++++++++++ WmiSchema.cs | 2 + winsw.sln | 12 +++ 9 files changed, 266 insertions(+), 5 deletions(-) create mode 100644 Tests/Lib/nunit.framework.dll create mode 100644 Tests/winswTests/Properties/AssemblyInfo.cs create mode 100644 Tests/winswTests/ServiceDescriptorTests.cs create mode 100644 Tests/winswTests/winswTests.csproj diff --git a/Main.cs b/Main.cs index 5e07896..d7dd5b4 100644 --- a/Main.cs +++ b/Main.cs @@ -502,18 +502,27 @@ namespace winsw if (args[0] == "install") { string username=null, password=null; - if (args.Count > 1 && args[1] == "/p") { + if (args.Count > 1 && args[1] == "/p") + { // we expected username/password on stdin Console.Write("Username: "); username = Console.ReadLine(); Console.Write("Password: "); password = ReadPassword(); } + else + { + if (d.HasServiceAccount()) + { + username = d.ServiceAccountUser; + password = d.ServiceAccountPassword; + } + } svc.Create ( d.Id, d.Caption, - "\"" + ServiceDescriptor.ExecutablePath + "\"", + "\"" + d.ExecutablePath + "\"", WMI.ServiceType.OwnProcess, ErrorControl.UserNotified, StartMode.Automatic, diff --git a/README.markdown b/README.markdown index e4294bd..b1d3b3a 100644 --- a/README.markdown +++ b/README.markdown @@ -240,3 +240,17 @@ If the service keeps failing and it goes beyond the number of `` conf This optional element controls the timing in which Windows SCM resets the failure count. For example, if you specify `1 hour` and your service continues to run longer than one hour, then the failure count is reset to zero. This affects the behaviour of the failure actions (see `` above). In other words, this is the duration in which you consider the service has been running successfully. Defaults to 1 day. + +### Service account +It is possible to specify the useraccount (and password) that the service will run as. To do this, specify a `` element like this: + + + YOURDOMAIN + useraccount + Pa55w0rd + + +### Working directory +Some services need to run with a working directory specified. To do this, specify a `` element like this: + + C:\application \ No newline at end of file diff --git a/ServiceDescriptor.cs b/ServiceDescriptor.cs index a505356..7453a54 100755 --- a/ServiceDescriptor.cs +++ b/ServiceDescriptor.cs @@ -22,7 +22,7 @@ namespace winsw /// public class ServiceDescriptor { - private readonly XmlDocument dom = new XmlDocument(); + protected readonly XmlDocument dom = new XmlDocument(); /// /// Where did we find the configuration file? @@ -37,7 +37,7 @@ namespace winsw /// public readonly string BaseName; - public static string ExecutablePath + public virtual string ExecutablePath { get { @@ -157,7 +157,7 @@ namespace winsw { get { - return SingleElement("stopexecutable",true); + return SingleElement("stopexecutable"); } } @@ -511,5 +511,55 @@ namespace winsw } } + protected string GetServiceAccountPart(string subNodeName) + { + var node = dom.SelectSingleNode("//serviceaccount"); + + if (node != null) + { + var subNode = node.SelectSingleNode(subNodeName); + if (subNode != null) + { + return subNode.InnerText; + } + } + + return null; + + } + + protected string serviceAccountDomain + { + get{ + return GetServiceAccountPart("domain"); + } + } + + protected string serviceAccountName + { + get + { + return GetServiceAccountPart("user"); + } + } + + public string ServiceAccountPassword + { + get + { + return GetServiceAccountPart("password"); + } + } + + public string ServiceAccountUser + { + get { return (serviceAccountDomain ?? "NULL") + @"\" + (serviceAccountName ?? "NULL"); } + } + + public bool HasServiceAccount() + { + return !string.IsNullOrEmpty(serviceAccountDomain) && !string.IsNullOrEmpty(serviceAccountName); + } + } } diff --git a/Tests/Lib/nunit.framework.dll b/Tests/Lib/nunit.framework.dll new file mode 100644 index 0000000000000000000000000000000000000000..3e24ba1ca6260d7d0499624d13d2c5a2cd75b52a GIT binary patch literal 147456 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 W^f}PyK%WDB4)i(D=fM9-4*U=F(vzP6 literal 0 HcmV?d00001 diff --git a/Tests/winswTests/Properties/AssemblyInfo.cs b/Tests/winswTests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..fddd287 --- /dev/null +++ b/Tests/winswTests/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("winswTests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("winswTests")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("01ee65cd-18ae-4f3b-8eac-c9f790d5f24e")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Tests/winswTests/ServiceDescriptorTests.cs b/Tests/winswTests/ServiceDescriptorTests.cs new file mode 100644 index 0000000..c5dfb34 --- /dev/null +++ b/Tests/winswTests/ServiceDescriptorTests.cs @@ -0,0 +1,78 @@ +using NUnit.Framework; +using winsw; + +namespace winswTests +{ + + public class ServiceDescriptorExtended : ServiceDescriptor + { + + public ServiceDescriptorExtended(string descriptorXml) + { + LoadTestXml(descriptorXml); + } + + private void LoadTestXml(string xml) + { + dom.LoadXml(xml); + } + } + + + [TestFixture] + public class ServiceDescriptorTests + { + + private ServiceDescriptorExtended extendedServiceDescriptor; + + private const string ExpectedWorkingDirectory = @"Z:\Path\SubPath"; + private const string Username = "User"; + private const string Password = "Password"; + private const string Domain = "Domain"; + + [SetUp] + public void SetUp() + { + const string SeedXml = "" + + "service.exe" + + "Service" + + "The service." + + "node.exe" + + "My Arguments" + + "rotate" + + "" + + "" + Domain + "" + + "" + Username + "" + + "" + Password + "" + + "" + + "" + + ExpectedWorkingDirectory + + "" + + @"C:\logs" + + ""; + + extendedServiceDescriptor = new ServiceDescriptorExtended(SeedXml); + } + + [Test] + public void VerifyWorkingDirectory() + { + System.Diagnostics.Debug.WriteLine("_extendedServiceDescriptor.WorkingDirectory :: " + extendedServiceDescriptor.WorkingDirectory); + Assert.That(extendedServiceDescriptor.WorkingDirectory, Is.EqualTo(ExpectedWorkingDirectory)); + } + + [Test] + public void VerifyUsername() + { + System.Diagnostics.Debug.WriteLine("_extendedServiceDescriptor.WorkingDirectory :: " + extendedServiceDescriptor.WorkingDirectory); + Assert.That(extendedServiceDescriptor.ServiceAccountUser, Is.EqualTo(Domain + "\\" + Username)); + } + + [Test] + public void VerifyPassword() + { + System.Diagnostics.Debug.WriteLine("_extendedServiceDescriptor.WorkingDirectory :: " + extendedServiceDescriptor.WorkingDirectory); + Assert.That(extendedServiceDescriptor.ServiceAccountPassword, Is.EqualTo(Password)); + } + } +} diff --git a/Tests/winswTests/winswTests.csproj b/Tests/winswTests/winswTests.csproj new file mode 100644 index 0000000..07632c7 --- /dev/null +++ b/Tests/winswTests/winswTests.csproj @@ -0,0 +1,60 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {93843402-842B-44B4-B303-AEE829BE0B43} + Library + Properties + winswTests + winswTests + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + ..\Lib\nunit.framework.dll + + + + + + + + + + + + {0DE77F55-ADE5-43C1-999A-0BC81153B039} + winsw + + + + + \ No newline at end of file diff --git a/WmiSchema.cs b/WmiSchema.cs index 8d8677d..4a241e3 100755 --- a/WmiSchema.cs +++ b/WmiSchema.cs @@ -50,6 +50,8 @@ namespace WMI // ReturnValue Create(bool desktopInteract, string displayName, int errorControl, string loadOrderGroup, string loadOrderGroupDependencies, string name, string pathName, string serviceDependencies, string serviceType, string startMode, string startName, string startPassword); void Create(string name, string displayName, string pathName, ServiceType serviceType, ErrorControl errorControl, StartMode startMode, bool desktopInteract, string startName, string startPassword, string[] serviceDependencies); + void Create(string name, string displayName, string pathName, ServiceType serviceType, ErrorControl errorControl, StartMode startMode, bool desktopInteract, string[] serviceDependencies); + Win32Service Select(string name); } diff --git a/winsw.sln b/winsw.sln index 38a18c3..e9f8b36 100644 --- a/winsw.sln +++ b/winsw.sln @@ -3,6 +3,8 @@ Microsoft Visual Studio Solution File, Format Version 10.00 # Visual C# Express 2008 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "winsw", "winsw.csproj", "{0DE77F55-ADE5-43C1-999A-0BC81153B039}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "winswTests", "Tests\winswTests\winswTests.csproj", "{93843402-842B-44B4-B303-AEE829BE0B43}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -23,6 +25,16 @@ Global {0DE77F55-ADE5-43C1-999A-0BC81153B039}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {0DE77F55-ADE5-43C1-999A-0BC81153B039}.Release|Mixed Platforms.Build.0 = Release|Any CPU {0DE77F55-ADE5-43C1-999A-0BC81153B039}.Release|Win32.ActiveCfg = Release|Any CPU + {93843402-842B-44B4-B303-AEE829BE0B43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {93843402-842B-44B4-B303-AEE829BE0B43}.Debug|Any CPU.Build.0 = Debug|Any CPU + {93843402-842B-44B4-B303-AEE829BE0B43}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {93843402-842B-44B4-B303-AEE829BE0B43}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {93843402-842B-44B4-B303-AEE829BE0B43}.Debug|Win32.ActiveCfg = Debug|Any CPU + {93843402-842B-44B4-B303-AEE829BE0B43}.Release|Any CPU.ActiveCfg = Release|Any CPU + {93843402-842B-44B4-B303-AEE829BE0B43}.Release|Any CPU.Build.0 = Release|Any CPU + {93843402-842B-44B4-B303-AEE829BE0B43}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {93843402-842B-44B4-B303-AEE829BE0B43}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {93843402-842B-44B4-B303-AEE829BE0B43}.Release|Win32.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE