Как заблокировать компьютер по истечении определенного количества времени сразу после входа в систему

Как заблокировать компьютер по истечении определенного количества времени сразу после входа в систему

Хотя естьОЧЕНЬаналогичный вопрос:Как заблокировать компьютер по истечении определенного времени с момента входа в систему?Я не думаю, что это соответствует моим потребностям. Мне нужен мой компьютер, чтобыблокировка НЕ ​​ВЫКЛЮЧЕНИЕ.

Что я сделал: Создал bat-файл со следующим скриптом

shutdown -l /t 1800

Когда я создал задачу в Планировщике задач, она просто не запустилась.ЗАМОКМой ПК. Сам bat-файл не работает. Понятия не имею, почему.

Если я сделаю.

shutdown -l

Работает отлично. Но я не хочу, чтобы это произошло. Я хочу, чтобы это произошло через определенное время.

Я понимаю, что сочетание клавиш WinKey + L и выход из системы — это разные вещи.

Также есть ли возможность делать это каждый день, кроме субботы и воскресенья, в это время мне нужно работать?

решение1

  1. Запустите планировщик заданий.
  2. Создайте запланированную задачу, которая активируется через заданное время после входа в систему. На вкладке «Триггер» есть триггер для входа в систему и возможность отложить действие после события. Здесь вы вводите время.
  3. ПроверятьЗапустить с наивысшими привилегиями(особенно если без этой опции блокировка не работает).
  4. Поместите ваш BAT-файл в качестве исполняемого действия.

Сделанный.

Вы не можете добавить исключение для выходных в пользовательский интерфейс, но вы можете проверить будний день непосредственно в вашем пакетном файле или файле ps1. Или проверить наличие файла "do-not-lock". Если он присутствует, завершите ваш пакет без блокировки. Создайте/удалите этот файл с помощью запланированных задач (которые запускаются в будние/выходные дни).

решение2

Ссылайтесь на этот старый vbscriptAuto-Lock_On_Idle_TimeOut.vbs


Я немного изменил его, чтобы он работал циклично и каждые 30 минут компьютер блокировался.


Автоблокировка_по_сле_определенного_пользователем_времени.vbs

'#################################################################################
'#       Script Name : Auto-Lock_After_Amount_of_Time_Defined_by_User.vbs        #
'#################################################################################
Option Explicit
Dim Copyright,Msg
Dim Timeout,strCommand,VbsPath,ShortcutName
Timeout = 30 '30 minutes : You can modify this variable as your convenience
Msg = Lang
Copyright = Msg(0) & ChrW(169) &" Hackoo 2022"
If AppPrevInstance() Then 
    MsgBox Msg(1) & VbCrLF & CommandLineLike(WScript.ScriptName),VbExclamation,Copyright
    WScript.Quit
Else 
    Do
        strCommand = "CMD /C Shutdown -L"
        VbsPath = Wscript.ScriptFullName
        ShortcutName = "Auto-Lock_TimeOut"
        Call Shortcut(VbsPath,ShortcutName)
        Wscript.Sleep 1000 * 60 * Timeout
        CreateObject("Wscript.Shell").Run strCommand,0,True
    Loop
End If
'---------------------------------------------------------------------------------------------------------------
Sub Shortcut(PathApplication,ShortcutName)
    Dim objShell,StartFolder,objShortCut,MyTab
    Set objShell = CreateObject("WScript.Shell")
    MyTab = Split(PathApplication,"\")
    If ShortcutName = "" Then
        ShortcutName = MyTab(UBound(MyTab))
    End if
    StartFolder = objShell.SpecialFolders("Startup")
    Set objShortCut = objShell.CreateShortcut(StartFolder & "\" & ShortcutName & ".lnk")
    objShortCut.TargetPath = DblQuote(PathApplication)
    ObjShortCut.IconLocation = "%SystemRoot%\system32\SHELL32.dll,44"
    objShortCut.Save
End Sub
'---------------------------------------------------------------------------------------------------------------
Function DblQuote(Str)
    DblQuote = Chr(34) & Str & Chr(34)
End Function
'---------------------------------------------------------------------------------------------------------------
Function AppPrevInstance()   
    With GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")   
        With .ExecQuery("SELECT * FROM Win32_Process WHERE CommandLine LIKE " & CommandLineLike(WScript.ScriptFullName) & _
            " AND CommandLine LIKE '%WScript%' OR CommandLine LIKE '%cscript%'")   
            AppPrevInstance = (.Count > 1)   
        End With   
    End With   
End Function    
'----------------------------------------------------------------------------------------------------------------
Function CommandLineLike(ProcessPath)   
    ProcessPath = Replace(ProcessPath, "\", "\\")   
    CommandLineLike = "'%" & ProcessPath & "%'"   
End Function
'----------------------------------------------------------------------------------------------------------------
Function OSLang()
    Dim dtmConvertedDate,strComputer,objWMIService,oss,os
    Set dtmConvertedDate = CreateObject("WbemScripting.SWbemDateTime")
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set oss = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem")
    For Each os in oss
        OSLang = os.OSLanguage
    Next
End Function
'----------------------------------------------------------------------------------------------------------------
Function Lang()
Dim MsgFR,MsgEN

MsgFR = Array("Verrouillage automatique en cas d'inactivité " ,"ATTENTION ! Il y a une autre instance en cours d'exécution !",_
"Attention ! Votre Session va être verrouillé dans 20 secondes !`n`n Voulez-vous confirmer le Verrouillage de votre session ?","`n`n OUI ou NON ?")

MsgEN = Array("Automatic Lock Session On Idle TimeOut ","ATTENTION ! There is another instance running !",_
"Warning ! Your Session will be locked in 20 seconds !`n`n Do you want to confirm the Locking of your session ?","`n`n YES or NO ?")

'Vérifiez si le système est français pour définir le tableau français comme message, sinon définissez-le comme anglais
'Check if the system is french to set the French array as message otherwise set it as English

If Oslang = 1036 Then
    Lang = MsgFR ' French Array Message to be set
Else
    Lang = MsgEN ' English Array Message to be set
End If
End Function
'----------------------------------------------------------------------------------------------------------------

решение3

Просто скопируйте и вставьте это в свой bat:

call timeout /t 1800 && Rundll32.exe user32.dll,LockWorkStation

И если вы хотите, чтобы ваша бита бегала бесшумно, следуйтеэто руководствоперед добавлением его в Планировщик заданий

решение4

Спасибо за все ваши ответы, каждый из вас дал мне кусочек для работы. Вот полный ответ:

$i = 0
$sTime = 0;
$day = (Get-Date).DayOfWeek

if ($day -match "Saturday|Sunday") {
    $sTime = 6000
} else {
    <#Whatever you need to do#>
}

Write-Host "Screen time allocation on a $day : $sTime"

while($i -ne $sTime)
{
    $remainSTime = $sTime - $i
    $ts =  [timespan]::fromseconds($remainSTime)
    Write-Host $ts
    Start-Sleep -Seconds 1
    $i++
}
Rundll32.exe user32.dll,LockWorkStation

Вот полный ответ. Ответ @Hackoo был хорош, но скрипт vbs был невероятно многословным и трудным для понимания. Как пользователь, обеспокоенный безопасностью, я решил просто попытаться понять скрипт :)

Связанный контент