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

Я пишу простой скрипт, который будет использоваться для удаления профилей пользователей старше 90 дней. Я могу запечатлеть нужные мне профили, но когда дело доходит до "хлеба с маслом", я в тупике.

Мой код:

$localuserprofiles = Get-WmiObject -Class Win32_UserProfile | Select-Object localPath,@{Expression={$_.ConvertToDateTime($_.LastUseTime)};Label="LastUseTime"}| Where{$_.LocalPath -notlike "*$env:SystemRoot*"} #Captures local user profiles and their last used date
$unusedday = 90 # Sets the unused prifile time threshold
$excludeduserpath = $excludeduser.LocalPath # Excludes the DeltaPC user account
$profilestodelete = $LocalUserProfiles | where-object{$_.lastusetime -le (Get-Date).AddDays(-$unusedday) -and $_.Localpath -notlike "*$excludeduserpath*"} #Captures list of user accounts to be deleted

#Deletes unused Profiles

Foreach($deletedprofile in $profilestodelete)
    {
        $deletedprofile.Delete()
    }

Код возвращает эту ошибку:

Method invocation failed because [Selected.System.Management.ManagementObject] does not contain a method named 'Delete'. 
At line:3 char:13 
+ $deletedprofile.Delete()} 
+ ~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo : InvalidOperation: (Delete:String) [], RuntimeException 
    + FullyQualifiedErrorId : MethodNotFound

2 ответа

Поскольку вы получаете объекты WMI, вы можете использовать Remove-WMIObject командлет.

Таким образом, простое изменение цикла удаления, как это, должно правильно и полностью удалить нужные профили:

Foreach($deletedprofile in $profilestodelete)
    {
        Remove-WMIObject $deletedprofile
    }

Там не определено ни одного Delete() метод пользовательского объекта $deletedprofile, использование

Foreach($deletedprofile in $profilestodelete)
    {
        $aux = Get-Item $deletedprofile.localPath
        $aux.Delete()
    }

или просто

Foreach($deletedprofile in $profilestodelete)
    {
        (Get-Item $deletedprofile.localPath).Delete()
    }

Вам может понадобиться указать .Delete($true):

PS C:\Windows\system32> Get-Item  $profilestodelete[0].localPath | Get-Member -Name Delete


   TypeName: System.IO.DirectoryInfo

Name   MemberType Definition
----   ---------- ----------
Delete Method     void Delete(), void Delete(bool recursive)

редактировать

Как отметил Марк Врагг, нельзя рекомендовать просто удалить каталог профиля пользователя, поскольку это не приводит к удалению данных, связанных с профилем, из реестра. См. Также исчерпывающую статью " Удаление локального профиля пользователя" - не так просто, как мог бы предположить Хельге Кляйн (автор delprof2 инструмент).

Тем не менее, есть чистый скрипт PowerShell, содержащий функцию (Remove-UserProfile), который используется для удаления профилей пользователей и дополнительного содержимого каталога C:\Users (если указан) на локальном компьютере по адресу gallery.technet.microsoft.com:Remove-UserProfile - Удалить локальные профили пользователей и очистить C:\Users Directory

По другому ответу, нет Delete() метод для профилей пользователей, предоставляемых WMI. Хотя вы можете просто удалить каталог профиля, это, как правило, не рекомендуется, поскольку вы оставляете после себя другие биты данных (например, записи в реестре) и могут вызвать проблемы со входом этих пользователей, если они впоследствии повторно войдут в систему.

Существует бесплатный сторонний инструмент под названием delprof2.exe: https://www.sepago.com/blog/2011/05/01/new-free-delprof2-user-profile-deletion-tool

Я лично не использовал это, так что используйте с осторожностью, но, похоже, уже есть возможность удалить профили, которые были неактивны в течение x дней, например:

Delprof2 /d:90

Теперь, что произойдет, если вы просто удалите каталог профиля пользователя ниже C:\Users без изменения реестра? В следующий раз, когда пользователь входит в систему Windows, появляется всплывающая подсказка, в которой говорится, что Windows не может загрузить профиль пользователя и что пользователь вошел в систему с временным профилем. Это плохо? Да! Временные профили являются последним средством, если Windows не может загрузить профиль пользователя. При выходе они удаляются и все данные теряются. Это, безусловно, причина, чтобы избежать их.

Другие вопросы по тегам