SC命令使用(创建window服务等)

//1 sc语法

作为一个命令行工具,SC.exe可以用来测试你自己的系统,你可以设置一个批处理文件来使用不同的参数调用 SC.exe来控制服务。这个很有用,如果你想看看你的服务不断的启动和停止,我没有试过哦!让一个服务一下子 打开,一下子关闭,听上去很不错的。如果你的服务进程里面有多个进程的话,你可以保持一个进程继续运行不 让它走开,然后让另一个不断的打开在关闭,还可以寻找一下内存缺乏导致不完全清楚的证据。
下面介绍SC,SC QC,and SC QUERY
SC使用这样的语法:
1. SC [Servername] command Servicename [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
在注册表中为service key制定的名称。注意这个名称是不同于显示名称的(这个名称可以用net start和服务控

制面板看到),而SC是使用服务键名来鉴别服务的。

Optionname
这个optionname和optionvalues参数允许你指定操作命令参数的名称和数值。注意,这一点很重要在操作名称和等

号之间是没有空格的。一开始我不知道,结果………………,比如,start=optionvalues,这个很重要。 optionvalues可以是0,1,或者是更多的操作参数名称和数值对。
如果你想要看每个命令的可以用的optionvalues,你可以使用sc command这样的格式。这会为你提供详细的帮助。

Optionvalues
为optionname的参数的名称指定它的数值。有效数值范围常常限制于哪一个参数的optionname。如果要列表请用

sc command来询问每个命令。

Comments
很多的命令需要管理员权限,所以我想说,在你操作这些东西的时候最好是管理员。呵呵!

当你键入SC而不带任何参数时,SC.exe会显示帮助信息和可用的命令。当你键入SC紧跟着命令名称时,你可以得 到一个有关这个命令的详细列表。比如,键入sc create可以得到和create有关的列表。但是除了一个命令,sc query,这会导出该系统中当前正在运行的所有服务和驱动程序的状态。

当你使用start命令时,你可以传递一些参数(arguments)给服务的主函数,但是不是给服务进程的主函数。

SC create
这个命令可以在注册表和服务控制管理数据库建立一个入口。

语法1
sc [servername] create Servicename [Optionname= Optionvalues]

这里的servername,servicename,optionname,optionvalues和上面的一样,这里就不多说了。这里我们详细说 明一下optionname和optionvalues。

Optionname--Optionvalues
描述

type=----own, share, interact, kernel, filesys
关于建立服务的类型,选项值包括驱动程序使用的类型,默认是share。

start=----boot, sys tem, auto, demand, disabled
关于启动服务的类型,选项值包括驱动程序使用的类型,默认是demand(手动)。

error=----normal, severe, critical, ignore
当服务在导入失败错误的严重性,默认是normal。

binPath=--(string)
服务二进制文件的路径名,这里没有默认值,这个字符串是必须设置的。

group=----(string)
这个服务属于的组,这个组的列表保存在注册表中的ServiceGroupOrder下。默认是nothing。

tag=----(string)
如果这个字符串被设置为yes,sc可以从CreateService call中得到一个tagId。然而,SC并不显示这个标签,所

以使用这个没有多少意义。默认是nothing

depend=----(space separated string)有空格的字符串。
在这个服务启动前必须启动的服务的名称或者是组。

obj=----(string)
账号运行使用的名称,也可以说是登陆身份。默认是localsys tem

Displayname=--(string)
一个为在用户界面程序中鉴别各个服务使用的字符串。

password=--(string)
一个密码,如果一个不同于localsys tem的账号使用时需要使用这个。

Optionvalues
Optionname参数名称的数值列表。参考optionname。当我们输入一个字符串时,如果输入一个空的引用这意味着

一个空的字符串将被导入。

Comments
The SC CREATE command perFORMs the operations of the CreateService API function.
这个sc create命令执行CreateService API函数的操作。详细请见CreateService。

例1
下面这个例子在一台叫做(\myserver)的计算机上为一个叫“NewService”的服务建立的一个注册表登记。
sc \myserver create NewService binpath= c:winntsys tem32NewServ.exe

按照默认,这个服务会建立一个WIN32_SHARE_PROCESS使用SERVICE_DEMAND_START启动方式。这将不会有任何从属

关系,也将会按照localsys tem安全上下关系来运行。

例2
下面这个例子将在本地计算机上,建立一个服务,它将会是一个自动运行服务,并且运行在他自己的进程上。它

从属于TDI组和NetBios服务上。注意,你必须在从属中间增加一个空格的引用。

sc create NewService binpath= c:winntsys tem32NewServ.exe type= own
start= auto depend= '+TDI Netbios'

例3
服务开发者可以通过临时改变二进制路径(影像路径)的方式来将这个服务运行在内核调试器的上下关系中。下 面这个例子就可以让我们看到如何改变服务的配置。

sc config NewService binpath= 'ntsd -d c:winntsys tem32Newserv.exe'
这个例子会引起服务控制管理器调用ntsd.exe使用下例的参数字符串:
'-d c:ntsys tem32NewServ.exe'

当系统装入newserv.exe时ntsd将会转而打断调试器,所以断点可以被设置在服务代码里。

SC QC
这个SC QC“询问配置”命令可以列出一个服务的配置信息和QUERY_SERVICE_CONFIG结构。

语法1
sc [Servername] qc Servicename [Buffersize]

Parameters
servername和servicename前面已经介绍过了,这里不再多说。

Buffersize,可选择的,列出缓冲区的尺寸。

Comments

SC QC命令显示了QUERY_SERVICE_CONFIG结构的内容。

以下是QUERY_SERVICE_CONFIG相应的区域。
TYPE------dwServiceType
START_TYPE----dwStartType
ERROR_CONTROL----dwErrorControl
BINARY_PATH_NAME--lpBinaryPathName
LOAD_ORDER_GROUP--lpLoadOrderGroup
TAG------dwTagId
DISPLAY_NAME----lpDisplayName
DEPENDENCIES----lpDependencies
SERVICE_START_NAME--lpServiceStartName

例1

下面这个例子询问了在上面例子中建立的“NewService”服务的配置:

sc \myserver qc NewService

sc显示下面的信息:

SERVICE_NAME: NewService
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 3 DEMAND_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : c:winntsys tem32NewServ.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : NewService
DEPENDENCIES :
SERVICE_START_NAME : Localsys tem

NewService有能力和其他的服务共享一个进程。但是它不是自动启动的。二进制文件名是NewServ.exe。这个服务

不依靠与其它的的服务,而且运行在lcoalsys tem的安全上下关系中。这些都是调用QueryServiceStatus基本的返

回,如果还需要更多的细节届时,可以看看API函数文件。

SC QUERY

SC QUERY命令可以获得服务的信息。

语法:
sc [Servername] query { Servicename | Optionname= Optionvalues... }

参数:

servername, servicename, optionname, optionvalues不在解释。只谈一下这个命令提供的数值。

Optionname--Optionvalues
Description

type=----driver, service, all
列举服务的类型,默认是service

state=----active, inactive, all
列举服务的状态,默认是active

bufsize=--(numeric values)
列举缓冲区的尺寸,默认是1024 bytes

ri=----(numeric values)
但开始列举时,恢复指针的数字,默认是0

Optionvalues
同上。

Comments

SC QUERY命令可以显示SERVICE_STATUS结构的内容。

下面是SERVICE_STATUS结构相应的信息:
TYPE------dwServiceType
STATE------dwCurrentState, dwControlsAccepted
WIN32_EXIT_CODE----dwWin32ExitCode
SERVICE_EXIT_CODE--dwServiceSpecificExitCode
CHECKPOINT----dwCheckPoint
WAIT_HINT----dwWaitHint

在启动计算机后,使用SC QUERY命令会告诉你是否,或者不是一个启动服务的尝试。如果这个服务成功启动,WIN32_EXIT_CODE区间会将会包含一个0,当尝试不成功时,当它意识到这个服务不能够启动时,这个区间也会提供一个退出码给服务。

例子

查询“NewService'服务状态,键入:

sc query NewService

显示一下信息:

SERVICE_NAME: NewService
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 1 STOPPED
(NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 1077 (0x435)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

注意,这里存在一个给这个服务的退出码,即使这个服务部不在运行,键入net helpmsg 1077,将会得到对1077错误信息的说明:

上次启动之后,仍未尝试引导服务。

所以,这里我想说一句,希望大家可以活用net helpmsg,这会对你的学习有很大的帮助。

下面在对SC query的命令在说明一下:

列举活动服务和驱动程序状态,使用以下命令:
sc query

显示messenger服务,使用以下命令:
sc query messenger

只列举活动的驱动程序,使用以下命令:
sc query type= driver

列举Win32服务,使用以下命令:
sc query type= service

列举所有的服务和驱动程序,使用以下命令:
sc query state= all

用50 byte的缓冲区来进行列举,使用以下命令:
sc query bufsize= 50

在恢复列举时使用index=14,使用以下命令:
sc query ri=14

列举所有的交互式服务,使用以下命令:
sc query type= service type= interact

好了,说到这里。SC命令基本上已经说完了。

//2 sc.exe命令功能列表:

1.更改服务的启动状态(这是比较有用的一个功能)

2.删除服务(除非对自己电脑的软、硬件所需的服务比较清楚,否则不建议删除任何系统服务,特别是基础服务)

3.停止或启动服务(功能上类似于net stop/start,但速度更快且能停止的服务更多)

具体的命令格式如下:

修改服务启动类型的命令行格式为(特别注意start=后面有一个空格)

sc config 服务名称 start= demand(设置服务为手动启动)

sc config 服务名称 start= disabled(设置服务为禁用)

停止/启动服务的命令行格式为

sc stop/start 服务名称

注意:平时常接触的都是服务的显示名称,而以上所指是服务名称,都可以在控制面板->管理工具->服务里面,双击对应的服务来查询。

先举例说明一下具体的设置方法:

如设置远程注册表服务为手动其格式为

sc config RemoteRegistry start= demand

设为禁用的格式为:

sc config RemoteRegistry start= disabled

停止服务则格式为:

sc stop RemoteRegistry

首先把自己所需设置的服务名称查到之后,按照上面的格式做成批处理文件,重装系统之后只要运行批处理文件即可。

以下是我的设置,以XpSp2为蓝本,可比对所用的系统进行增删和修改。注:未加入XpSp2的自动更新、安全中心、防火墙。

sc config Alerter start= demand

sc config TrkWks start= demand

sc config helpsvc start= demand

sc config policyAgent start= demand

sc config dmserver start= demand

sc config WmdmpmSn start= demand

sc config Spooler start= demand

sc config RemoteRegistry start= demand

sc config NtmsSvc start= demand

sc config seclogon start= demand

sc config Schedule start= demand

sc config WebClient start= demand

sc config W32Time start= demand

sc config WZCSVC start= demand

sc config ERSvc start= demand

sc config Themes start= demand

sc config FastUserSwitchingCompatibility start= disabled

sc config Messenger start= disabled

sc config protectedStorage start= disabled

sc config SSDpSRV start= disabled

sc config TermService start= disabled

sc config ShellHWDetection start= disabled

如果需要立即关闭服务也可把以下代码跟在上面的代码之后

sc stop W32Time

sc stop ShellHWDetection

sc stop TrkWks

sc stop helpsvc

sc stop dmserver

sc stop policyAgent

sc stop Spooler

sc stop RemoteRegistry

sc stop seclogon

sc stop Schedule

sc stop WZCSVC

sc stop ERSvc

sc stop Themes

sc stop FastUserSwitchingCompatibility

sc stop protectedStorage

sc stop SSDpSRV

sc stop WebClient

最后把修改好之后的代码存为services.cmd,在以后进行服务设置时,直接运行事先保存好的批处理文件就可以做到事半功倍了。

看到这里,使用Win2000的朋友也不必失望,sc.exe这个命令行工具对Win2000同样适用,可从装有WinXp或者Win2003的机器里面拷贝sc.exe文件,与保存好的批处理文件放在一起,然后执行批处理文件即可。

对注册表比较熟悉的朋友可能会想到用注册表来设置服务的启动类型,这也是一种可行的方法,本身却有着内在不足。原因是服务启动类型在注册表中对应的键值较长且分散,进行整理不方便直观且易错漏,所以这种方法比较适用于无人值守的安装时使用。

//3  使用SC命令时注意事项

Windows 2003 Server存在一个sc命令,(好像Windows 2000/XP/NT都有这个。)该命令可以手工创建Windows服务(NT Service)

以下是微软帮助文件中对sc命令的描述:

与“服务控制器”和已安装设备进行通讯。SC.exe 检索和设置有关服务的控制信息。可以使用 SC.exe 来测试和调试服务程序。可以设置存储在注册表中的服务属性来控制如何在启动时和作为后台程序运行时启动服务应用程序。SC.exe 的参数可以配置指定的服务,检索当前服务的状态,也可以停止和启动服务。可以生成批处理文件来调用不同的 SC.exe 命令以自动启动或关闭服务序列。SC.exe 提供的功能类似于“控制面板”中“管理工具”项中的“服务”。

其他命令选项可以自己查帮助,主要看看create和delete这两条我们常用的命令

sc create

为服务在注册表和“服务控制管理器”中创建子项和入口。

语法
sc [ServerName] create [ServiceName] [type= {own | share | kernel | filesys | rec | adapt | interact type= {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 | interact type= {own | share}}
指定该服务类型。默认类型为 type= own。

描述

own
服务以其自身的进程运行。不与其他服务共享可执行文件。这是默认设置。

share
服务作为共享进程运行。它与其他服务共享一可执行文件。

kernel
驱动程序。

filesys
文件系统驱动程序。

rec
文件系统识别驱动器(标识在计算机上使用的文件系统)。

interact
服务可以与桌面交互作用,接收用户的输入。交互服务必须在 LocalSystem 帐户下运行。该类型必须与 type= own 或 type= shared(例如,type= interact type= own)结合使用。单独使用 type= interact 将会产生一个无效参数错误。

 

start= {boot | system | auto | demand | disabled}
指定服务的启动类型。默认的启动类型是 start= demand。
boot
由启动引导程序加载的设备驱动器。

system
在核心初始化过程中启动的设备驱动器。

auto
每次计算机重新启动时,甚至没有人登录计算机时,都能自动开始的服务。

demand
必须手动启动的服务。如果没有指定 start=,这就默认值。

disabled
不能启动的服务。要启动一个禁用的服务,把启动类型更改为其他值。

 

error= {normal | severe | critical | ignore}
如果在启动中,服务器启动失败,则指定错误的严重性。默认设置为 ascii。
normal
将记录错误,并且显示消息对话框,通知用户服务启动失败。启动将继续。这是默认设置。

severe
记录错误(如果存在)。计算机尝试以最新的有效配置重新启动。这可能导致计算机能够重新启动,但服务器却仍然不能运行。

critical
记录错误(如果存在)。计算机尝试以最新的有效配置重新启动。如果上次已知正确的配置失败,启动也将失败,启动过程就会以“蓝屏”错误而停止。

ignore
错误已记录,启动继续。记录错误超出在事件日志的范围,不再给用户作出提示。

 

binpath= BinaryPathName
指定一个进入服务二进制文件的路径。binpath= 没有默认值,必须要给出此字符串。
group= LoadOrderGroup
指定一个该服务为其中成员的组名。组列表存储在 HKLMSystemCurrentControlSetControlServiceGroupOrder 子项的注册表中。默认设置为空值。
tag= {yes | no}
指定是否在“CreateService”调用中获得 TagID。标记仅用于根启动或系统启动驱动程序。
depend= dependencies
指定必须要在此项服务之前启动的服务名或组名。名称以斜线 (/) 分离开来。
obj= {AccountName | ObjectName}
指定一个将运行的服务的帐户名,或指定一个将会运行的驱动程序的 Windows 驱动程序对象名。
displayname= DisplayName
指定被用户界面程序用来标识服务的友好名称。
password:password
指定一个密码。如果使用的不是 LocalSystem 的帐户,密码是必需的。
/?
在命令提示符下显示帮助。
注释
如果参数及其值之间没有空格,(例如,是 type= own,而不是 type=own),则操作会失败。
示例
下面的示例显示了如何使用 sc create 命令:

sc myserver create NewService binpath= c:windowssystem32NewServ.exe
sc create NewService binpath= c:windowssystem32NewServ.exe type= share start= auto depend= "+TDI Netbios"

sc delete

从注册表中删除服务子项。如果服务正在运行或者另一个进程有一个该服务的打开句柄,那么此服务将标记为删除。

语法
sc [ServerName] delete [ServiceName]

参数
ServerName
指定服务所在的远程服务器名称。该名称必须使用 UNC 格式(“myserver”)。要在本机上运行 SC.exe,请忽略此参数。
ServiceName
指定由 getkeyname 操作返回的服务名。
/?
在命令提示符下显示帮助。
注释
使用“添加或删除程序”删除 DHCP、DNS 或任何其他内置的操作系统服务。“添加或删除程序”不只删除该服务的注册表子项,而且还卸载该服务并删除其所有的快捷方式。
示例
下面的示例显示了如何使用 sc delete 命令:

sc delete newserv

需要注意的是:
1. 在option= xxxxx格式中,“=”号和后面的内容一定要有空格,如depend=  Tcpip
2. 如果命令中的需要进行双引号的嵌套,使用反斜杠加引号 " " " 来进行转义处理。


如果给你带来帮助,欢迎微信或支付宝扫一扫,赞一下。