Windows 在远程计算机上重新启动服务的最简单方法

Windows 在远程计算机上重新启动服务的最简单方法,windows,windows-services,Windows,Windows Services,在远程Windows系统上重新启动服务最简单的编程方式是什么?语言或方法并不重要,只要它不需要人与人之间的交互。查看各种工具,以帮助您实现这一目标。例如,psService将在远程计算机上重新启动服务 从Windows XP开始,您可以使用sc.exe与本地和远程服务交互。计划任务以运行与以下类似的批处理文件: sc \\server stop service sc \\server start service 说明: SC是一个命令行程序,用于与 NT服务控制器和服务。 用法: sc[命令][

在远程Windows系统上重新启动服务最简单的编程方式是什么?语言或方法并不重要,只要它不需要人与人之间的交互。

查看各种工具,以帮助您实现这一目标。例如,psService将在远程计算机上重新启动服务

从Windows XP开始,您可以使用
sc.exe
与本地和远程服务交互。计划任务以运行与以下类似的批处理文件:

sc \\server stop service sc \\server start service 说明: SC是一个命令行程序,用于与 NT服务控制器和服务。 用法: sc[命令][服务名称]

    The option <server> has the form "\\ServerName"
    Further help on commands can be obtained by typing: "sc [command]"
    Commands:
      query-----------Queries the status for a service, or
                      enumerates the status for types of services.
      queryex---------Queries the extended status for a service, or
                      enumerates the status for types of services.
      start-----------Starts a service.
      pause-----------Sends a PAUSE control request to a service.
      interrogate-----Sends an INTERROGATE control request to a service.
      continue--------Sends a CONTINUE control request to a service.
      stop------------Sends a STOP request to a service.
      config----------Changes the configuration of a service (persistant).
      description-----Changes the description of a service.
      failure---------Changes the actions taken by a service upon failure.
      qc--------------Queries the configuration information for a service.
      qdescription----Queries the description for a service.
      qfailure--------Queries the actions taken by a service upon failure.
      delete----------Deletes a service (from the registry).
      create----------Creates a service. (adds it to the registry).
      control---------Sends a control to a service.
      sdshow----------Displays a service's security descriptor.
      sdset-----------Sets a service's security descriptor.
      GetDisplayName--Gets the DisplayName for a service.
      GetKeyName------Gets the ServiceKeyName for a service.
      EnumDepend------Enumerates Service Dependencies.

    The following commands don't require a service name:
    sc <server> <command> <option>
      boot------------(ok | bad) Indicates whether the last boot should
                      be saved as the last-known-good boot configuration
      Lock------------Locks the Service Database
      QueryLock-------Queries the LockStatus for the SCManager Database
该选项的格式为“\\ServerName”
有关命令的更多帮助,请键入:“sc[command]”
命令:
查询----------查询服务的状态,或
枚举服务类型的状态。
queryex-----查询服务的扩展状态,或
枚举服务类型的状态。
启动-----------启动一项服务。
暂停-----------向服务发送暂停控制请求。
询问------向服务发送询问控制请求。
继续------向服务发送继续控制请求。
停止---------向服务发送停止请求。
配置-----------更改服务(persistant)的配置。
描述------更改服务的描述。
故障------更改服务在发生故障时采取的操作。
qc-----------------查询服务的配置信息。
qdescription----查询服务的描述。
qfailure------查询服务失败时采取的操作。
delete------删除服务(从注册表中)。
创建------创建一个服务。(将其添加到注册表中)。
控件------向服务发送控件。
sdshow------显示服务的安全描述符。
sdset-------设置服务的安全描述符。
GetDisplayName——获取服务的DisplayName。
GetKeyName-----获取服务的ServiceKeyName。
EnumDependent-----枚举服务依赖项。
以下命令不需要服务名称:
sc
boot------(ok | bad)指示是否应执行最后一次引导
保存为最后一个已知的良好引导配置
锁定------------锁定服务数据库
QueryLock-----查询SCManager数据库的锁定状态
例如:
sc start MyService

我推荐doofledorfer给出的方法

如果您真的想通过直接API调用来实现这一点,那么请查看。下面是获取机器名和服务并停止或启动它们的示例函数

function ServiceStart(sMachine, sService : string) : boolean;  //start service, return TRUE if successful
var schm, schs : SC_Handle;
    ss         : TServiceStatus;
    psTemp     : PChar;
    dwChkP     : DWord;
begin
  ss.dwCurrentState := 0;
  schm := OpenSCManager(PChar(sMachine),Nil,SC_MANAGER_CONNECT);  //connect to the service control manager

  if(schm > 0)then begin // if successful...
    schs := OpenService( schm,PChar(sService),SERVICE_START or SERVICE_QUERY_STATUS);    // open service handle, start and query status
    if(schs > 0)then begin     // if successful...
      psTemp := nil;
      if (StartService(schs,0,psTemp)) and (QueryServiceStatus(schs,ss)) then
        while(SERVICE_RUNNING <> ss.dwCurrentState)do begin
          dwChkP := ss.dwCheckPoint;  //dwCheckPoint contains a value incremented periodically to report progress of a long operation.  Store it.
          Sleep(ss.dwWaitHint);  //Sleep for recommended time before checking status again
          if(not QueryServiceStatus(schs,ss))then
            break;  //couldn't check status
          if(ss.dwCheckPoint < dwChkP)then
            Break;  //if QueryServiceStatus didn't work for some reason, avoid infinite loop
        end;  //while not running
      CloseServiceHandle(schs);
    end;  //if able to get service handle
    CloseServiceHandle(schm);
  end;  //if able to get svc mgr handle
  Result := SERVICE_RUNNING = ss.dwCurrentState;  //if we were able to start it, return true
end;

function ServiceStop(sMachine, sService : string) : boolean;  //stop service, return TRUE if successful
var schm, schs : SC_Handle;
    ss         : TServiceStatus;
    dwChkP     : DWord;
begin
  schm := OpenSCManager(PChar(sMachine),nil,SC_MANAGER_CONNECT);

  if(schm > 0)then begin
    schs := OpenService(schm,PChar(sService),SERVICE_STOP or SERVICE_QUERY_STATUS);
    if(schs > 0)then begin
      if (ControlService(schs,SERVICE_CONTROL_STOP,ss)) and (QueryServiceStatus(schs,ss)) then
        while(SERVICE_STOPPED <> ss.dwCurrentState) do begin
          dwChkP := ss.dwCheckPoint;
          Sleep(ss.dwWaitHint);
          if(not QueryServiceStatus(schs,ss))then
            Break;

          if(ss.dwCheckPoint < dwChkP)then
            Break;
        end;  //while
      CloseServiceHandle(schs);
    end;  //if able to get svc handle
    CloseServiceHandle(schm);
  end;  //if able to get svc mgr handle
  Result := SERVICE_STOPPED = ss.dwCurrentState;
end;
函数ServiceStart(sMachine,sService:string):布尔值//启动服务,如果成功则返回TRUE
变量schm,schs:SC_Handle;
ss:服务状态;
psTemp:PChar;
dwChkP:DWord;
开始
ss.dwCurrentState:=0;
schm:=OpenSCManager(PChar(sMachine)、Nil、SC_MANAGER_CONNECT)//连接到服务控制管理器
如果(schm>0),则开始//如果成功。。。
schs:=OpenService(schm、PChar(sService)、服务启动或服务查询状态);//打开服务句柄、启动和查询状态
如果(schs>0),则开始//如果成功。。。
psTemp:=零;
如果是(StartService(schs,0,psTemp))和(queryservice status(schs,ss)),则
当(服务_运行ss.dwCurrentState)开始时
dwChkP:=ss.dwCheckPoint//dwCheckPoint包含一个定期递增的值,用于报告长操作的进度。保存它。
睡眠(ss.dwWaitHint)//在再次检查状态之前,睡眠一段建议的时间
如果(不是查询服务状态(SCH、ss)),则
中断//无法检查状态
如果(ss.dwCheckPoint0),则开始
schs:=开放服务(schm、PChar(sService)、服务停止或服务查询状态);
如果(schs>0),则开始
如果(控制服务(schs,服务控制停止,ss))和(查询服务状态(schs,ss)),则
虽然(服务已停止,ss.dwCurrentState)确实开始
dwChkP:=ss.dwCheckPoint;
睡眠(ss.dwWaitHint);
如果(不是查询服务状态(SCH、ss)),则
打破
如果(ss.dwCheckPoint
如果它不需要人工交互,这意味着将没有调用此操作的UI,并且我假设它将以某个设置的间隔重新启动?若你们有权访问这台机器,你们可以设置一个计划任务来执行一个批处理文件

net stop "DNS Client"
net start "DNS client"
或者如果你想变得更成熟一点,你可以试试

  • 使用openscmanager打开服务控制管理器数据库
  • 使用EnumDependService()获取依赖服务
  • 使用ChangeConfig()停止所有相关服务,如果启动,则向此函数发送停止信号
  • 停止实际服务
  • net stop "DNS Client"
    net start "DNS client"
    
    taskkill /F /IM processname.exe
    timeout 20
    sc start servicename
    
    $session = New-PSsession -Computername "YourServerName"
    Invoke-Command -Session $Session -ScriptBlock {Restart-Service "YourServiceName"}
    Remove-PSSession $Session
    
    Restart-Service "servicename"
    
    runas /noprofile /user:DOMAIN\USERNAME cmd
    
    sc \\SERVERNAME query Tomcat8
    sc \\SERVERNAME stop Tomcat8
    sc \\SERVERNAME start Tomcat8
    
    #Configuration
    $servername = "ABC",
    $serviceAccountUsername = "XYZ",
    $serviceAccountPassword = "XXX"
    
    #Establish connection
    try {
        if (-not ([System.IO.Directory]::Exists('\\' + $servername))) {
            net use \\$servername /user:$serviceAccountUsername $serviceAccountPassword
        }
    }
    catch {
        #May already exists, if so just continue
        Write-Output $_.Exception.Message
    }
    
    #Restart Service
    sc.exe \\$servername stop "ServiceNameHere"
    sc.exe \\$servername start "ServiceNameHere"