首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用WMI重新启动WMI服务的脚本

不使用WMI重新启动WMI服务的脚本
EN

Stack Overflow用户
提问于 2016-06-15 19:43:35
回答 1查看 1.9K关注 0票数 0

我在服务器上的WMI服务中有一个内存泄漏,该服务器承载一个应用程序,该应用程序的客户端依赖于WMI来实时更新应用程序中正在发生的事情。随着WMI服务消耗的内存增加,服务最终会变得没有响应性,必须重新启动。我正在尝试开发一个脚本来实现这一点,但是我遇到了以下问题:

  • 不能从“服务”面板直接停止WMI服务,也不能使用命令行实用程序.
  • 我可以使用tasklist来标识承载WMI服务的系统进程,但是tasklist本身依赖于WMI,如果WMI没有响应,任务列表就会失败。同样地,任务杀死来杀死违规的进程。

SC.EXE似乎不依赖于WMI,所以我可以使用它来查找进程ID,但是需要一些技巧才能解析出SC.EXE返回的内容,一旦我这样做了,如何在不使用taskkill的情况下杀死该进程?

EN

回答 1

Stack Overflow用户

发布于 2019-03-26 19:45:10

脚本是批处理的。下面使用的命令列表: set、for、reg、findstr、if、否则、sc、waitfor。这些命令都不需要WMI。

注意,在示例输出(直接从我的W10系统)中,在服务重新启动后,WMI的PID是不同的。

代码语言:javascript
复制
set "zServices2Stop="
set "zServices2Start="
for /f "tokens=*" %%A in ('reg query hklm\system\currentcontrolset\services /s /v DependOnService ^| findstr /i "hkey winmgmt"') do (
    set "zDbg=0"
    set "sTmp=%%A"
    if /i "!sTmp:~0,5!"=="HKEY_" (
        set "sTmpService=!sTmp:~53!"
    ) else (
        set "zServices2Stop=!zServices2Stop!,!sTmpService!"
        echo ;[i] Found Service With Dependancy To winmgmt Service {!sTmpService!}
    )
)
set "zServices2Stop=!zServices2Stop:~1!"
echo ;[i] List Of Dependancies: {!zServices2Stop!}
for /f "tokens=3" %%A in ('sc queryex winmgmt ^| findstr /i pid') do @echo ;[i] The PID for the "winmgmt" service before: {%%A}
for %%A in (!zServices2Stop!) do (
    sc queryex "%%A" 2>&1 | findstr /i running >nul && (
        set "zServices2Start=!zServices2Start!,%%A"
        echo ;[i] Stopping {%%A}&sc stop "%%A" >nul 2>&1
    ) || (
        echo ;[i] Ignoring Already Stopped Service {%%A}
    )
)
set "zServices2Start=!zServices2Start:~1!"
waitfor RAN%random%%random%%random%DOM /t 2 >nul 2>&1
echo ;[i] Stopping {winmgmt}&sc stop "winmgmt" >nul
waitfor RAN%random%%random%%random%DOM /t 2 >nul 2>&1
echo ;[i] Starting {winmgmt}&sc start "winmgmt" >nul
waitfor RAN%random%%random%%random%DOM /t 2 >nul 2>&1
for %%A in (!zServices2Start!) do (
    echo ;[i] Starting {%%A}&sc start "%%A" >nul
)
for /f "tokens=3" %%A in ('sc queryex winmgmt ^| findstr /i pid') do @echo ;[i] The PID for the "winmgmt" service after: {%%A}

输出将类似于:

代码语言:javascript
复制
;[i] Found Service With Dependancy To winmgmt Service {HgClientService}
;[i] Found Service With Dependancy To winmgmt Service {iphlpsvc}
;[i] Found Service With Dependancy To winmgmt Service {vmms}
;[i] List Of Dependancies: {HgClientService,iphlpsvc,vmms}
;[i] The PID for the "winmgmt" service before: {13124}
;[i] Ignoring Already Stopped Service {HgClientService}
;[i] Stopping {iphlpsvc}
;[i] Stopping {vmms}
;[i] Stopping {winmgmt}
;[i] Starting {winmgmt}
;[i] Starting {iphlpsvc}
;[i] Starting {vmms}
;[i] The PID for the "winmgmt" service after: {12980}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37844409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档