windwos 2000及NT 服务注册的具体实现

Windows Services(NT)服务学习!基础篇完整篇! 本文主要记录什么是Windows Service,及其主要组成?并通过一个列子来创建一个Windows Services,同时,记录几个在查资料碰到的问题。          Windows Services全文简称NT           1,  什么是Windows Services?               NT主要应用于服务器,是长期运行的应用程序,他不需要用户界面和任何模拟的输 阅读详情

windwos 2000及NT 服务注册的具体实现

{**************************************************************}

{*******************************************************}
{*  程序编写: 陈林茂
{*  编写日期: 2003-01-05
{*  联系作者: linmaochen@sohu.com
{*******************************************************}

interface
uses
   Windows,Classes,SysUtils,Winsvc,nb30,winsock;

Type

  {服务句柄信息}
  TScmInfo=Record
    HostName :String;
    DataBaseName:String;
    DesireAccess :DWORD;
  End;

  {服务信息}
  TSvcInfo=Record
    HscManager :Integer;
    ServerName :String; //服务名
    DisplayName :String; //服务的显示名
    DesireAccess :DWORD; //
    ServiceType :Dword; //服务的类别
    StartType :Dword; //服务的启动方式
    ErrorControl :Dword; //服务错误控制方式
    BinaryPathName :String; //服务执行文件的具体路径
    LoadOrderGroup :String;
    TagId :Dword;
    Dependencies :String;  //依赖:有多个依赖的服务时,中间以空格隔开}
    ServerStartName :String;
    Password :String;
  End;
 

  //需要注册的服务信息数组

  SvcArray=Array[1..20] of TSvcInfo;

  Type

   {服务控制类}
   TService=Class(TObject)
   Private
     Scm_Info  :TScmInfo;
     Svc_Info  :TSvcInfo;
     ScmHandle :Integer;

     {服务句柄}
     SvcHandle :Integer;


   Public
     Constructor Create();
     Destructor Destroy();Override;
     Function SetScmInfo():Boolean;
     Function OpenScmHandle():Integer;
     Function SetServiceInfo(TmpSvc :TsvcInfo):Boolean;
     Function CreateService():Boolean;

     {删除一服务}
     Function Delete_AService(ServiceName :String):Boolean;

     {建立一服务}
     Function Open_Service(ServiceName :String):Boolean;

{/////////////////////////////////////////////////////////////////////}
{//  函数名称: IsSvcExists()
{//  函数功能: 判断系统中相关的服务是否存在
{//  参数信息: 需要判断的服务名
{//  返回值:   TRUE : WINDOWS 中的服务已存在,FALSE :WINDOWS 中的服务不存在
{//
{/////////////////////////////////////////////////////////////////////}
     Function isSvcExists(ServiceName :string):Boolean;

{/////////////////////////////////////////////////////////////////////////}
{//  函数名称: Start_Service()
{//  函数功能: 启动相关的服务进程
{//  参数信息: 需要启动的服务名
{//  返回值:   TRUE :服务已经启动;FALSE:服务启动失败;
{/////////////////////////////////////////////////////////////////////////}
     Function Control_Service(ServiceName : String; controlType :integer):Boolean;

{/////////////////////////////////////////////////////////////////////////}
{//  函数名称: IsServiceStart()
{//  函数功能: 判断服务是否启动
{//  参数信息:  需要判断的服务名
{//  返回值:   TRUE :服务已经启动; FALSE :服务已停止
{/////////////////////////////////////////////////////////////////////////}
     Function IsServiceStart(ServiceName:String):Boolean;

   End;

implementation

 

{ TService }

constructor TService.Create;
begin
  try
    ScmHandle :=0;
    SetScmInfo();
    ScmHandle:=OpenSCManager(PChar(Scm_Info.HostName),Nil,Scm_Info.DesireAccess);
  Except
  End; 


end;

{建立一服务}
function TService.CreateService(): Boolean;
Var
  i :Integer;
begin
  Try
    OpenScmHandle();
    svc_info.HscManager := ScmHandle;
    Result :=False;
    SvcHandle :=CreateService(svc_Info.HscManager ,Pchar(svc_Info.ServerName),Pchar(Svc_Info.DisplayName),Svc_info.DesireAccess ,
                    svc_INfo.ServiceType ,Svc_Info.StartType ,Svc_Info.ErrorControl,pchar(Svc_Info.BinaryPathName),
                    pchar(''),LPDWORD(0),Pchar(Svc_Info.Dependencies),Pchar(Svc_info.ServerStartName),Pchar(Svc_Info.Password));

   If SvcHandle <> 0 Then
    Begin
      Result :=True;
      CloseServiceHandle(SvcHandle);
    End ;
    I:=i+1;
  Except
  End;

end;


{注销一服务}
function TService.Delete_AService(ServiceName: String): Boolean;
Var
  RHandle:Integer;
  rc :Boolean;
begin
  Try
    OpenScmHandle();
    Result :=False;
    If ScmHandle<>0 Then
    Begin
      RHandle :=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
      If RHandle <>0 Then
      Begin

        Rc :=DeleteService(Rhandle);
        Result :=Rc;
        {关闭句柄}
        CloseServiceHandle(RHandle);
      End Else Result :=True;
    End;
  Except
  End;
end;

destructor TService.Destroy;
begin
  try
    CloseServiceHandle(ScmHandle);
  Except
  End;

end;

{打开数据库的句柄}
function TService.isSvcExists(ServiceName: string): Boolean;
Var
  RHandle:Integer;
  rc :Boolean;
begin
  Try
    OpenScmHandle();
    Result :=False;
    If ScmHandle<>0 Then
    Begin
      RHandle :=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
      If RHandle <>0 Then
      Begin

        Result :=true;
        {关闭句柄}
        CloseServiceHandle(RHandle);
      End;
    End;
  Except
  End;
end;

function TService.OpenScmHandle: Integer;
begin
  try
    SetScmInfo();
    if  ScmHandle <>0 Then CloseServiceHandle(ScmHandle);
    ScmHandle := 0;
    ScmHandle :=OpenSCManager(PChar(Scm_Info.HostName),Nil,Scm_Info.DesireAccess);
    if ScmHandle = 0 then
      ScmHandle :=OpenSCManager(PChar(Scm_Info.HostName),Nil,Scm_Info.DesireAccess);
  Except
  End;
end;


{打开一服务}
function TService.Open_Service(ServiceName: String): Boolean;
Var
  SHandle :Integer;
begin
  Try
    Result :=False;
    sHandle := 0;
    SHandle :=OpenScmHandle();
    If SHandle<>0 Then
    Begin
      SvcHandle :=OpenService(SHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
      If SvcHandle <>0 Then Result :=True;
    End;
  Except
  End;

end;

function TService.SetScmInfo(): Boolean;
Var
  hostName : array [0..255] of char;
  wsdata : TWSAData;
begin
  try
    WSAStartup ($0101, wsdata);
    Result :=False;
    gethostname (hostName,sizeof(hostName));

    If HostName ='' Then
      Exit;

    scm_Info.HostName :=HostName;
    Scm_Info.DesireAccess :=SC_MANAGER_ALL_ACCESS;
  Except
  End;

end;

 

//设置需要注册的WINDOWS 服务的具体信息

function TService.SetServiceInfo(TmpSvc: TsvcInfo): Boolean;
begin
  try
    Result :=False;
    If ScmHandle >0 Then
    Begin
      Svc_Info :=TmpSvc;
      Svc_Info.HscManager :=ScmHandle;
      Result :=True;
    End;
  Except
  End;

end;

//控制WINDOWS 系统内部的服务

function TService.Control_Service(ServiceName: String;controlType : Integer): Boolean;
Var
  RHandle:Integer;
  rc :Boolean;
  Rec_status :TServiceStatus;
  serviceArg :Pchar;
  i  :Integer;

begin
  i :=0;
  serviceArg := Pchar('');
  Try
    Result :=False;
    If ScmHandle <>0 Then
    Begin
      RHandle :=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
      If RHandle <>0 Then
      Begin
        Case controlType of
          1:  //启动服务器
            Begin
              //ControlService(rHandle,SERVICE_CONTROL_START,rec_status);
              StartService(rHandle,0,servicearg);
              i:=0;
              While i<30 Do
              Begin
                QueryServiceStatus(RHandle,Rec_status);
                if rec_status.dwCurrentState =SERVICE_RUNNING then
                Begin
                  result :=True;
                  CloseServiceHandle(RHandle);
                  Break;
                End;
                sleep(1000);
                i:=i+1;
              End;
            End;
          2:     //暂停服务进程
            Begin
              ControlService(rHandle,SERVICE_CONTROL_PAUSE,rec_status);
              i:=0;
              While i<30 Do
              Begin
                 QueryServiceStatus(RHandle,Rec_status);
                 if rec_status.dwCurrentState =SERVICE_PAUSED then
                 Begin
                   result :=true;
                   CloseServiceHandle(RHandle);
                   Break;
                 End;
                 Sleep(1000);
                 i:=i+1;
              End;
            End;
          3:    //唤醒服务进程
            Begin
              ControlService(rHandle,SERVICE_CONTROL_CONTINUE,rec_status);
              i:=0;
              While i<30 do
              Begin
                QueryServiceStatus(RHandle,Rec_status);
                if rec_status.dwCurrentState =SERVICE_RUNNING then
                Begin
                  result :=True;
                  CloseServiceHandle(RHandle);
                  Break;
                End;
                Sleep(1000);
                i:=i+1;
              End;
            End;
          4:   //停止服务进程
            begin
              ControlService(rHandle,SERVICE_CONTROL_STOP,rec_status);
              i:=0;
              While i<30 Do
              Begin
                QueryServiceStatus(RHandle,Rec_status);
                if rec_status.dwCurrentState =SERVICE_STOPPED then
                Begin
                  result :=True;
                  CloseServiceHandle(RHandle);
                  Break;
                End;
                Sleep(1000);
                i:=i+1;
              End;
            End;
          5:   //关闭服务程序 SERVICE_CONTROL_SHUTDOWN
            Begin
              rec_status.dwCurrentState :=SERVICE_RUNNING;

              ControlService(rHandle,SERVICE_CONTROL_STOP,rec_status);
              i:=0;
              While i<30 Do
              Begin
                QueryServiceStatus(RHandle,Rec_status);
                if rec_status.dwCurrentState =SERVICE_STOPPED then
                Begin
                  result :=True;
                  CloseServiceHandle(RHandle);
                  Break;
                End;
                Sleep(1000);
                i:=i+1;
              End;
            End;
        end;
        Result :=true;
        {关闭句柄}
        if rHandle <> 0  then
          CloseServiceHandle(RHandle);
      End;
    End;
  Except
  End;

end;

function TService.IsServiceStart(ServiceName: String): Boolean;
Var
  RHandle:Integer;
  rc :Boolean;
  Rec_status :TServiceStatus;
begin
  Try
    OpenScmHandle();
    Result :=False;
    If ScmHandle<>0 Then
    Begin
      RHandle := 0;
      RHandle :=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
      If RHandle <>0 Then
      Begin
        QueryServiceStatus(RHandle,Rec_status);
        if rec_status.dwCurrentState =SERVICE_RUNNING then
           result :=True;

        {关闭句柄}
        CloseServiceHandle(RHandle);
      End;
    End;
  Except
  End;

end;

end.

软件破解的6个基本概念 阅读详情

相关推荐

别再为PT100测温发愁了!手把手教你用ADS1247+STM32搞定高精度温度采集(附完整代码)

本文详细介绍了如何使用ADS1247与STM32构建高精度PT100测温系统,涵盖硬件设计、SPI配置、温度计算及调试技巧。通过24位ADC和内置PGA,实现0.1℃级精度,适用于工业自动化和医疗设备。附完整代码和常见问题解决方案,助你快速掌握高精度温度采集技术。

weixin_42524703的博客 344

一个建立NT服务的类

作者:Joerg Koenig 翻译:Yuan Wenmao 原文:A Class For Building An NT Service 曾经尝试写一个NT服务吗? 我最近的一个项目需要开发一个CORBA服务,将其运行成NT服务,由于下一个项目也是需要NT服务,我就想花点

草木葳蕤 1373

谈谈 FOC和BLDC 电机控制

更具体地说,通过 “Park 变换”,我们可以把三相交流电流信号转换成两相直流电流信号,从而可以把三相交流电机的控制变得和两相直流电机控制一样简单。在内环 “电流环”中,一些比较重要的模块有 “Clark 变换” 和 “Park 变换” 等数学模块、电机电流信号检测模块以及能够提供电机的转速和转角位置信息的模块。日前,Qorvo 电机控制应用高级系统/应用工程师张绍发表了一个与 BLDC 和 FOC 相关的演讲,科普了 FOC 的相关知识,还讲解了 Qorvo 用于简化 FOC 实施方案的方法。

U_YAO的博客 2118

WINDOWS NT服务的创建方法

以为以VC6.0开发工具为例,  .NET C++是一样的。可以使用控制台, WIN32,  ATL (.NET 的ATL用的模板,而VC6.0不是)。程序框架主要由两部分板成, 一个服务主函数(ServiceMain),另一个是用于服务管理控制用的(ServiceControlHandler)。一、步聚:1. 注册服务2.永动服务二、代码编写#include "windows.h"#includ

肉丝的盘子 1656

SolidWorks参数化建模实战:从规则定义到智能装配

本文深入探讨SolidWorks参数化建模的实战技巧,从规则定义到智能装配的全流程。通过实际案例展示如何提升设计效率300%,确保一致性,并加速系列化开发。重点解析草图阶段植入设计意图、装配体级参数化及高级技巧,帮助工程师掌握三维建模的核心竞争力。

weixin_29306317的博客 416

VINS-Fusion实战:从零搭建无人机视觉SLAM系统(附ROS配置全流程)

本文详细介绍了如何从零开始为无人机搭建基于VINS-Fusion的视觉SLAM系统。内容涵盖硬件选型(重点推荐双目相机与IMU搭配)、ROS环境配置、传感器标定、核心参数调优以及实际飞行测试与问题排解全流程,旨在帮助开发者实现稳定、精确的无人机自主定位与导航。

wasm7browser的博客 214

[转]WIN2000下IIS安全配置

  Win2000操作系统的一个主要特色就是将IIS融入其内核之中,并提供一些用来配置和维护软件的向导工具,使构建一个Internet网站轻松易得。但是,如果要创建一个安全可靠的Internet网站,实现“地面部分”-Win2000操作系统和“空中部分”-IIS的双重安全,还需要更加全面和深入的工作。本文就对这些稳固工作中的空中部分-IIS进行讨论,旨在帮助管理员一步步地实施网站安全构建工作。  

wolf的技术博客 1169

西工大noj100题python2024第三季21-30

【代码】西工大noj100题python2024第三季21-30。

weixin_70523540的博客 1578

Windows下的3389端口渗透

1、Win7、Win2003、XP系统 在CMD命令行开启3389端口:REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f 在CMD命令行关闭3389端口(将00000000改成11111111即可): RE...

baao0137的博客 2469

基于网关实现不同网段S7-1200 CPU的通信方法

在A网段的计算机上ping B网段的计算机:在A网段的计算机上使用ping命令,向B网段的计算机发送数据包。在B网段的计算机上ping A网段的计算机:同样地,在B网段的计算机上使用ping命令,向A网段的计算机发送数据包。数据包也会经过路由器进行转发,最终到达A网段的计算机。配置路由器:在路由器上配置两个网段的IP地址和子网掩码,并设置路由表,使得路由器可以将A网段和B网段之间的数据进行转发。确定两个网络之间的路由器:假设需要将A网段和B网段进行通信,需要在A、B两个网段之间设置一台路由器。

电工 2400

FPGA实现串口升级及MultiBoot(十)串口升级SPI FLASH实现

采用软核进行串口升级的原因主要有以下几点:1、官方推荐:官方以前也推出了针对逻辑进行升级的程序《XAPP1081_QuickBoot》,但是从今年起(2024年)官方就停止更新相关例程了(详见下面截图),所以采用官方推荐的软核更新;2、简单并具有通用性:针对SPI或者BPI官方都有相关的IP,可应对市场上80%以上的FLASH,并且官方IP通用性极强,只需要修改几个参数就可以对不同厂家的芯片进行升级操作;

OpenFPGA的博客 1997

如何用.NET创建Windows服务

http://www.cnblogs.com/greatandforever/archive/2008/07/08/1238270.html 我们将研究如何创建一个作为Windows服务的应用程序。内容包含什么是Windows服务,如何创建、安装和调试它们。会用到S

plean的专栏 806

解决群晖NAS无法拉取docker镜像问题

在2024-06-01日以前,使用SSH登录后是可以直接拉取docker镜像的;但是之后当我们使用SSH登录上群晖NAS,使用【sudo -i】切换到超管拉取镜像会提示报错【error pulling image configuration: Get "https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/cf/cff6b68a194a672fd337d8728bfb252071012cce6

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 2万+

C++编写Windows服务程序 用 C 语言编写 Windows 服务程序的五个步骤

用 C 语言编写 Windows 服务程序的五个步骤 分类: C++2011-08-27 08:41 443人阅读 评论(0) 收藏 举报 windowsc语言servicemicrosoft工作   下载源代码 原文出处:Five Steps to Writing Windows Services in

autumn20080101的专栏 1020

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

轻轻松松十招教你学会破解软件

下面谈到了一些在学习解密过程中经常遇到的问题,本人根据自己的经验简单给大家谈一谈。这些问题对于初学者来说常常是很需要搞明白的,根据我自己的学习经历,如果你直接照着很多破解教程去学习的话,多半都会把自己搞得满头的雾水,因为有很多的概念要么自己不是很清楚,要么根本就不知道是怎么一回事,所以希望通过下面的讨论给大家一定的帮助:    1. 断点:所谓断点就是程序被中断的地方,这个词对于解密者来说是再

jushiya的专栏 2670

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

几招常用破解方法

下面谈到了一些在学习解密过程中经常遇到的问题,本人根据自己的经验简单给大家谈一谈。这些问题对于初学者来说常常是很需要搞明白的,根据我自己的学习经历,如果你直接照着很多破解教程去学习的话,多半都会把自己搞得满头的雾水,因为有很多的概念要么自己不是很清楚,要么根本就不知道是怎么一回事,所以希望通过下面的讨论给大家一定的帮助:      1. 断点:所谓断点就是程序被中断的地方,这个词对于解密者

www.i201314.net 1462

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

软件破解初级入门

软件破解初级入门 下面谈到了一些在学习解密过程中经常遇到的问题,本人根据自己的经验简单给大家谈一谈。这些问题对于初学者来说常常是很需要搞明白的,根据我自己的学习经历,如果你直接照着很多破解教程去学习的话,多半都会把自己搞得满头的雾水,因为有很多的概念要么自己不是很清楚,要么根本就不知道是怎么一回事,所以希望通过下面的讨论给大家一定的帮助:   1. 断点   所谓断点就是程序被中断的地方,这个词对

Inside Windows 4336

十招教你学会软件破解(转

<br />下面谈到了一些在学习解密过程中经常遇到的问题,本人根据自己的经验简单给大家谈一谈。这些问题对于初学者来说常常是很需要搞明白的,根据我自己的学习经历,如果你直接照着很多破解教程去学习的话,多半都会把自己搞得满头的雾水,因为有很多的概念要么自己不是很清楚,要么根本就不知道是怎么一回事,所以希望通过下面的讨论给大家一定的帮助: <br /><br />  1. 断点:所谓断点就是程序被中断的地方,这个词对于解密者来说是再熟悉不过了。那么什么又是中断呢?中断就是由于有特殊事件(中断事件)发生,计算机暂停

wang_xiyuan的专栏 643

学软件破解需要知道的6个最基本概念

 1. 断点:所谓断点就是程序被中断的地方,这个词对于解密者来说是再熟悉不过了。那么什么又是中断呢?中断就是由于有特殊事件(中断事件)发生,计算机暂停当前的任务(即程序),转而去执行另外的任务(中断服务程序),然后再返回原先的任务继续执行。打个比方:你正在上班,突然有同学打电话告诉你他从外地坐火车过来,要你去火车站接他。然后你就向老板临时请假,赶往火车站去接同学,接着将他安顿好,随后你又返回公

613

破解10大知识

下面谈到了一些在学习解密过程中经常遇到的问题,本人根据自己的经验简单给大家谈一谈。这些问题对于初学者来说常常是很需要搞明白的,根据我自己的学习经历,如果你直接照着很多破解教程去学习的话,多半都会把自己搞得满头的雾水,因为有很多的概念要么自己不是很清楚,要么根本就不知道是怎么一回事,所以希望通过下面的讨论给大家一定的帮助:1. 断点:所谓断点就是程序被中断的地方,这个词对于解密者来说是再熟悉

250

解密宝典——十招教你学会软件破解

     下面谈到了一些在学习解密过程中经常遇到的问题,本人根据自己的经验简单给大家谈一谈。这些问题对于初学者来说常常是很需要搞明白的,根据我自己的学习经历,如果你直接照着很多破解教程去学习的话,多半都会把自己搞得满头的雾水,因为有很多的概念要么自己不是很清楚,要么根本就不知道是怎么一回事,所以希望通过下面的讨论给大家一定的帮助:  1. 断点  所谓断点就是程序被中断的地方,这个词对于解

dacong3207的专栏 970

十招教你学会软件破解(转)

下面谈到了一些在学习解密过程中经常遇到的问题,本人根据自己的经验简单给大家谈一谈。这些问题对于初学者来说常常是很需要搞明白的,根据我自己的学习经历,如果你直接照着很多破解教程去学习的话,多半都会把自己搞得满头的雾水,因为有很多的概念要么自己不是很清楚,要么根本就不知道是怎么一回事,所以希望通过下面的讨论给大家一定的帮助:    1. 断点:所谓断点就是程序被中断的地方,这个词对于解密者来说是

liujiayu2的专栏 5947
上一篇: 24bits bitmap 文件到256色bitmap 的转换
下一篇: 如何自动发布MS SQL SERVER数据库?
linmaochen
博客等级 码龄25年 0粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值