Управление постоянными профилями пользователей: индивидуальный подход

Опубликовано: 17 Марта, 2023
Управление постоянными профилями пользователей: индивидуальный подход

Индивидуальное решение Марка Ван Ноя

Изображение 4510 «Для наших физических лабораторий самым чистым решением было удаление профилей всякий раз, когда кто-то выходил из компьютера. Однако в Windows 7 и более поздних версиях не было решения, которое могло бы это сделать. В итоге мы написали собственную службу на C#, которая удаляет профили при выходе из системы. Для упрощения администрирования мы используем конфигурационный файл, который сервис считывает при запуске и содержит список учетных записей, которые нельзя удалять. Мы помещаем наши административные учетные записи в файл конфигурации, оставляя наши учетные записи с наименьшими привилегиями вне конфигурации, чтобы наши профили сохранялись, когда используются административные входы в систему, и у нас был тот же опыт, что и у наших конечных пользователей при использовании нашего обычного повседневного использования. дневные счета.

«Служба хорошо работала для Windows 7. Поскольку это была служба, она могла удалять учетные записи пользователей, так как на самом деле никто не входил в систему, чтобы заблокировать какие-либо файлы, такие как NTUSER.dat, которые в противном случае предотвратили бы удаление профиля. удален. Служба работает как СИСТЕМА, поэтому потребовалось немного программной индукции, чтобы определить учетную запись пользователя и профиль пользователя, который в данный момент входит в систему, поскольку API Microsoft предоставляет для определения вошедшего в систему пользователя, предполагая, что вызовы поступают из учетной записи пользователя. обсуждаемый. Поэтому они сообщают, что СИСТЕМА вошла в систему. Служба отслеживает события входа и выхода, чтобы сопоставить, когда конкретный пользователь вышел из системы и его профиль должен быть удален. Затем он удаляет записи реестра, связанные с этим пользователем за пределами HKLM, и ждет, пока блокировка NTUSER.dat пользователя не будет снята, прежде чем удалять папку профиля.

«Мы пропустили Windows 8/8.1 по разным причинам только для того, чтобы обнаружить, что наша служба больше не удаляет профили при выходе из системы, несмотря на то, что служба работает в Windows 10. Изучение журналов, созданных службой, показало нам, что служба пытается чтобы удалить профиль, но недавно добавленные файлы оставались заблокированными после того, как пользователи вышли из системы, и служба перестала работать. Поскольку мы не хотели рисковать тем, что процесс удаления профиля заблокирует последующие входы в систему, мы не чувствовали, что можем просто ждать службы и продолжать попытки удалить профили бесконечно, пока блокировки не будут сняты.

«Нашим решением было добавить потоки в сервис. Теперь, когда происходит выход из системы, служба создает поток для удаления своего профиля. Когда человек входит в систему, служба отправляет свое собственное внутреннее событие всем дочерним потокам, которые могут быть запущены, сообщая им имя входа пользователя, который только что вошел в систему. Дочерние потоки сравнивают отправленное им имя пользователя с именем пользователя профиля. они пытаются удалить, и если имена совпадают, дочерний поток завершается, потому что мы действительно не хотим, чтобы какая-то часть активного профиля была удалена, пока он используется. Если дочерний поток не будет прерван, он продолжит попытки удалить профиль в течение 10 минут. Служба просто спит в течение 10 секунд после того, как обнаружит ошибку блокировки файла, а затем повторит попытку, пока она либо больше не столкнется с заблокированными файлами и не удалит профиль, либо пока не истечет 10 минут. Мы обнаружили, что удаление профиля в Windows 10 на современном компьютере с процессором Skylake и быстрым SSD-накопителем NVMe может занять до пяти минут.

«Нам нужно было значительно усложнить сервис, который мы написали, чтобы учесть особенности Windows 10. Однако побочным эффектом стало то, что сервис на самом деле стал более надежным и последовательным при удалении профилей, чем когда-либо прежде. Единственный раз, когда мы видим зависание профилей, которые в противном случае не должны быть постоянными, — это когда происходит отключение питания, которое выключает компьютер без фактического выхода человека из системы. Ясно, что служба не может удалить профиль, если нет события выхода из системы. В целом, мы очень довольны результатами, которые дает наш сервис, и весит он всего 23 КБ».

Исходный код

Марк любезно предоставил нам исходный код пользовательского решения, которое он описал здесь, во второй части нашей статьи, состоящей из двух частей, чтобы любой читатель, заинтересованный в попытке реализовать его, мог протестировать и/или настроить его решение. Эти файлы исходного кода доступны для загрузки в виде заархивированного файла здесь.

Марк также прислал нам следующее примечание относительно этих дополнительных файлов:

Я прикрепил заархивированную версию службы, которая включает в себя небольшой установочный файл CMD, а также некоторую документацию о том, как использовать его в Word и в обычном тексте. Я не обновлял документацию с 2011 года, но она все равно должна быть точной, так как прошлогодние изменения не изменили интерфейс. Я также включил исходный код C# в качестве вложения в файл конфигурации Visual Studio для проекта. Остальные файлы, используемые в проекте, должны создаваться Visual Studio автоматически, если кто-то захочет воссоздать мою работу.

Обратите внимание, что эти загружаемые файлы представлены «как есть», без каких-либо гарантий и предложений по оказанию какой-либо поддержки, поэтому используйте и настраивайте их на свой страх и риск.