gpt4 book ai didi

batch-file - VBScript 检查用户打开的进程

转载 作者:行者123 更新时间:2023-12-03 09:38:57 26 4
gpt4 key购买 nike

我需要一个 VBScript 来检查特定用户是否正在使用进程:

代理单击程序图标 --> progcheck.vbs 的批处理文件调用 -->

progcheck.vbs 看起来是“whatever.exe”仅在该用户下运行-->

如果程序正在该用户下运行,则 MsgBox "Program running"--> wscript.quit (这需要从批处理文件中终止)

否则 --> 返回批处理文件。

我已经在批处理文件中使用 tasklist 尝试过这个,脚本可以工作,但需要永远为域用户运行。无论如何都想在 vbscript 中做到这一点。

*** 使用 MODS 更新脚本 10/12 *****

OPTION EXPLICIT

DIM strComputer,strProcess, strUserName,wshShell

Set wshShell = WScript.CreateObject( "WScript.Shell" )
strUserName = wshShell.ExpandEnvironmentStrings( "%USERNAME%" )

strComputer = "." '
strProcess = "notepad.exe"


IF isProcessRunning(strComputer,strProcess,strUserName) THEN
If MsgBox ("Notepad needs to be closed.", 1) = 1 then
wscript.Quit(1)
End If
END IF

FUNCTION isProcessRunning(BYVAL strComputer,BYVAL strProcessName,BYVAL strUserName)

DIM objWMIService, strWMIQuery

strWMIQuery = "Select * from Win32_Process where name like '" & strProcessName & "' AND owner like '" &strUserName& "'"

SET objWMIService = GETOBJECT("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")


IF objWMIService.ExecQuery(strWMIQuery).Count > 0 THEN
isProcessRunning = TRUE
ELSE
isProcessRunning = FALSE
END If

End Function

让我知道您的想法以及我错在哪里。提前致谢。

最佳答案

更新的代码 v3:查看帮助评论

OPTION EXPLICIT

DIM strComputer, strProcess, strUserName, wshShell

Set wshShell = WScript.CreateObject( "WScript.Shell" )
strUserName = wshShell.ExpandEnvironmentStrings( "%USERNAME%" )
strComputer = "."
strProcess = "notepad.exe" 'change this to whatever you are trying to detect

IF isProcessRunning(strComputer, strProcess, strUserName) THEN
If MsgBox ("Notepad needs to be closed.", 1) = 1 then
wscript.Quit(1) 'you need to terminate the process if that's your intention before quitting
End If
Else
msgbox ("Process is not running") 'optional for debug, you can remove this
END IF

FUNCTION isProcessRunning(ByRef strComputer, ByRef strProcess, ByRef strUserName)

DIM objWMIService, strWMIQuery, objProcess, strOwner, Response

strWMIQuery = "SELECT * FROM Win32_Process WHERE NAME = '" & strProcess & "'"

SET objWMIService = GETOBJECT("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2").ExecQuery(strWMIQuery)

IF objWMIService.Count > 0 THEN
msgbox "We have at least ONE instance of Notepad"
For Each objProcess in objWMIService
Response = objProcess.GetOwner(strOwner)
If Response <> 0 Then
'we didn't get any owner information - maybe not permitted by current user to ask for it
Wscript.Echo "Could not get owner info for process [" & objProcess.Name & "]" & VBNewLine & "Error: " & Return
Else
Wscript.Echo "Process [" & objProcess.Name & "] is owned by [" & strOwner & "]" 'for debug you can remove it
if strUserName = strOwner Then
msgbox "we have the user who is running notepad"
isProcessRunning = TRUE
Else
'do nothing as you only want to detect the current user running it
isProcessRunning = FALSE
End If
End If
Next
ELSE
msgbox "We have NO instance of Notepad - Username is Irrelevant"
isProcessRunning = FALSE
END If

End Function

您可以使用以下功能:
FUNCTION isProcessRunning(BYVAL strComputer,BYVAL strProcessName)

DIM objWMIService, strWMIQuery

strWMIQuery = "Select * from Win32_Process where name like '" & strProcessName & "'"

SET objWMIService = GETOBJECT("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")


IF objWMIService.ExecQuery(strWMIQuery).Count > 0 THEN
isProcessRunning = TRUE
ELSE
isProcessRunning = FALSE
END IF

END FUNCTION

对于本地计算机,您将使用 "."
对于进程名称,您将使用可执行文件 "notepad.exe"
对于其余的代码,您可以使用一些简单的东西:
OPTION EXPLICIT
DIM strComputer,strProcess

strComputer = "." ' local computer
strProcess = "notepad.exe" 'whatever is the executable

IF isProcessRunning(strComputer,strProcess) THEN
'do something
ELSE
'do something else or nothing
wscript.echo strProcess & " is NOT running on computer '" & strComputer & "'"
END IF

那应该这样做。

额外

要显示正在运行的每个进程,请运行:
Option Explicit
Dim objWMIService, objProcess, colProcess
Dim strComputer, strList

strComputer = "."

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")

Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process")

For Each objProcess in colProcess
strList = strList & vbCr & _
objProcess.Name
Next

WSCript.Echo strList
WScript.Quit

关于batch-file - VBScript 检查用户打开的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19328981/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com