如何从C++向Windows服务发送命令?等效的.NET代码是:
ServiceController sc = new ServiceController("MyService");
sc.ExecuteCommand(255);
Run Code Online (Sandbox Code Playgroud) 我是一名专家程序员,因此,我不知道我在做什么:)
严肃地说; 不,我不是专家.我确实有问题,不知道如何解决它.好消息是,我(我想)知道问题是什么,我希望有人可以提供帮助.
这是问题的概要.我在C#中创建一个表单,它将为我做一些服务器和数据库管理任务.我有一个按钮,当点击时应该在"y"服务器上返回"x"服务的服务状态.状态将在屏幕上打印到文本框.
这是我的代码:
private void button2_Click(object sender, EventArgs e)
{
string fs = "Service X Status = ";
string mr = "Service A Status = ";
string qp = "Service B Status = ";
string sp = "Spooler Service Status = ";
ServiceController fssc = new ServiceController("xService", "yServer");
ServiceController mrsc = new ServiceController("aService", "yServer");
ServiceController qpsc = new ServiceController("bService", "yServer");
ServiceController spsc = new ServiceController("Spooler", "yServer");
try
{
txtGtwySts.AppendText(sp + spsc.Status.ToString());
txtGtwySts.AppendText(Environment.NewLine);
txtGtwySts.AppendText(fs + fssc.Status.ToString());
txtGtwySts.AppendText(Environment.NewLine);
txtGtwySts.AppendText(mr + …Run Code Online (Sandbox Code Playgroud) 我正在尝试从services.msc获取服务可执行文件路径
我写了下一个代码:
var service = ServiceController.GetServices().Where(p => p.ServiceName.Equals("Service name", StringComparison.InvariantCultureIgnoreCase));
if (service.Any())
//get service data
Run Code Online (Sandbox Code Playgroud)
我找不到服务可执行路径所在的位置(如果有的话)?
在services.msc中,我可以看到路径,所以我假设它也可以通过代码获取它.

有任何想法吗?
我有以下方法来启动和停止服务.我从另一个Console应用程序调用此方法进行调试,因为我已经使用了类库(DLL)中的方法.
该应用程序以管理权限启动.
public void ServiceStart()
{
ServiceController service = new ServiceController();
service.ServiceName = "ASP.NET State Service";
service.Start();
}
public void ServiceStop()
{
ServiceController service = new ServiceController();
service.ServiceName = "ASP.NET State Service";
service.Stop();
}
Run Code Online (Sandbox Code Playgroud)
但是当我调用Start()或Stop()抛出以下消息的异常时:
无法在计算机上打开ASP.NET State Service服务'.'
有人可以帮我吗?
我ServiceController.WaitForStatus第一次使用它来限制尝试启动无法启动的服务所浪费的时间。我的假设是像这样使用它:
var sc = new ServiceController(_monitoredService);
var seconds = _startWaitTimeout / 1000;
sc.Start();
sc.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 0, seconds));
if (sc.Status != ServiceControllerStatus.Running)
{
_logger.Warn($"'{_monitoredService}' did not start within {seconds} seconds.");
}
Run Code Online (Sandbox Code Playgroud)
然后我肩膀上的一个小恶魔建议WaitForStatus在等待之前可能会尝试设置状态。可以?
我使用Code Project Article 创建了一个Windows服务.我可以使用-i和-d开关安装服务并删除服务.
我能够在services.msc中看到该服务,但是当我启动该服务时它什么也没做.我将提供服务主代码:
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{
DWORD status;
DWORD specificError;
m_ServiceStatus.dwServiceType = SERVICE_WIN32;
m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
m_ServiceStatus.dwWin32ExitCode = 0;
m_ServiceStatus.dwServiceSpecificExitCode = 0;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
m_ServiceStatusHandle = RegisterServiceCtrlHandler("Service1",
ServiceCtrlHandler);
if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
{
return;
}
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
if (!SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus))
{
}
bRunning=true;
while(bRunning)
{
Sleep(150000);
ShellExecute(NULL, "open", "C:\\", NULL, NULL, SW_SHOWNORMAL);
}
return;
}
Run Code Online (Sandbox Code Playgroud)
但是当我启动服务时,它既不会睡觉也不会启动资源管理器.我错过了什么吗?
如何使用C#远程安装Windows服务?(我不想调用sc.exe/psexec/powershell远程处理).
谢谢!尤瓦
我有一个Windows服务项目,包括两个服务,service1和service2.我们如何在两种服务之间进行通信?例如,如何通过service1启动service2?我可以使用ServiceController类来执行此操作吗?你有什么建议这样做的?
我在.NET 3.5中工作,我遇到了使用ServiceController停止某些服务的问题.我搜索整个互联网,我发现我的问题无法解决;)
我是这样做的:
using (ServiceController service = new ServiceController("Service"))
{
try
{
TimeSpan timeout = TimeSpan.FromSeconds(timeoutSeconds);
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
我等到我的服务停止了.然后我想替换它的库(更新它).抛出异常:
UnauthorizedAccessException异常详细信息:System.UnauthorizedAccessException:拒绝访问路径'blablabla'.
我确信我可以访问此路径,因为我以管理员身份运行我的应用程序.
当这段代码执行时,有趣的是,此服务从当前服务列表中消失(在任务管理器中).所以它实际上阻止了它,但是一些线程仍然必须使用它,所以我无法移动任何Service的文件.即使我尝试自己移动文件(我转到Service目录并尝试使用鼠标移动文件)我也做不到.但是当我手动停止服务(任务管理器和'结束任务')时,我可以用它的文件做任何我想做的事情.那么从C#代码(使用ServiceController)停止它并使用任务管理器停止它之间的区别是什么?
我不知道它是否重要,但我在Virtual Box的Windows Server 2008上运行此应用程序(和此服务).(我需要在其他机器上运行它然后我的电脑).
任何想法如何解决这个问题?;)
谢谢你的帮助.
祝福,皮特.
我已经花了很多时间阅读有关SC.EXE运行可执行作为Windows服务,它似乎应该是我有相当简单明了BU一些问题得到它没有这个错误的工作:错误1053服务没有及时回应或控制要求.
我得到了要安装的服务,它在服务列表中,但它不允许我启动它.这就是我使用的基本尝试:
>sc create TestService binPath= "C:\Program Files (x86)\[path.exe]" DisplayName= "TestingServices" start= auto
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我尝试作为服务运行的exe必须设置为正确运行作为服务吗?我不认为是这种情况,因为有些程序可以运行任何exe作为服务.我正在尝试这样做,我该怎么做?