Windows 로그오프 사용자 명령줄

Windows 로그오프 사용자 명령줄

명령줄을 사용하여 사용자를 로그오프하고 싶습니다. 세션 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

용법 :
로그오프 사용자 이름

메모 :사용자 이름 인수는 의도적으로 대소문자를 구분하지 않습니다(예: 사용자 이름 = UserName = USERNAME = USERname).

관련 정보