Что нового

Выгрузка/загрузка процессов текущего пользователя

lognik

Новичок
Сообщения
7
Репутация
0
Всем привет!
Версия AutoIt: v3.3.14.5
Примечания: Windows 8.1 x64
Описание:
Нужен скрипт "заморозки" (suspend) всех процессов текущего пользователя с выгрузкой их рабочего набора (выгрузкой из памяти), и второй - для их "разморозки"
Проще говоря нужно чтобы при блокировке пользователя (перелогине) все его процессы приостанавливались и выгружались, а при активации пользователя активизировались. Умеет ли вообще такое Autoit? )
Сообщение автоматически объединено:

Предыстория:
Недавно приобретя SSD и установив на него файл подкачки ожидаемо заметил прибавку к многозадачности уже от этого (не говоря уже о том если всю систему установить на SSD). Можно открывать по несколько "тежеловесных приложений" или по 150 вкладок в браузере и легко и быстро между ними переключаться. Попутно обнаружился еще один плюс - безпроблеммная "заморозка"/"разморозка" любых приложений, а также выгрузка (и последующая загрузка) их из пмяти. Любая, программа, игра - спокойно входит в "suspend", выгружается и также легко "просыпается" вновь. На сколько помню в XP была уже такая фишка, но вызывала глюки, в 8.1 работает на ура, в Win 7 несколько по своему, но также работает. Т.е., используя это, прибавка к многозадачности может быть еще более значимая. Всвязи с этим появилась идея данного скрипта. Думаю многие могут отметить ситуациии в которой это могло быть применимо.
 
Последнее редактирование:

chery

Новичок
Сообщения
5
Репутация
0
Да, AutoIt может использоваться для "заморозки" (приостановки) и "разморозки" (возобновления) процессов. Вам потребуется использовать функции AutoIt для работы с процессами и некоторые Windows API. Вот пример скрипта для "заморозки" и "разморозки" процессов текущего пользователя:

Код:
; Приостановить все процессы текущего пользователя
Func SuspendProcesses()
    Local $aProcesses = ProcessList()
    Local $iCurrentUserId = _GetCurrentUserId()

    For $i = 1 To $aProcesses[0][0]
        Local $iProcessId = $aProcesses[$i][1]
        Local $iProcessUserId = _GetProcessUserId($iProcessId)

        If $iProcessUserId = $iCurrentUserId Then
            ProcessSuspend($iProcessId)
        EndIf
    Next
EndFunc

; Возобновить все процессы текущего пользователя
Func ResumeProcesses()
    Local $aProcesses = ProcessList()
    Local $iCurrentUserId = _GetCurrentUserId()

    For $i = 1 To $aProcesses[0][0]
        Local $iProcessId = $aProcesses[$i][1]
        Local $iProcessUserId = _GetProcessUserId($iProcessId)

        If $iProcessUserId = $iCurrentUserId Then
            ProcessResume($iProcessId)
        EndIf
    Next
EndFunc

; Получить идентификатор текущего пользователя
Func _GetCurrentUserId()
    Return _GetProcessUserId(@AutoItPID)
EndFunc

; Получить идентификатор пользователя процесса
Func _GetProcessUserId($iProcessId)
    Local $hProcess, $hToken, $tTokenUser, $tSID, $iSize

    $hProcess = _WinAPI_OpenProcess(0x0200, False, $iProcessId)
    _WinAPI_OpenProcessToken($hProcess, 0x0008, $hToken)
    _WinAPI_GetTokenInformation($hToken, 1, $tTokenUser, $iSize)
    _WinAPI_CloseHandle($hToken)
    _WinAPI_CloseHandle($hProcess)

    $tSID = DllStructCreate("ptr", DllStructGetData($tTokenUser, "Sid"))
    Return _WinAPI_GetSidIdentifierAuthority($tSID)
EndFunc


Вы можете использовать функции SuspendProcesses() и ResumeProcesses() для "заморозки" и "разморозки" процессов текущего пользователя. Обратите внимание, что этот скрипт не выгружает рабочий набор процессов из памяти, а только приостанавливает их. Если вам действительно нужно выгрузить рабочий набор из памяти, вам, возможно, придется использовать дополнительные Windows API для этого.

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