
我想使用命令列註銷用戶,應該使用用戶名而不是會話 ID 來完成,應該強製完成
我嘗試過:shutdown -l
但它僅適用於當前用戶也嘗試過logoff
命令,但它需要會話名稱
編輯:我嘗試過註銷腳本,但它不起作用..任何人都可以修復它嗎?
批次檔
@echo off
query session > logoff.txt
for /f "skip=2 tokens=2,3" %%i in (logoff.txt) DO if [%%i]==[%1] logoff %%j
註銷.TXT
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
console 1 Conn
>rdp-tcp#0 Administrator 2 Active
hi 3 Disc
h 4 Disc
Abdou 5 Disc
Abdou76 6 Disc
rdp-tcp 65536 Listen
嘗試腳本..但失敗了
C:\dir>logoff.bat Abdou76
C:\dir>
用戶 Abdou76 仍處於登入狀態
答案1
批:
據我所知,沒有內建的 Windows「按名稱註銷」實用程式。
您可以使用批次檔來查詢目前會話,選取名稱和會話 ID,然後登出符合的使用者:
@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
循環,跳過前兩行,將每行的使用者名稱和會話 ID 令牌載入到 和I
中J
。
I
檢查它是否與作為參數提供的名稱(由 表示%1
)匹配,如果匹配,則logoff
與相應的會話 ID 一起使用。
在一些有關「斷開連接」用戶的評論和詳細資訊之後,我認為這在 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."
}
用法(在 PowerShell 中):
.\LogEmOff.ps1 Abdou76
使用者名稱參數故意不區分大小寫(即:AbDoU76 = Abdou76 = ABDOU76 = abdou76)
答案2
我找到了解決方案:使用批號
@echo off
query user > logoff.txt
for /f "tokens=1,2" %%i in (logoff.txt) DO if /I [%%i]==[%1] logoff.exe %%j
用法 :
註銷用戶名
筆記 :使用者名稱參數故意不區分大小寫(即:使用者名稱=使用者名稱=使用者名稱=使用者名稱)