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), т.о. каждый новый вход будет сопровождаться выводом на рабочий стол кнопки выключения
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, которая удалит данные и отправит команду выключения
- выполнить скрипт, где указываем удалить определенный каталог и выключить/перезагрузить компьютер
- никто не мешает закрыть крышку и тем самым отправить ноутбук в сон (запрещаем такое делать, ставим пароль на учетку)
- никто не мешает вырубить кнопкой или выдернуть аккумулятор
- если зайти в учетку повторно, то данные удалятся, так как это учетка гостя и временная
- если выдернуть диск, то с него можно забрать интересующие нас данные
- Ну и так далее
Комментариев нет:
Отправить комментарий