[原创]服务管理CMD版(VC源代码)
软件作者:chinafe信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])
原来写过一个GUI版的跟系统自带的差不多 这两天在 技术讨论版面,看有朋友管理服务时用SC什么的,我感觉SC命令参数太多又容易出错,就凑空写了这个CMD 版的,为了方便我把源代码也发出来
有需要的话可以自己修改....
程序运行效果如图所示
[attach]10249[/attach] [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] 建议还是别使用这种有子环境的cui命令
还是使用命令行参数的好
否则传递参数周多不便 [quote]引用第2楼我非我于2007-06-09 11:30发表的 :
建议还是别使用这种有子环境的cui命令
还是使用命令行参数的好
否则传递参数周多不便[/quote]
嗯 这倒是的~~~~~~~~~~~
不过这个用起来会方便一些 当然问题也会不少....谢谢老大提示 我试试看,能不能改进一下... 我已经改好了,真正的命令行版的服务管理程序:
[url]http://forum.eviloctal.com/read-htm-tid-29272.html[/url] 结构倒是很清晰明朗,很容易看明白,只是接口不怎么清楚,如果能注释下重要的调用函数可能会更好些
页:
[1]