邪恶八进制信息安全团队技术讨论组's Archiver

chinafe 2007-6-9 10:55

[原创]服务管理CMD版(VC源代码)

软件作者:chinafe
信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])

原来写过一个GUI版的跟系统自带的差不多 这两天在 技术讨论版面,看有朋友管理服务时用SC什么的,我感觉SC命令参数太多又容易出错,就凑空写了这个CMD 版的,为了方便我把源代码也发出来
有需要的话可以自己修改....

程序运行效果如图所示
[attach]10249[/attach]

chinafe 2007-6-9 11:00

[code]///////////////////////////////////////////////////////////////////////////////
// 服务管理器-命令行版                            //
// Ri期:2007/06/08                              //
// 作者:冷风                                 //
// 文件:Server.cpp                              //
// 信箱:gotoc@163.com                            //
// QQ: 121121606                              //
// 说明:若有问题请访问 Blog.csdn.net/chinafe 偶可以提供免费技术支持 呵呵  //
///////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <windows.h>
#include <Winsvc.h>

BOOL DisplayServices();
void AddServices();
void DelServices();
void StopServices();
void StartServices();

main()
{

int i=10;
while(i!=0)
{
  printf("****************************************************\n");
  printf("         服务管理器-命令行版       \n\n");
  printf("         作者:冷风 2007.6.8        \n");
  printf("****************************************************\n\n");
  printf("查看服务请输入1\n\n");
  printf("添加服务请输入2\n\n");
  printf("删除服务请输入3\n\n");
  printf("停止服务请输入4\n\n");
  printf("启动服务请输入5\n\n");
  printf("退出程序请输入0\n\n");

  scanf ("%d",&i);

  if(1==i)
  {
    DisplayServices();
  }
  if(2==i)
  {
    AddServices();
  }
  if(3==i)
  {
    DelServices();
  }
  if(4==i)
  {
    StopServices();
  }
  if(5==i)
  {
    StartServices();
  }
}
return 0;
}


BOOL DisplayServices()
{

LPENUM_SERVICE_STATUS lpServices = NULL;
DWORD  nSize = 0;
DWORD  nServicesReturned;
DWORD  nResumeHandle = 0;
DWORD dwServiceType = SERVICE_WIN32;

SC_HANDLE schSCManager = NULL;
BOOL   Flag = FALSE;
DWORD  i = 0;
UINT   j = 0;

schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);


if (schSCManager == NULL)    // Fail To Open SCM
{
   printf("Fail To Open SCM\n");
   return FALSE;
}

lpServices = (LPENUM_SERVICE_STATUS) LocalAlloc(LPTR, 64 * 1024);    // Allocate Ram

if (lpServices == NULL)    // Fail To Allocate Ram
{
   printf("Fail To Allocate Ram\n");
   goto CleanUP;
}

// Enum All Service Based On Service Type
if (EnumServicesStatus(schSCManager,
            dwServiceType,
            SERVICE_STATE_ALL,
            (LPENUM_SERVICE_STATUS)lpServices,
            64 * 1024,
            &nSize,
            &nServicesReturned,
            &nResumeHandle) == NULL)




{
   printf("Fail To Enum Service\n");
   goto CleanUP;
}

// Display The Services
printf("%-34s%s\n\n","ServiceName","DisplayName");
for (i = 0; i < nServicesReturned; i++)
{

     printf("%d:%-32s%s\n",++j,lpServices[i].lpServiceName, lpServices[i].lpDisplayName);

}
Flag = TRUE;

// Close Service Handle,Free Allocated Ram And Return To The Caller
CleanUP:
CloseServiceHandle(schSCManager);
if (lpServices != NULL)
{
   LocalFree(lpServices);
}

getchar ();

return Flag;

}

void AddServices()
{
  char name[100];
  char info[200];
  char path[300];

  printf("请输入服务名\n\n");
  scanf ("%s",&name);
  printf("请输入服务描述\n\n");
  scanf ("%s",&info);
  printf("请输入程序路径\n\n");
  scanf ("%s",&path);



  SC_HANDLE manager=NULL;
  SC_HANDLE service=NULL;

  if((manager=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE))==NULL)
  {
    printf("OpenSCManager Error");
  }
  service=CreateService(
      manager,name,info,
      SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
      SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
      path, 0, 0, 0, 0, 0 );
  if(service)
  printf("服务创建成功\n\n");
  else
  printf("服务创建失败\n\n");

  CloseServiceHandle(service);
  CloseServiceHandle(manager);
}


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

  printf("请输入要删除的服务名\n\n");
  scanf ("%s",&name);

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

  if ( status.dwCurrentState!=SERVICE_STOPPED )
  {

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

  }

  isSuccess=DeleteService(service);
  if (!isSuccess)
     printf("删除服务失败!\n");
  else
     printf("删除服务成功!\n");

  CloseServiceHandle(service );
  CloseServiceHandle(scm);
}


void StopServices()
{
  char name[100];
  SC_HANDLE scm;
  SC_HANDLE service;
  SERVICE_STATUS status;

  printf("请输入要停止的服务名\n\n");
  scanf ("%s",&name);

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

    isSuccess=ControlService(service,SERVICE_CONTROL_STOP,&status);
    if (!isSuccess )
      printf("服务停止失败!\n");
    else
      printf("服务停止成功!\n");
    Sleep( 500 );

  }else
  {
    printf("此服务没有运行!\n");
  }

}

void StartServices()
{
  char name[100];
  SC_HANDLE scm;
  SC_HANDLE service;
  SERVICE_STATUS status;

  printf("请输入要启动的服务名\n\n");
  scanf ("%s",&name);

  if((scm=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE))==NULL)
  {
    printf("OpenSCManager Error\n");
  }
  service=OpenService(scm,name,SERVICE_ALL_ACCESS|DELETE);
  if (!service)
  {
    printf("OpenService error!\n");
    return;
  }
  BOOL isSuccess=QueryServiceStatus(service,&status);
  if (!isSuccess)
  {
    printf("QueryServiceStatus error!\n");
    return;
  }
  if ( status.dwCurrentState==SERVICE_STOPPED )
  {
    isSuccess=StartService(service,0,NULL);
    if (!isSuccess )
      printf("服务启动失败!\n");
    else
      printf("服务启动成功!\n");

  }else
  {
    printf("此服务正在运行!\n");
  }

}[/code]

我非我 2007-6-9 11:30

建议还是别使用这种有子环境的cui命令
还是使用命令行参数的好
否则传递参数周多不便

chinafe 2007-6-9 11:53

[quote]引用第2楼我非我于2007-06-09 11:30发表的 :
建议还是别使用这种有子环境的cui命令
还是使用命令行参数的好
否则传递参数周多不便[/quote]
嗯 这倒是的~~~~~~~~~~~
不过这个用起来会方便一些 当然问题也会不少....谢谢老大提示 我试试看,能不能改进一下...

pt007 2007-6-18 18:02

我已经改好了,真正的命令行版的服务管理程序:
[url]http://forum.eviloctal.com/read-htm-tid-29272.html[/url]

udbkl 2007-6-28 18:14

结构倒是很清晰明朗,很容易看明白,只是接口不怎么清楚,如果能注释下重要的调用函数可能会更好些

页: [1]
© 1999-2008 EvilOctal Security Team