C#New-Service cmdlet的实现

时间:2013-02-14 17:32:10

标签: c# powershell service windows-services

我需要安装一个可执行文件作为服务,我需要通过使用C#编写的PowerShell cdmlet来实现。本质上,我需要创建所需的注册表项等,这将定义服务(包括运行的可执行文件 - 一种srvany.exe)。

我还需要能够定义此服务的登录标识(凭据)。

TIA,Hans

到目前为止我尝试了什么。我一直在查看ServiceProcessInstaller和ServiceProcessInstaller类,但他们错过了定义“外部”可执行文件的可能性。

    public partial class MyServiceInstaller : Installer
    {
        public MyServiceInstaller()
        {
            IDictionary saveState = null;
            this.Installers.Clear();
            ServiceProcessInstaller spi = new ServiceProcessInstaller();
            ServiceInstaller si = new ServiceInstaller();
            spi.Account = ServiceAccount.LocalSystem;
            spi.Username = null;
            spi.Password = null;
            si.ServiceName = "MyService";
            si.DisplayName = "MyService";
            si.StartType = ServiceStartMode.Automatic;
            si.Description = "MyService - I wish....";

            spi.Installers.Add(si);
            this.Installers.Add(spi);
            this.Install(saveState);
        }
    }

因为我找不到添加可执行路径(服务图像路径)的方法而被困在这里

2 个答案:

答案 0 :(得分:0)

我有以下代码正常工作,我只是想知道是否有一种更“原生”的方式来实现它。

                Command psc = new Command("New-Service");
                psc.Parameters.Add("Name", svcName);
                psc.Parameters.Add("BinaryPathName", svcExec);
                psc.Parameters.Add("DisplayName", svcName);
                psc.Parameters.Add("Description", svcDesc);
                psc.Parameters.Add("StartupType", "Automatic");
                WriteVerbose("Verifying service account");
                if (Account == null) { WriteVerbose("- Using LocalSystem account"); }
                else { psc.Parameters.Add("Credential", crd); }
                WriteVerbose("Installing service");
                Pipeline pipeline = Runspace.DefaultRunspace.CreateNestedPipeline();
                pipeline.Commands.Add(psc);
                Collection<PSObject> results = pipeline.Invoke();

答案 1 :(得分:0)

感谢Brad Bruce我找到了我需要的内容:How do I install a C# Windows service without creating an installer?

我对IntegratedServiceInstaller类做了一个小调整,调用“SINST.Install(state)”将产生3行输出

Installing service 'ServiceName'...
Service 'ServiceName' has been successfully installed.
Creating EventLog source 'ServiceName' in log Application...

调用SINST.Uninstall(null)

时,会向控制台写入类似的行

我通过将输出重定向到Stream.Null

来抑制此输出
    System.IO.StreamWriter sw = new System.IO.StreamWriter(Stream.Null);
    System.IO.TextWriter tmp = Console.Out;
    Console.SetOut(sw);
    try { SINST.Install(state); }
    catch (Exception Ex) { Console.SetOut(tmp); Console.WriteLine(Ex.Message); }
    finally { Console.SetOut(tmp); }