Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Завершение всех процессов с одинаковым именем, если их больше 2

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

Старожил


Сообщения: 346
Благодарности: 5

Профиль | Отправить PM | Цитировать


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

Отправлено: 07:46, 04-12-2019

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


Powershell:
Код: Выделить весь код
#Requires -RunAsAdministrator
$proc = get-process notepad -IncludeUserName
if ($proc.count -gt 3 -and $proc.username -eq 'user') {kill $proc -Force -Confirm:$false}

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Последний раз редактировалось DJ Mogarych, 04-12-2019 в 11:29.


Отправлено: 09:03, 04-12-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


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

Отправлено: 11:04, 04-12-2019 | #3


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


Исправил.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 11:29, 04-12-2019 | #4


Старожил


Сообщения: 346
Благодарности: 5

Профиль | Отправить PM | Цитировать


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

Отправлено: 08:40, 10-12-2019 | #5


Старожил


Сообщения: 346
Благодарности: 5

Профиль | Отправить PM | Цитировать


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

Отправлено: 11:12, 24-01-2020 | #6


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


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  }
Только от имени пользователя и часть ОС запущена ;-)

Последний раз редактировалось Busla, 24-01-2020 в 13:27.


Отправлено: 13:09, 24-01-2020 | #7


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:09, 24-01-2020 | #8


Новый участник


Сообщения: 48
Благодарности: 2

Профиль | Отправить PM | Цитировать


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

Отправлено: 17:11, 25-01-2020 | #9


Старожил


Сообщения: 346
Благодарности: 5

Профиль | Отправить PM | Цитировать


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

Отправлено: 21:55, 25-01-2020 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Завершение всех процессов с одинаковым именем, если их больше 2

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Удаление старых файлов/папок если их кол-во больше n greenOwl Скриптовые языки администрирования Windows 35 14-01-2023 08:34
Доступ - Сетевой доступ с одинаковым именем пользователя AlexeyA Microsoft Windows 10 6 01-09-2016 19:15
CMD/BAT - [решено] Удаление старых файлов по дате и имени, если их больше n NinjaScript Скриптовые языки администрирования Windows 2 04-03-2015 14:27
Прочее - [решено] 2 ПК с одинаковым именем krokradio Сетевые технологии 2 04-02-2014 15:05
CMD/BAT - [решено] Удаление всех файлов с одним именем на всех дисках ZARG-X Скриптовые языки администрирования Windows 3 08-03-2010 11:53




 
Переход