Показать полную графическую версию : [решено] Завершение всех процессов с одинаковым именем, если их больше 2
santey007
04-12-2019, 07:46
Всем здравствуйте!
Подскажите или поделитесь скриптом, который может решить данную задачу.
Завершать все процессы с одинаковым именем, от конкретного пользователя, если таких процессов больше 3-х.
делал просто батник через команду таскил, но там нет функции выборки по кол-ву процессов или я ее просто не знаю. он грохает все или же один раб процесс от конкретного пользователя.
DJ Mogarych
04-12-2019, 09:03
Powershell:
#Requires -RunAsAdministrator
$proc = get-process notepad -IncludeUserName
if ($proc.count -gt 3 -and $proc.username -eq 'user') {kill $proc -Force -Confirm:$false}
DJ Mogarych, подумайте, что будет, если процессы запущены пользователями user1, user2, user3
DJ Mogarych
04-12-2019, 11:29
Исправил.
santey007
10-12-2019, 08:40
ок, спасибо, попробую!
santey007
24-01-2020, 11:12
не работает скрипт, процессы не убивает(
может через батник подобное можно сотворить ?
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
santey007, 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
Нужные пиды можно получить циклом
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
немного уточню:
есть конкретное имя процесса, которое плодится и запускается от определенного пользователя и если этот процесс запускает уже более 3-х экземпляров (имя одинаковое, разные ИД), то надо завершать все эти процессы с определенным именем от определенного пользователя.
megaloman
25-01-2020, 22:46
есть конкретное имя процесса, которое плодится и запускается от определенного пользователя и если этот процесс запускает уже более 3-х экземпляров (имя одинаковое, разные ИД), то надо завершать все эти процессы с определенным именем от определенного пользователя. »
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
не работает(((
Описание: если больше 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
кажется норм отработало, понаблюдаю еще, СПАСИБО!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.