У меня есть сетевой ресурс на компьютере с Windows Server 2012, который используется для хранения всех файлов профилей пользователей (Мои документы, Рабочий стол и т. д.).
Мне нужно избавиться от сотен старых пользователей, и я просматриваю их всех по одному... сначала делаю администратора владельцем всех файлов одного пользователя... затем предоставляю полный контроль над всеми файлами этого пользователя администратору... затем удаляю файлы этого пользователя... затем перехожу к следующему пользователю.
Это займет несколько дней.
В этом же каталоге есть много действительных/текущих пользовательских файлов, владельцем которых я не хочу становиться или удалять их.
Есть ли менее трудоемкий способ удаления определенных папок в этом сетевом ресурсе?
Какой-то скрипт, который я могу ввести для всех старых пользователей и просто дать ему возможность делать свое дело в течение нескольких часов?
решение1
Конечно, с PowerShell возможно все! :-) Это общий процесс того, как это можно сделать.
Вы можете начать с чтения основных папок/пользователей, которых вы хотите удалить, из CSV-файла с помощью команд Import-CSV $Filename | ForEach-Object
.
Для каждой верхней папки в блоке ForEach вы можете прочитать все подпапки и файлы с расширением Get-ChildItem -Recurse
.
Затем у вас может быть второй CSV-файл с файлами или папками, которые не следует удалять, и для каждого просматриваемого файла вы можете выполнить чтение и сравнение с этим файлом, чтобы определить, следует ли его сохранить или удалить (после получения права собственности).
решение2
Мне пришлось сделать это снова, поэтому сегодня я вернулся к этому вопросу, следуя советам @PatrikN. Вот скрипт PowerShell, который я использовал:
Get-ChildItem C:\UserDocs |
ForEach-Object {
if (!(Get-ADUser -Filter "sAMAccountName -eq '$($_.Name)'")) {
"$($_.Name) does not exist and is being deleted."
takeown /a /r /d Y /f $_.FullName
$Acl = Get-Acl $_.FullName
$Acl.AddAccessRule(
(New-Object System.Security.AccessControl.FileSystemAccessRule(
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name,
"FullControl",
"ContainerInherit, ObjectInherit",
"None",
"Allow"
))
)
(Get-Item $_.FullName).SetAccessControl($Acl)
Remove-Item -LiteralPath $_.FullName -Force -Recurse
}
}
Я не стал использовать CSV-файлы.
Скрипт проходит по всем каталогам профилей пользователей, запрашивает, есть ли имя в Active Directory, если нет: становится владельцем, устанавливает полные права, затем удаляет. Работает хорошо.