如何使用c/c++启动/停止名称中有空格的Windows服务

问题描述 投票:0回答:2

我正在尝试编写一个 C/C++ 应用程序来启动/停止我系统的任何 Windows 服务。

我的应用程序对于名称之间没有空格的服务运行良好,但对于名称之间有空格的服务名称没有响应。

以下是我用于打开服务的命令:

SC_HANDLE serviceDbHandle = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
SC_HANDLE serviceHandle = OpenService(serviceDbHandle,
                                      "My Service",
                                      SC_MANAGER_ALL_ACCESS);

这里

"My Service"
- 第二个参数是
LPCSTR
,它的空终止正在产生问题。

我如何启动/停止名称中带有空格的服务 - 任何线索或建议都会有帮助。

我在 xp 机器上使用 Visual studio 2005。

谢谢,

阿尼尔

visual-c++ windows-services
2个回答
1
投票

您需要使用服务的内部名称(没有空格),而不是显示名称(可能有)。

来自MSDN

要开通的服务名称。这是创建服务对象时由

lpServiceName
函数的
CreateService
参数指定的名称,不是用户界面应用程序显示的用于标识服务的服务显示名称


0
投票

如果服务名称中包含空格,我尝试从 Windows

cmd
脚本启动或停止服务时遇到了这个问题。我可以通过编写 powershell
ps1
脚本并从
cmd
脚本调用它来解决这个问题。如果您可以从 C/C++ 运行 powershell 脚本,您可以执行类似的操作。

ps1代码

param([string[]] $Servers, [string] $Command)

$credential = Get-Credential -Message "Enter admin credentials"

foreach ($server in $servers)
{
    Invoke-Command -ComputerName $server -Credential $credential -ScriptBlock {
        param([string] $cmd)
        sc.exe $cmd "My Service Name"
    } -ArgumentList $Command
}

其中

$Command
start
stop
query

这可以从

cmd
脚本或可能在大多数程序中调用,例如对于 C++,请参见此处:C++ 应该如何执行 PowerShell 命令?

© www.soinside.com 2019 - 2024. All rights reserved.