Вы не отметили свой вопрос каким-либо конкретным тегом (например, batch-file или powershell), тогда я предполагаю, что вы хотите командный файл. Алгоритм тот же, независимо от того, какой язык вы используете, но, очевидно, синтаксис довольно разный (сценарий PowerShell намного проще и короче).
Из командной строки (то в конечном итоге с запланированной задачи или операции автозапуск, когда пользователь входит в сеть), вы можете использовать TASKKILL
:
TASKKILL /FI "IMAGENAME eq imagename.exe" /FI "USERNAME ne %USERNAME%" /T /F
Несколько заметок:
- Заменить
imagename.exe
с image name Процесс SAP Business One (проверьте его с помощью TASKLIST
), в качестве альтернативы вы можете использовать фильтр WINDOWTITLE
.
- Если пользователи вошли в систему под доменом, вы можете заменить
%USERNAME%
на %USERDOMAIN%\%USERNAME%
.
/F
выключатель принудительно закрыть указанный процесс, сделать это, только если нежный не работает.
/T
закрывает процесс и все его дети (я вижу, что некоторые из этих процессов имеют детей).
- Проверить
TASKKILL
справку для получения дополнительных фильтров, обратите внимание, что это убьет все процессы, которые не принадлежат пользователю, который в настоящий момент вошел в систему, который выполняет эту команду. Он имеет одно очевидное значение: у входа в систему пользователь должен иметь требуемые разрешения, и у вас есть только один зарегистрированный пользователь в любое время.
Последствия последней точки как-то огромны, и все будет сложнее, если вам нужно обойти это.Учитывая, что вы можете получить подробную информацию о процессе с помощью TASKLIST /V
и вы можете форматировать вывод в удобном формате с использованием (предположим, для этого примера, что имя процесса изображения sapbo.exe
):
TASKLIST /V /FO:CSV /FI "IMAGENAME eq sapbo.exe"
который может быть разобран используя что-то например:
FOR /F "delims=, tokens=1-7" %1 IN ('TASKLIST /V /FO:CSV "IMAGENAME eq sapbo.exe"') DO (
echo %1 %7
)
Необходимо определить, вошел ли пользователь в систему или нет. Если это интерактивный сеанс вы можете просто проверить процесс оболочки Windows (прочитать его из реестра, если вы хотите сделать что-то хорошо ...) Простейший способ я знаю, чтобы использовать код из this post:
TASKLIST /FI "IMAGENAME eq myapp.exe" 2>NUL | FIND /I /N "myapp.exe">NUL
IF "%ERRORLEVEL%"=="0" ECHO Programm is running
Потому что вам нужно чтобы убить процесс, если он не вошедшего в пользователь затем поместить это после того, как DO
части (это одна линия, то здесь я расколоть только для ясности):
TASKLIST /FI "IMAGENAME eq winlogon.exe" /FI "USERNAME eq %7" 2>NUL
| FIND /I /N "winlogon.exe" > NUL
|| TASKKILL /T /F /PID %2
не забудьте адаптировать этот код для вашего конкретного случая ...
Как я уже сказал, PowerShell намного проще. Прежде всего, вы хотите, чтобы все процессы, которые имеют право быть убиты:
Get-Process sapbo -IncludeUserName
Петля через них и проверить, есть ли интерактивная сессия:
foreach ($eligibleProcess in Get-Process sapbo -IncludeUserName)
{
if (-not Get-Process winlogon -ErrorAction SilentlyContinue -IncludeUserName | where { $_.UserName -eq $eligibleProcess.UserName })
{
$eligibleProcess.Kill();
}
}
Пожалуйста, обратите внимание, что я написал здесь код, то это не проверены, будьте осторожны ...
Ok. Оба способа: командный файл и powershell хорошо знать –