Любой язык - [решено] Завершение всех процессов с одинаковым именем, если их больше 2

Аватара пользователя
santey007

Re: Любой язык - [решено] Завершение всех процессов с одинаковым именем, если их больше 2

Сообщение santey007 »

Цитата santey007:



есть конкретное имя процесса, которое плодится и запускается от определенного пользователя и если этот процесс запускает уже более 3-х экземпляров (имя одинаковое, разные ИД), то надо завершать все эти процессы с определенным именем от определенного пользователя.
Любой язык - [решено] Завершение всех процессов с одинаковым именем, если их больше 2







Минимальные изменения VBS варианта

[spoiler]

Код: Выделить всё

UserName = "ThisUser"   'Имя конкретного пользователя
NProcMax = 3            'Максимальное количество одноименных процессов. Если больше - будут удалены все
ProcName = "calc.exe"   'Имя конкретного процесса. если="" то смотрим все процессы
sQuery = "Select *From Win32_Process"
If Trim(ProcName) <> "" Then sQuery = sQuery + " Where Name=" + """" + ProcName + """"
Set Processes = GetObject("winMgmts:").ExecQuery(sQuery)
NProc = Processes.Count
ReDim AllProc(NProc, 2)
MProc = 0
For Each Process In Processes
    If Process.GetOwner(User) = 0 Then
        If LCase(User) = LCase(UserName) Then
            MProc = MProc + 1
            AllProc(MProc, 1) = Process.Name + "*" + User
            AllProc(MProc, 2) = 0
        End If
    End If
Next
If MProc <= NProcMax Then WScript.Quit 1
i = 1
Do
    i0 = i
    AllProc(i0, 2) = 1
    If i = MProc Then Exit Do
    For j = i + 1 To NProc
        If AllProc(i, 1) = AllProc(j, 1) Then
            i = i + 1
            s = AllProc(i, 1)
            AllProc(i, 1) = AllProc(j, 1)
            AllProc(j, 1) = s
            AllProc(i0, 2) = AllProc(i0, 2) + 1
        End If
    Next
    i = i + 1
    If i > MProc Then Exit Do
Loop
For i = 1 To MProc
    NDelProc = AllProc(i, 2) - NProcMax
    If NDelProc > 0 Then
        Program = Mid(AllProc(i, 1), 1, InStr(1, AllProc(i, 1), "*") - 1)
        sQuery = "Select *From Win32_Process Where Name=" + """" + Program + """"
        Set Processes = GetObject("winMgmts:").ExecQuery(sQuery)
        For Each Process In Processes
            If Process.GetOwner(User) = 0 Then
                If LCase(User) = LCase(UserName) Then Process.Terminate
                '    If NDelProc > 0 Then
                '        Process.Terminate
                '        NDelProc = NDelProc - 1
                '    End If
                'End If
            End If
        Next
    End If
Next
[/spoiler]
Аватара пользователя
santey007

Re: Любой язык - [решено] Завершение всех процессов с одинаковым именем, если их больше 2

Сообщение santey007 »

Описание: если больше 3х фирефоксов от юзера "User", убивать всех



Код:

Код: Выделить всё

tasklist /fi "username eq User" /fi "imagename eq firefox*" /nh |findstr .|findstr/n .|findstr/b 4 >nul&&taskkill /f /fi "username eq User" /fi "imagename eq firefox*"
Ответить

Вернуться в «Скриптовые языки администрирования Windows»