Некоторые картинки не загружаются из РФ и РК, используйте VPN.

суббота, 9 сентября 2023 г.

Удаление данных пользователя при выходе

Google Chrome (да и большинство браузеров) можно настроить так, что при закрытии он удаляет все данные работы, как инкогнито, но не инкогнито (читай тут). Встала задача провернуть такое же с учеткой Windows.

Сразу, это длинопост, в котором нет конкретного решения, есть мой путь к моему решению в самом конце

Обязательный профиль (подробнее тут) не подходит, так как профиль вычищается только повторном входе, а не выходе пользователя. Данный вариант готовился без sysprep, только переименовывание ntuser.dat в ntuser.man. 

Вариант с поломкой реестра пользователя (банальное перемещение файла ntuser.dat или переименовывание/удаление каталога пользователя) и работа с временным профилем провальна по той же причине.

На данный момент видится только комбо, и с временным профилем он реализуем проще, нежели с обязательным профилем. Используем временный профиль + задачу в планировщике. Задача в планировщике должна реагировать на событие. К сожалению с временным профилем события с кодом 4647 не создаются, придется цепляться за событие 4634. Проблема у данного события в том, что оно возникает неоднократно и не всегда после полного выхода пользователя. Плюс к этому отловить планировщиком именно определенного пользователя сложно. Я решил подойти к вопросу с другой стороны - проверяем список вошедших пользователей, если его нет, то грохаем каталог. Таймаут нужно подобрать или исключить его. Также задержку можно добавить в сам триггер.

timeout 60 && (whoami|findstr owner ||(rmdir /S /Q C:\users\TEMP))

Но в этом варианте есть косяк, если произойдет глюк и будет создан каталог TEMP.*, то скрипт не сможет его удалить. Вот это удивительно, коротким скриптом cmd я не знаю как удалить каталоги содержащие в имени паттерн (dir /b + findstr in if in for решит проблему). Поэтому решил на PowerShell и выглядеть это будет так

if (-not (Get-WmiObject -Class Win32_ComputerSystem | Select UserName | where -Property UserName -match "owner") ) {Remove-Item C:\users\*temp* -Recurse -Force}

записываем в bat или ps1 файл и добавляем в планировщик задач, я назвал auto_erase.ps1 и поместил в C:\Windows\System32\. Для PowerShell скрипт вызываем так или меняем ExecutionPolicy на Unrestricted, что не бэст практикс:

powershell -NoProfile -ExecutionPolicy Bypass -File "C:\Windows\System32\auto_erase.ps1"

Самое главное - настройки самой задачи:

  • Запуск от имени системы
  • При наличии экземпляра ставим в очередь, создается не одно событие, какое из них истинно?
  • В разделе условия - питание снимаем "Запускать только при питании от электросети"
Пока тестировал, вылез косяк - система автоматом перезагружается в последнюю учетку, никакие стандартные настройки не отключают автовход, помогло только ковыряние в реестре:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\UserSwitch
Параметр Enabled ставим 1
В разрешениях для ветки ставим запрет на установку параметра для СИСТЕМА (SYSTEM set value deny). Придется отключить наследование.

И выяснил что событие 4647 вызывается при завершении работы ПК, а не при любом logoff. Также выяснил что в планировщике задач можно использовать свой фильтр событий, из чего родился вот такой фильтр:

<QueryList>
  <Query Id="0" Path="Security">
    <Select Path="Security">*[System[(EventID=4647 or EventID=4634)] and EventData[Data[@Name='TargetUserName'] and (Data='owner')]]</Select>
  </Query>
</QueryList>

Фильтруем по коду события и пользователю, уменьшая таким образом количество запусков. К сожалению задача запускается слишком поздно. Возникает ошибка с кодом 2147943515 (0X8007045B)

К сожалению мне не удалось обойти эту ошибку, приходит в голову только принудительная задержка перезагрузки (не знаю как) или:

  • отключение кнопок выключения (GPO)
  • добавление собственного сценария (батника) выключения с предварительным удалением каталогов
  • Ярлык выводим на рабочий стол через общие папки (C:\Users\Public\Desktop), т.о. каждый новый вход будет сопровождаться выводом на рабочий стол кнопки выключения
Выясняется, что в Windows 10 по прежнему нельзя выполнить выключение или перезагрузку из консоли без прав администратора Я не удалил кнопки, а установил запрет на выключение. Удаляем кнопки так:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PolicyManager\default\Start\HideShutDown
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PolicyManager\default\Start\HideRestart
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PolicyManager\default\Start\HideSleep
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PolicyManager\default\Start\HideHibernate
Параметр Value установить в 1

Ну этот вариант тоже не идеален, т.к. часть файлов остается. И тут вырастает комбо:

  • Создаем пользователя, помещаем его в группу Гости
  • Ломаем профиль удалением каталога пользователя
  • Скрываем кнопки выключения
  • Создаем скрипт, который будет генерировать событие с кодом 666, и выполнять выход из системы. Первый раз команду добавления нужно выполнить от администратора
eventcreate /ID 666 /L APPLICATION /T INFORMATION  /SO MYEVENTSOURCE /D "Shutdown me"
shutdown -l -f
  • Ярлык с иконкой выключения кидаем через Public всем на рабочий стол
  • Добавляем задачу с триггером на событие 666, с условиями
    • запуск от SYSTEM
    • выполнить с наивысшими правами
    • в триггере на событие добавляем таймаут 1 минуту (для завершения сеанса пользователя)
    • в условиях снять "запускать только при питании от компьютера"
    •  запуск программы на powershell, которая удалит данные и отправит команду выключения
    • выполнить скрипт, где указываем удалить определенный каталог и выключить/перезагрузить компьютер
Как то так,  понятно, что и здесь все не идеально:
  • никто не мешает закрыть крышку и тем самым отправить ноутбук в сон (запрещаем такое делать, ставим пароль на учетку)
  • никто не мешает вырубить кнопкой или выдернуть аккумулятор
    • если зайти в учетку повторно, то данные удалятся, так как это учетка гостя и временная
    • если выдернуть диск, то с него можно забрать интересующие нас данные
  • Ну и так далее

Комментариев нет:

Отправить комментарий