作为一个命令行工具,SC.exe可以用来测试你自己的系统,你可以设置一个批处理文件来使用不同的参数调用SC.exe来控制服务。这个很有用,如果你想看看你的服务不断的启动和停止,我没有试过哦!让一个服务一下子打开,一下子关闭,听上去很不错的。如果你的服务进程里面有多个进程的话,你可以保持一个进程继续运行不让它走开,然后让另一个不断的打开在关闭,还可以寻找一下内存缺乏导致不完全清楚的证据。
下面介绍SC,SCQC,andSCQUERYSC使用这样的语法:1.SC[Servername]commandServicename[Optionname=Optionvalues]
2.SC[command]
这里使用第一种语法使用SC,使用第二种语法显示帮助。
下面介绍各种参数。
Servername可选择:可以使用双斜线,如\\\\myserver,也可以是\\\\192.168.0.1来操作远程计算机。如果在本地计算机上操作
就不用添加任何参数。
Command下面列出SC可以使用的命令。
config----改变一个服务的配置。(长久的)
continue--对一个服务送出一个继续控制的要求。
control----对一个服务送出一个控制。
create----创建一个服务。(增加到注册表中)
delete----删除一个服务。(从注册表中删除)
EnumDepend--列举服务的从属关系。
GetDisplayName--获得一个服务的显示名称。
GetKeyName--获得一个服务的服务键名。
interrogate--对一个服务送出一个询问控制要求。
pause----对一个服务送出一个暂停控制要求。
qc----询问一个服务的配置。
query----询问一个服务的状态,也可以列举服务的状态类型。
start----启动一个服务。
stop----对一个服务送出一个停止的要求。
Servicename在注册表中为servicekey制定的名称。注意这个名称是不同于显示名称的(这个名称可以用netstart和服务控
制面板看到),而SC是使用服务键名来鉴别服务的。
Optionname这个optionname和optionvalues参数允许你指定操作命令参数的名称和数值。注意,这一点很重要在操作名称和等
号之间是没有空格的。一开始我不知道,结果………………,比如,start=optionvalues,这个很重要。optionvalues可以是0,1,或者是更多的操作参数名称和数值对。如果你想要看每个命令的可以用的optionvalues,你可以使用sccommand这样的格式。这会为你提供详细的帮助。
Optionvalues为optionname的参数的名称指定它的数值。有效数值范围常常限制于哪一个参数的optionname。如果要列表请用
sccommand来询问每个命令。
Comments很多的命令需要管理员权限,所以我想说,在你操作这些东西的时候最好是管理员。呵呵!
当你键入SC而不带任何参数时,SC.exe会显示帮助信息和可用的命令。当你键入SC紧跟着命令名称时,你可以得到一个有关这个命令的详细列表。比如,键入sccreate可以得到和create有关的列表。但是除了一个命令,scquery,这会导出该系统中当前正在运行的所有服务和驱动程序的状态。
当你使用start命令时,你可以传递一些参数(arguments)给服务的主函数,但是不是给服务进程的主函数。
SCcreate这个命令可以在注册表和服务控制管理数据库建立一个入口。
语法1sc[servername]createServicename[Optionname=Optionvalues]
这里的servername,servicename,optionname,optionvalues和上面的一样,这里就不多说了。这里我们详细说明一下optionname和optionvalues。
Optionname--Optionvalues描述
type=----own,share,interact,kernel,filesys关于建立服务的类型,选项值包括驱动程序使用的类型,默认是share。
start=----boot,system,auto,demand,disabled关于启动服务的类型,选项值包括驱动程序使用的类型,默认是demand(手动)。
error=----normal,severe,critical,ignore当服务在导入失败错误的严重性,默认是normal。
binPath=--(string)服务二进制文件的路径名,这里没有默认值,这个字符串是必须设置的。
group=----(string)这个服务属于的组,这个组的列表保存在注册表中的ServiceGroupOrder下。默认是nothing。
tag=----(string)如果这个字符串被设置为yes,sc可以从CreateServicecall中得到一个tagId。然而,SC并不显示这个标签,所
以使用这个没有多少意义。默认是nothing
depend=----(spaceseparatedstring)有空格的字符串。在这个服务启动前必须启动的服务的名称或者是组。
obj=----(string)账号运行使用的名称,也可以说是登陆身份。默认是localsystem
Displayname=--(string)一个为在用户界面程序中鉴别各个服务使用的字符串。
password=--(string)一个密码,如果一个不同于localsystem的账号使用时需要使用这个。
OptionvaluesOptionname参数名称的数值列表。参考optionname。当我们输入一个字符串时,如果输入一个空的引用这意味着
一个空的字符串将被导入。
CommentsTheSCCREATEcommandperFORMstheoperationsoftheCreateServiceAPIfunction.这个sccreate命令执行CreateServiceAPI函数的操作。详细请见CreateService。
例1下面这个例子在一台叫做(\\\\myserver)的计算机上为一个叫“NewService”的服务建立的一个注册表登记。sc\\\\myservercreateNewServicebinpath=c:\\winnt\\system32\\NewServ.exe
按照默认,这个服务会建立一个WIN32_SHARE_PROCESS使用SERVICE_DEMAND_START启动方式。这将不会有任何从属
关系,也将会按照localsystem安全上下关系来运行。
例2下面这个例子将在本地计算机上,建立一个服务,它将会是一个自动运行服务,并且运行在他自己的进程上。它
从属于TDI组和NetBios服务上。注意,你必须在从属中间增加一个空格的引用。
sccreateNewServicebinpath=c:\\winnt\\system32\\NewServ.exetype=ownstart=autodepend=\'+TDINetbios\'
例3服务开发者可以通过临时改变二进制路径(影像路径)的方式来将这个服务运行在内核调试器的上下关系中。下面这个例子就可以让我们看到如何改变服务的配置。
scconfigNewServicebinpath=\'ntsd-dc:\\winnt\\system32\\Newserv.exe\'这个例子会引起服务控制管理器调用ntsd.exe使用下例的参数字符串:\'-dc:\\nt\\system32\\NewServ.exe\'
当系统装入newserv.exe时ntsd将会转而打断调试器,所以断点可以被设置在服务代码里。
SCQC这个SCQC“询问配置”命令可以列出一个服务的配置信息和QUERY_SERVICE_CONFIG结构。
语法1sc[Servername]qcServicename[Buffersize]
Parametersservername和servicename前面已经介绍过了,这里不再多说。
Buffersize,可选择的,列出缓冲区的尺寸。
Comments
SCQC命令显示了QUERY_SERVICE_CONFIG结构的内容。
以下是QUERY_SERVICE_CONFIG相应的区域。TYPE------dwServiceTypeSTART_TYPE----dwStartTypeERROR_CONTROL----dwErrorControlBINARY_PATH_NAME--lpBinaryPathNameLOAD_ORDER_GROUP--lpLoadOrderGroupTAG------dwTagIdDISPLAY_NAME----lpDisplayNameDEPENDENCIES----lpDependenciesSERVICE_START_NAME--lpServiceStartName
例1
下面这个例子询问了在上面例子中建立的“NewService”服务的配置:
sc\\\\myserverqcNewService
sc显示下面的信息:
SERVICE_NAME:NewServiceTYPE:20WIN32_SHARE_PROCESSSTART_TYPE:3DEMAND_STARTERROR_CONTROL:1NORMALBINARY_PATH_NAME:c:\\winnt\\system32\\NewServ.exeLOAD_ORDER_GROUP:TAG:0DISPLAY_NAME:NewServiceDEPENDENCIES:SERVICE_START_NAME:Localsystem
NewService有能力和其他的服务共享一个进程。但是它不是自动启动的。二进制文件名是NewServ.exe。这个服务
不依靠与其它的的服务,而且运行在lcoalsystem的安全上下关系中。这些都是调用QueryServiceStatus基本的返
回,如果还需要更多的细节届时,可以看看API函数文件。
SCQUERY
SCQUERY命令可以获得服务的信息。
语法:sc[Servername]query{Servicename|Optionname=Optionvalues...}
参数:
servername,servicename,optionname,optionvalues不在解释。只谈一下这个命令提供的数值。
Optionname--OptionvaluesDescription
type=----driver,service,all列举服务的类型,默认是service
state=----active,inactive,all列举服务的状态,默认是active
bufsize=--(numericvalues)列举缓冲区的尺寸,默认是1024bytes
ri=----(numericvalues)但开始列举时,恢复指针的数字,默认是0
Optionvalues同上。
SCQUERY命令可以显示SERVICE_STATUS结构的内容。
下面是SERVICE_STATUS结构相应的信息:TYPE------dwServiceTypeSTATE------dwCurrentState,dwControlsAcceptedWIN32_EXIT_CODE----dwWin32ExitCodeSERVICE_EXIT_CODE--dwServiceSpecificExitCodeCHECKPOINT----dwCheckPointWAIT_HINT----dwWaitHint
在启动计算机后,使用SCQUERY命令会告诉你是否,或者不是一个启动服务的尝试。如果这个服务成功启动,WIN32_EXIT_CODE区间会将会包含一个0,当尝试不成功时,当它意识到这个服务不能够启动时,这个区间也会提供一个退出码给服务。
例子
查询“NewService\'服务状态,键入:
scqueryNewService
显示一下信息:
SERVICE_NAME:NewServiceTYPE:20WIN32_SHARE_PROCESSSTATE:1STOPPED(NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)WIN32_EXIT_CODE:1077(0x435)SERVICE_EXIT_CODE:0(0x0)CHECKPOINT:0x0WAIT_HINT:0x0
注意,这里存在一个给这个服务的退出码,即使这个服务部不在运行,键入nethelpmsg1077,将会得到对1077错误信息的说明:
上次启动之后,仍未尝试引导服务。
所以,这里我想说一句,希望大家可以活用nethelpmsg,这会对你的学习有很大的帮助。
下面在对SCquery的命令在说明一下:
列举活动服务和驱动程序状态,使用以下命令:scquery
显示messenger服务,使用以下命令:scquerymessenger
只列举活动的驱动程序,使用以下命令:scquerytype=driver
列举Win32服务,使用以下命令:scquerytype=service
列举所有的服务和驱动程序,使用以下命令:scquerystate=all
用50byte的缓冲区来进行列举,使用以下命令:scquerybufsize=50
在恢复列举时使用index=14,使用以下命令:scqueryri=14
列举所有的交互式服务,使用以下命令:scquerytype=servicetype=interact
好了,说到这里。SC命令基本上已经说完了。
//2sc.exe命令功能列表:
1.更改服务的启动状态(这是比较有用的一个功能)
2.删除服务(除非对自己电脑的软、硬件所需的服务比较清楚,否则不建议删除任何系统服务,特别是基础服务)
3.停止或启动服务(功能上类似于netstop/start,但速度更快且能停止的服务更多)
具体的命令格式如下:
修改服务启动类型的命令行格式为(特别注意start=后面有一个空格)
scconfig服务名称start=demand(设置服务为手动启动)
scconfig服务名称start=disabled(设置服务为禁用)
停止/启动服务的命令行格式为
scstop/start服务名称
注意:平时常接触的都是服务的显示名称,而以上所指是服务名称,都可以在控制面板->管理工具->服务里面,双击对应的服务来查询。
先举例说明一下具体的设置方法:
如设置远程注册表服务为手动其格式为
scconfigRemoteRegistrystart=demand
设为禁用的格式为:
scconfigRemoteRegistrystart=disabled
停止服务则格式为:
scstopRemoteRegistry
首先把自己所需设置的服务名称查到之后,按照上面的格式做成批处理文件,重装系统之后只要运行批处理文件即可。
以下是我的设置,以XpSp2为蓝本,可比对所用的系统进行增删和修改。注:未加入XpSp2的自动更新、安全中心、防火墙。
scconfigAlerterstart=demand
scconfigTrkWksstart=demand
scconfighelpsvcstart=demand
scconfigpolicyAgentstart=demand
scconfigdmserverstart=demand
scconfigWmdmpmSnstart=demand
scconfigSpoolerstart=demand
scconfigNtmsSvcstart=demand
scconfigseclogonstart=demand
scconfigSchedulestart=demand
scconfigWebClientstart=demand
scconfigW32Timestart=demand
scconfigWZCSVCstart=demand
scconfigERSvcstart=demand
scconfigThemesstart=demand
scconfigFastUserSwitchingCompatibilitystart=disabled
scconfigMessengerstart=disabled
scconfigprotectedStoragestart=disabled
scconfigSSDpSRVstart=disabled
scconfigTermServicestart=disabled
scconfigShellHWDetectionstart=disabled
如果需要立即关闭服务也可把以下代码跟在上面的代码之后
scstopW32Time
scstopShellHWDetection
scstopTrkWks
scstophelpsvc
scstopdmserver
scstoppolicyAgent
scstopSpooler
scstopseclogon
scstopSchedule
scstopWZCSVC
scstopERSvc
scstopThemes
scstopFastUserSwitchingCompatibility
scstopprotectedStorage
scstopSSDpSRV
scstopWebClient
最后把修改好之后的代码存为services.cmd,在以后进行服务设置时,直接运行事先保存好的批处理文件就可以做到事半功倍了。
看到这里,使用Win2000的朋友也不必失望,sc.exe这个命令行工具对Win2000同样适用,可从装有WinXp或者Win2003的机器里面拷贝sc.exe文件,与保存好的批处理文件放在一起,然后执行批处理文件即可。
对注册表比较熟悉的朋友可能会想到用注册表来设置服务的启动类型,这也是一种可行的方法,本身却有着内在不足。原因是服务启动类型在注册表中对应的键值较长且分散,进行整理不方便直观且易错漏,所以这种方法比较适用于无人值守的安装时使用。
//3使用SC命令时注意事项
Windows2003Server存在一个sc命令,(好像Windows2000/XP/NT都有这个。)该命令可以手工创建Windows服务(NTService)
以下是微软帮助文件中对sc命令的描述:
与“服务控制器”和已安装设备进行通讯。SC.exe检索和设置有关服务的控制信息。可以使用SC.exe来测试和调试服务程序。可以设置存储在注册表中的服务属性来控制如何在启动时和作为后台程序运行时启动服务应用程序。SC.exe的参数可以配置指定的服务,检索当前服务的状态,也可以停止和启动服务。可以生成批处理文件来调用不同的SC.exe命令以自动启动或关闭服务序列。SC.exe提供的功能类似于“控制面板”中“管理工具”项中的“服务”。
其他命令选项可以自己查帮助,主要看看create和delete这两条我们常用的命令
sccreate
为服务在注册表和“服务控制管理器”中创建子项和入口。
语法sc[ServerName]create[ServiceName][type={own|share|kernel|filesys|rec|adapt|interacttype={own|share}}][start={boot|system|auto|demand|disabled}][error={normal|severe|critical|ignore}][binpath=BinaryPathName][group=LoadOrderGroup][tag={yes|no}][depend=dependencies][obj={AccountName|ObjectName}][displayname=DisplayName][password=Password]
参数ServerName指定服务所在的远程服务器名称。该名称必须使用UNC格式(“\\myserver”)。要在本机上运行SC.exe,请忽略此参数。ServiceName指定由getkeyname操作返回的服务名。type={own|share|kernel|filesys|rec|adapt|interacttype={own|share}}指定该服务类型。默认类型为type=own。值描述
own服务以其自身的进程运行。不与其他服务共享可执行文件。这是默认设置。
share服务作为共享进程运行。它与其他服务共享一可执行文件。
kernel驱动程序。
filesys文件系统驱动程序。
rec文件系统识别驱动器(标识在计算机上使用的文件系统)。
interact服务可以与桌面交互作用,接收用户的输入。交互服务必须在LocalSystem帐户下运行。该类型必须与type=own或type=shared(例如,type=interacttype=own)结合使用。单独使用type=interact将会产生一个无效参数错误。
start={boot|system|auto|demand|disabled}指定服务的启动类型。默认的启动类型是start=demand。boot由启动引导程序加载的设备驱动器。
system在核心初始化过程中启动的设备驱动器。
demand必须手动启动的服务。如果没有指定start=,这就默认值。
disabled不能启动的服务。要启动一个禁用的服务,把启动类型更改为其他值。
error={normal|severe|critical|ignore}如果在启动中,服务器启动失败,则指定错误的严重性。默认设置为ascii。normal将记录错误,并且显示消息对话框,通知用户服务启动失败。启动将继续。这是默认设置。
severe记录错误(如果存在)。计算机尝试以最新的有效配置重新启动。这可能导致计算机能够重新启动,但服务器却仍然不能运行。
critical记录错误(如果存在)。计算机尝试以最新的有效配置重新启动。如果上次已知正确的配置失败,启动也将失败,启动过程就会以“蓝屏”错误而停止。
ignore错误已记录,启动继续。记录错误超出在事件日志的范围,不再给用户作出提示。
binpath=BinaryPathName指定一个进入服务二进制文件的路径。binpath=没有默认值,必须要给出此字符串。group=LoadOrderGroup指定一个该服务为其中成员的组名。组列表存储在HKLM\System\CurrentControlSet\Control\ServiceGroupOrder子项的注册表中。默认设置为空值。tag={yes|no}指定是否在“CreateService”调用中获得TagID。标记仅用于根启动或系统启动驱动程序。depend=dependencies指定必须要在此项服务之前启动的服务名或组名。名称以斜线(/)分离开来。obj={AccountName|ObjectName}指定一个将运行的服务的帐户名,或指定一个将会运行的驱动程序的Windows驱动程序对象名。displayname=DisplayName指定被用户界面程序用来标识服务的友好名称。password:password指定一个密码。如果使用的不是LocalSystem的帐户,密码是必需的。/在命令提示符下显示帮助。注释如果参数及其值之间没有空格,(例如,是type=own,而不是type=own),则操作会失败。示例下面的示例显示了如何使用sccreate命令:
sc\\myservercreateNewServicebinpath=c:\windows\system32\NewServ.exesccreateNewServicebinpath=c:\windows\system32\NewServ.exetype=sharestart=autodepend="+TDINetbios"
scdelete
从注册表中删除服务子项。如果服务正在运行或者另一个进程有一个该服务的打开句柄,那么此服务将标记为删除。
语法sc[ServerName]delete[ServiceName]
参数ServerName指定服务所在的远程服务器名称。该名称必须使用UNC格式(“\\myserver”)。要在本机上运行SC.exe,请忽略此参数。ServiceName指定由getkeyname操作返回的服务名。/在命令提示符下显示帮助。注释使用“添加或删除程序”删除DHCP、DNS或任何其他内置的操作系统服务。“添加或删除程序”不只删除该服务的注册表子项,而且还卸载该服务并删除其所有的快捷方式。示例下面的示例显示了如何使用scdelete命令:
scdeletenewserv
需要注意的是:1.在option=xxxxx格式中,“=”号和后面的内容一定要有空格,如depend=Tcpip2.如果命令中的需要进行双引号的嵌套,使用反斜杠加引号"\""来进行转义处理。