написать скрипт .bat для выхода из системы с временем простоя более 1 часа - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь написать скрипт .bat, который будет выходить из системы после 24 часов простоя с удаленного рабочего стола. Сценарий работает нормально до 59 минут, но не может выполнить ту же операцию в течение нескольких часов. Невозможно сделать преобразование. Здесь он выйдет из строя бездействующим пользователям через 5 минут.

@echo off
:Top
for /f "tokens=1-7 delims=,: " %%a in ('query user ^| find /i "disc"') do if %%d GTR 5 (logoff %%b) else %%e GTR 5 (logoff %%b)
choice /T 120 /C 1 /D 1 /N
goto top

если оно превышает 24 часа, время простоя будет выглядеть так:
enter image description here

Я хочу также охватить этот сценарий, потому что этот пакетный скрипт будет запускаться каждые четыре часа из планировщика задач.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Ниже приведен скрипт powershell для выполнения этой работы:


if($server -eq $null){
    $server = "localhost"
}

$users = @()
# Query using quser, 2>$null to hide "No users exists...", then skip to the next server
$quser = quser /server:$server 2>$null
if(!($quser)){
    Continue
}

#Remove column headers
$quser = $quser[1..$($quser.Count)]
foreach($user in $quser){
    $usersObj = [PSCustomObject]@{Server=$null;Username=$null;SessionName=$null;SessionId=$Null;SessionState=$null;LogonTime=$null;IdleTime=$null}
    $quserData = $user -split "\s+"

    #We have to splice the array if the session is disconnected (as the SESSIONNAME column quserData[2] is empty)
    if(($user | select-string "Disc") -ne $null){
        #User is disconnected
        $quserData = ($quserData[0..1],"null",$quserData[2..($quserData.Length -1)]) -split "\s+"
    }

    # Server
    $usersObj.Server = $server
    # Username
    $usersObj.Username = $quserData[1]
    # SessionName
    $usersObj.SessionName = $quserData[2]
    # SessionID
    $usersObj.SessionID = $quserData[3]
    # SessionState
    $usersObj.SessionState = $quserData[4]
    # IdleTime
    $quserData[5] = $quserData[5] -replace "\+",":" -replace "\.","0:0" -replace "Disc","0:0"
    if($quserData[5] -like "*:*"){
        $usersObj.IdleTime = [timespan]"$($quserData[5])"
    }elseif($quserData[5] -eq "." -or $quserData[5] -eq "none"){
        $usersObj.idleTime = [timespan]"0:0"
    }else{
        $usersObj.IdleTime = [timespan]"0:$($quserData[5])"
    }
    # LogonTime
    $usersObj.LogonTime = (Get-Date "$($quserData[6]) $($quserData[7]) $($quserData[8] )")

    $users += $usersObj

   if($usersObj.idleTime -ge [timespan]"23:58" -and  $usersObj.SessionState -eq "Disc")
   {
    Logoff $quserData[3]
     }


}

return $users

}


$quer= Get-LoggedOnUsers````
0 голосов
/ 23 января 2019

Пожалуйста, попробуйте, я только назначил %%e на val, так как это токен в моей системе, поэтому не стесняйтесь устанавливать val=%%d, если у вас время простоя в это время.Я не могу проверить это, как я уже говорил, поскольку у меня нет той же среды.

@echo off
:Top
for /f "tokens=1-7 delims=,: " %%a in ('query user ^| find /i "disc"') do set "val=%%e"
for /f "tokens=1,* delims=:" %%i in ("%val%") do if %%i GEQ 23 if %%j GTR 58 logoff %%b
choice /T 120 /C 1 /D 1 /N
goto top
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...