2013-10-12 2 views
2

мне нужен VBScript, который будет проверять, если процесс используется конкретным пользователем:VBScript для проверки открытого процесса пользователя

Агент щелкает значок программы -> вызовы пакетного файла для progcheck.vbs ->

progcheck.vbs смотрит, как «whatever.exe» работает под этим пользователем только ->

, если программа работает под этим пользователем, то MsgBox «программа бега» -> wscript.quit (это необходимо завершить работу из командного файла)

else -> вернуться к пакетной f Ile.

Я пробовал это с tasklist в пакетном файле, и скрипт работает, но навсегда запускается для пользователя домена. Хотите сделать это в vbscript в любом случае.

*** ОБНОВЛЕНО SCRIPT с модами 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 

Позвольте мне знать, что вы думаете, и где я это неправильно. Заранее спасибо.

ответ

5

ОБНОВЛЕНО КОД 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 

Это должно сделать это.

EXTRA

Чтобы показать каждый процесс запущен, то просто запустите:

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 
+0

пятно на и почти идеально. Я смог расширить это и завершить свой сценарий. У меня все еще есть еще одна ошибка отладки, чтобы пройти, но я оставил ее и работаю. Спасибо за массивное лидерство, я действительно ценю это. – JBLSR

+0

Добро пожаловать. Если есть что-то, что вам еще нужно, сообщите мне, и я попытаюсь отладить его для вас. В противном случае, я рад, что это помогло. –

+0

Хорошо, последняя проблема .... Мне нужно проверить запущенную программу для конкретного пользователя на сервере терминалов. Поэтому, если конкретный пользователь уже запускает notepad.exe, скрипт должен проверить это, а затем сообщить им, если он уже запущен под этим пользователем. – JBLSR

Смежные вопросы