Batch:
Я не знаю встроенной в Windows утилиты "logoff by name".
Вы можете использовать пакетный файл для запроса текущих сеансов, выбора имен и идентификаторов сеансов, а затем выхода из системы соответствующих пользователей:
@echo off
query session > sessioninfo.txt
for /f "skip=2 tokens=2,3" %%i in (sessioninfo.txt) DO if [%%i]==[%1] logoff %%j
del sessioninfo.txt
Использование:
batchfile.bat username
Пакет загружает результаты query session
в текстовый файл.
Затем он использует цикл for
, пропуская первые две строки, чтобы загрузить токены имени пользователя и идентификатора сеанса для каждой строки в I
и J
I
проверил, чтобы увидеть, соответствует ли оно имени, предоставленному в качестве аргумента (представленному %1
), и если так, logoff
используется с соответствующим идентификатором сеанса.
После некоторых комментариев и подробностей, касающихся "отключенных" пользователей, я думаю, что это было бы лучше сделать в PowerShell.
PowerShell:
Вот сценарий PowerShell, который будет выходить из всех сеансов, которые соответствуют имени пользователя, которому вы его кормите, и это работает, если пользователь активен или отключен.
param (
[string]$username = $(throw "-username is required.")
)
function Get-Sessions
{
$queryResults = query session
$starters = New-Object psobject -Property @{"SessionName" = 0; "UserName" = 0; "ID" = 0; "State" = 0; "Type" = 0; "Device" = 0;}
foreach ($result in $queryResults)
{
try
{
if($result.trim().substring(0, $result.trim().indexof(" ")) -eq "SESSIONNAME") {
$starters.UserName = $result.indexof("USERNAME");
$starters.ID = $result.indexof("ID");
$starters.State = $result.indexof("STATE");
$starters.Type = $result.indexof("TYPE");
$starters.Device = $result.indexof("DEVICE");
continue;
}
New-Object psobject -Property @{
"SessionName" = $result.trim().substring(0, $result.trim().indexof(" ")).trim(">");
"Username" = $result.Substring($starters.Username, $result.IndexOf(" ", $starters.Username) - $starters.Username);
"ID" = $result.Substring($result.IndexOf(" ", $starters.Username), $starters.ID - $result.IndexOf(" ", $starters.Username) + 2).trim();
"State" = $result.Substring($starters.State, $result.IndexOf(" ", $starters.State)-$starters.State).trim();
"Type" = $result.Substring($starters.Type, $starters.Device - $starters.Type).trim();
"Device" = $result.Substring($starters.Device).trim()
}
}
catch
{
$e = $_;
throw "ERROR: " + $e.PSMessageDetails
}
}
}
$username = $username.ToLower()
$userSessions = Get-Sessions | ? { ($_.UserName).ToLower() -eq $username } | Select ID, UserName
$numberOfSessions = ($userSessions | measure).Count
if ($numberOfSessions -gt 0) {
foreach ($session in $userSessions)
{
$sessionInfo = $session.Username + " (" + $session.ID + ")"
Write-Host "Found $sessionInfo"
logoff $session.ID /V
}
} else {
Write-Host """$username"" not found in session list."
}
Использование (изнутри .\LogEmOff.ps1 Abdou76
Аргумент имени пользователя преднамеренно НЕ чувствителен к регистру (то есть: AbDoU76 = Abdou76 = ABDOU76 = abdou76)