C# Implementaion of New-Service cmdlet
本文关键字:cmdlet New-Service of Implementaion | 更新日期: 2023-09-27 17:59:04
我需要安装一个可执行文件作为服务,并且我需要在用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);
}
}
由于找不到添加可执行路径(服务映像路径)的方法,我被困在这里
好吧,我有下面的代码在工作,我只是想知道是否有更"原生"的方法来做到这一点。
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();
感谢Brad Bruce,我在以下方面找到了我需要的东西:如何在不创建安装程序的情况下安装C#Windows服务?
我对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); }