如何在 .net 核心应用程序中使用 powershell 启动 Windows 服务?
How to start a Windows service using powershell in a .net core application?
我有一个 .net 应用程序,我希望能够在同一台计算机上启动和停止 Windows 服务 运行。我能够使用 get-service 毫无问题地拉回服务的状态,但是执行 start-service 不起作用。没有错误,只是什么都不做。我先尝试了这个,但没有使用 async Invoke 选项,这样它看起来更像底部的函数。在本地调试的时候不行,也不报错
using System.Management.Automation;
private async static Task EditService(string serviceName, string command)
{
using (PowerShell PowerShellInst = PowerShell.Create())
{
//PowerShellInst.AddCommand(command).AddParameter("Name", serviceName);
//I tried surrounding serviceName in quotes (but it has no spaces)
PowerShellInst.AddScript("Start-Service -Name " + serviceName);
await PowerShellInst.InvokeAsync();
}
}
获取服务状态(有效):
public static string GetServiceStatus(string serviceName)
{
using (PowerShell PowerShellInst = PowerShell.Create())
{
PowerShellInst.AddScript("Get-Service " + serviceName);
Collection<PSObject> PSOutput = PowerShellInst.Invoke();
if (PSOutput == null || PSOutput.Count == 0)
return "Unknown";
else
return PSOutput.First().Properties["Status"].Value.ToString();
}
}
听起来你没有权限,一种选择是设置执行策略
//in powershell
powershell.AddCommand("Set-ExecutionPolicy").AddArgument("Unrestricted")
.AddParameter("Scope","CurrentUser");
//or using the command prompt like so:
string powerShellCmd = "/c powershell -executionpolicy unrestricted C:\somePowerShellScript.ps1";
System.Diagnostics.Process.Start("cmd.exe",powerShellCmd);
你可以这样获取当前用户
WindowsIndentity.GetCurrent().Name
可选择尝试新的 Host Builder,这是一个新添加的 .Net Core 本机,即 没有 topshelf
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureAppConfiguration((context, config) =>
{
// configure the app here.
})
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
我有一个 .net 应用程序,我希望能够在同一台计算机上启动和停止 Windows 服务 运行。我能够使用 get-service 毫无问题地拉回服务的状态,但是执行 start-service 不起作用。没有错误,只是什么都不做。我先尝试了这个,但没有使用 async Invoke 选项,这样它看起来更像底部的函数。在本地调试的时候不行,也不报错
using System.Management.Automation;
private async static Task EditService(string serviceName, string command)
{
using (PowerShell PowerShellInst = PowerShell.Create())
{
//PowerShellInst.AddCommand(command).AddParameter("Name", serviceName);
//I tried surrounding serviceName in quotes (but it has no spaces)
PowerShellInst.AddScript("Start-Service -Name " + serviceName);
await PowerShellInst.InvokeAsync();
}
}
获取服务状态(有效):
public static string GetServiceStatus(string serviceName)
{
using (PowerShell PowerShellInst = PowerShell.Create())
{
PowerShellInst.AddScript("Get-Service " + serviceName);
Collection<PSObject> PSOutput = PowerShellInst.Invoke();
if (PSOutput == null || PSOutput.Count == 0)
return "Unknown";
else
return PSOutput.First().Properties["Status"].Value.ToString();
}
}
听起来你没有权限,一种选择是设置执行策略
//in powershell
powershell.AddCommand("Set-ExecutionPolicy").AddArgument("Unrestricted")
.AddParameter("Scope","CurrentUser");
//or using the command prompt like so:
string powerShellCmd = "/c powershell -executionpolicy unrestricted C:\somePowerShellScript.ps1";
System.Diagnostics.Process.Start("cmd.exe",powerShellCmd);
你可以这样获取当前用户
WindowsIndentity.GetCurrent().Name
可选择尝试新的 Host Builder,这是一个新添加的 .Net Core 本机,即 没有 topshelf
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureAppConfiguration((context, config) =>
{
// configure the app here.
})
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});