Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Завершение всех процессов с одинаковым именем, если их больше 2 (http://forum.oszone.net/showthread.php?t=343156)

santey007 04-12-2019 07:46 2898999

Завершение всех процессов с одинаковым именем, если их больше 2
 
Всем здравствуйте!
Подскажите или поделитесь скриптом, который может решить данную задачу.
Завершать все процессы с одинаковым именем, от конкретного пользователя, если таких процессов больше 3-х.
делал просто батник через команду таскил, но там нет функции выборки по кол-ву процессов или я ее просто не знаю. он грохает все или же один раб процесс от конкретного пользователя.

DJ Mogarych 04-12-2019 09:03 2899002

Powershell:
Код:

#Requires -RunAsAdministrator
$proc = get-process notepad -IncludeUserName
if ($proc.count -gt 3 -and $proc.username -eq 'user') {kill $proc -Force -Confirm:$false}


Busla 04-12-2019 11:04 2899020

DJ Mogarych, подумайте, что будет, если процессы запущены пользователями user1, user2, user3

DJ Mogarych 04-12-2019 11:29 2899025

Исправил.

santey007 10-12-2019 08:40 2899743

ок, спасибо, попробую!

santey007 24-01-2020 11:12 2906616

не работает скрипт, процессы не убивает(
может через батник подобное можно сотворить ?

Busla 24-01-2020 13:09 2906642

santey007, возможно, вы указываете пользователя не в той форме
вы точно не путаете условия больше и больше_или_равно? - у вас разные условия в заголовке и в тексте

полный пример
Код:

Get-Process -IncludeUserName | Where-Object { $_.UserName -eq 'DOMAIN\user' } | Group-Object ProcessName | Where-Object { $_.Count -gt 3 } | ForEach-Object { Stop-Process $_.Group -Confirm:$false -Force  }
Только от имени пользователя и часть ОС запущена ;-)

megaloman 24-01-2020 19:09 2906756

santey007,
может через VBS можно сотворить ?
Код:

UserName = "ThisUser"                'Имя конкретного пользователя
NProcMax = 3                        'Максимальное количество одноименных процессов. Если больше - будут удалены все

sQuery = "Select *From Win32_Process"

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

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


vombat2 25-01-2020 17:11 2906899

Нужные пиды можно получить циклом
Код:

For /f "tokens=1,2 delims=," %a in ('tasklist /fi "username eq user" /fi "imagename eq firefox*" /nh /fo csv') do (echo %b)
Далее в цикл добавить счетчик, и условие - если счетчик равен 3 "мочить" первые два пида и все последующие

santey007 25-01-2020 21:55 2906924

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

megaloman 25-01-2020 22:46 2906927

Цитата:

Цитата santey007
есть конкретное имя процесса, которое плодится и запускается от определенного пользователя и если этот процесс запускает уже более 3-х экземпляров (имя одинаковое, разные ИД), то надо завершать все эти процессы с определенным именем от определенного пользователя. »

Минимальные изменения VBS варианта
Код:

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


santey007 30-01-2020 09:58 2907597

не работает(((

vombat2 31-01-2020 07:22 2907732

Описание: если больше 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*"

santey007 03-02-2020 07:24 2908066

кажется норм отработало, понаблюдаю еще, СПАСИБО!


Время: 01:06.

Время: 01:06.
© OSzone.net 2001-