用于更改服务路径的托管API

时间:2011-08-16 21:08:42

标签: c# windows-services

我在计算机上安装了Windows服务。

在新版本中,我重命名了服务.exe名称(例如,MyService.exe - > Foo.Server.exe)。

我理解服务可执行路径可以由modifying the registry更改,但是是否存在托管API,以便我可以更自信它在将来的版本中不会中断?

1 个答案:

答案 0 :(得分:1)

您可以PInvoke SCM API ChangeServiceConfig,并提供lpBinaryPathName参数。

以下是来自http://pinvoke.net/default.aspx/advapi32/ChangeServiceConfig.html

的PInvoke原型
[DllImport("Advapi32.dll", EntryPoint="ChangeServiceConfigW", CharSet=CharSet.Unicode, ExactSpelling=true, SetLastError=true)]
internal static extern bool ChangeServiceConfig(
    SafeHandle hService,
    int dwServiceType, 
    int dwStartType, 
    int dwErrorControl, 
    [In] string lpBinaryPathName,
    [In] string lpLoadOrderGroup, 
    IntPtr lpdwTagId,
    [In] string lpDependencies, 
    [In] string lpServiceStartName, 
    [In] string lpPassWord, 
    [In] string lpDisplayName
);

使用ServiceController类打开SCM和服务,您只需将其命名为:

static void ChangeServicePath(string svcName, string exePath)
{
    const int SERVICE_NO_CHANGE = -1;
    using (ServiceController control = new ServiceController(svcName))
        ChangeServiceConfig(control.ServiceHandle,
                            SERVICE_NO_CHANGE,
                            SERVICE_NO_CHANGE,
                            SERVICE_NO_CHANGE,
                            exePath,
                            null,
                            IntPtr.Zero,
                            null,
                            null,
                            null,
                            null);
}