当前位置: 首页 > 编程语言 > C#

以编程方式启用Windows服务分享

时间:2023-04-10 12:58:21 C#

以编程方式启用Windows服务我正在尝试通过修改注册表中的值以编程方式启用Windows服务,如下所示。价值观确实会改变。但是,之后我无法启动该服务,因为Windows仍然将其视为已禁用。publicvoidEnabledTheService(stringserviceName){try{RegistryKeykey=Registry.LocalMachine.OpenSubKey(@"SYSTEMCurrentControlSetServices"+serviceName,true);key.SetValue("开始",2);}catch(Exceptionex){Console.Write(ex.Message);}}publicvoidStartService(stringserviceName){ServiceControllerservice=newServiceController(serviceName);尝试服务。开始();service.WaitForStatus(ServiceControllerStatus.Running,newTimeSpan(0,0,0,20));}catch(Exceptionex){Console.Write(ex.Message);有几种方法可以更改Windows服务的启动类型(请参阅此问题)。如果我没记错的话,我测试的时候WMI方法是有效的,但并不完全可靠,所以我使用了WindowsAPI函数ChangeServiceConfig。我从未尝试过注册表方法。我认为这将是三个选项中最不稳定的。我有C#代码调用ChangeServiceConfig,但不在我面前。我明天会尝试添加它。pinovke文档是一个很好的起点。更新:以下是使用WindowsAPI的方法:privatevoidChangeServiceStartType(stringserviceName,StartupTypeOptionsstartType){//获取服务控制管理器数据库句柄IntPtrscmHandle=OpenSCManager(null,null,SC_MANAGER_CONNECT);if(scmHandle==IntPtr.Zero){thrownewException("未能获得服务控制管理器数据库的句柄。");}//获取指定windows服务的句柄IntPtrserviceHandle=OpenService(scmHandle,serviceName,SERVICE_QUERY_CONFIG|SERVICE_CHANGE_CONFIG);if(serviceHandle==IntPtr.Zero){thrownewException(string.Format("无法获取服务"{0}"的句柄。",serviceName));}boolchangeServiceSuccess=ChangeServiceConfig(serviceHandle,SERVICE_NO_CHANGE,(uint)startType,SERVICE_NO_CHANGE,null,null,IntPtr.Zero,null,null,null,null);if(!changeServiceSuccess){stringmsg=string.Format("未能更新服务“{0}”的服务配置。ChangeServiceConfigreturnederror{1}.",serviceName,Marshal.GetLastWin32Error().ToString());thrownewException(msg);}//Cleanupif(scmHandle!=IntPtr.Zero)CloseServiceHandle(scmHandle);if(serviceHandle!=IntPtr.Zero)CloseServiceHandle(serviceHandle);}[DllImport("advapi32.dll",CharSet=CharSet.Auto,SetLastError=true)]privatestaticexternIntPtrOpenSCManager(stringmachineName,stringdatabaseName,uintdwAccess);[DllImport("advapi32.dll",CharSet=CharSet.Auto,SetLastError=true)]privatestaticexternIntPtrOpenService(IntPtrhSCManager,stringlpServiceName,uintdwDesiredAccess);[DllImport("advapi32.dll",CharSet=CharSet.Auto,SetLastError=true)]privatestaticexternBooleanChangeServiceConfig(IntPtrhService,UInt32nServiceType,UInt32nStartType,UInt32nErrorControl,StringlpBinaryPathName,StringlpLoadOrderGroup,IntPtrlpdwTagId,[In]char[]lpDependencies,StringlpServiceStartName,StringlpPassword,StringlpDisplayName);[DllImport("advapi32.dll",EntryPoint="CloseServiceHandle")]privatestaticexternintCloseServiceHandle(IntPtrhSCObject);私有结构uintSC_MANAGER_CONNECT=0x0001;私有构造SERVICE_QUERY_CONFIG=0x00000001;私有构造SERVICE_CHANGE_CONFIG=0x00000002;私有结构SERVICE_NO_CHANGE=0xFFFFFFFF;privateenumStartupTypeOptions:uint{BootStart=0,//由系统加载程序启动的设备驱动程序。此值仅对驱动程序服务有效。SystemStart=1,//一个由IoInitSystem函数启动的设备驱动程序。此值仅对驱动程序服务有效。Automatic=2,//系统启动时由服务控制管理器自动启动的服务。Manual=3,//进程调用StartService函数时由服务控制管理器启动的服务。Disabled=4//无法启动的服务。尝试启动服务会导致错误代码ERROR_SERVICE_DISABLED。}我不认为是编辑注Registry是建议的方法,不幸的是它没有在ServiceController类中公开。推荐使用WMI,它有一个ChangeStartMode方法(需要添加对System.Management.dll的引用):以上就是C#学习教程:以编程方式启用Windows服务的全部内容,如果对大家有用需要的话了解更多C#学习教程,希望大家多多关注——usingSystem.Management;publicstaticvoidEnableTheService(stringserviceName){使用(varmo=newManagementObject(string.Format("Win32_Service.Name="{0}"",serviceName))){mo.InvokeMethod("ChangeStartMode",newobject[]{“自动的”});}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: