The following PowerShell code is designed to reset both the local and network profile (on any number of PCs). Without PowerShell such a task is cumbersome as you need to connect to the C: drive of a PC, navigate to the 'Users' folder, check said user is logged off before renaming/deleting this folder, clear the relevant Registry key for that user ...... repeat this for each PC. Then connect to your network profile share and rename/delete the users folder.
The tool below can do all of this from the PowerShell console within a few keystrokes. It can ultimately be incorporated as a module too.
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
function Invoke-ProfileReset {
<#
.SYNOPSIS
Removes network & local user profile.
.DESCRIPTION
Invoke-ProfileReset deletes the network profile of a given user.
It also renames the local user profile on a given PC.
.PARAMETER User
Username of the profile the remove.
.PARAMETER ComputerName
Name of PC(s) to remove local user profile from.
.PARAMETER LogErrors
Specify this switch to create a text log file of the PC
that could not be updated.
.PARAMETER ErrorLog
When used with -LogErrors, specifies the file path and name
to which the failed PC will be written. Defaults to
current Powershell directory.
.EXAMPLE
Invoke-ProfileReset -ComputerName pc123 -User abc123
.EXAMPLE
Invoke-ProfileReset -ComputerName pc123, pc456 -User abc123 -Verbose
#>
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True,
ValueFromPipeline=$True,
HelpMessage="Username of account")]
[Alias('Username')]
[string[]]$User,
[Parameter(Mandatory=$True,
ValueFromPipeline=$True,
HelpMessage="Computer name")]
[string[]]$ComputerName,
[string]$ErrorLog = (Get-Location).Path,
[switch]$LogErrors
)
BEGIN {
Write-Verbose "Error log will be $ErrorLog"
}
PROCESS {
Write-Verbose 'Beginning PROCESS block'
#LOCAL PROFILE
ForEach ($Computer in $ComputerName) {
Write-Verbose "Checking user profile exists on $Computer"
#Check if profile exists on remote PC
If ($Profile = Get-WmiObject -Class win32_userprofile -ComputerName "$Computer" | Where-Object {($_.LocalPath -like "*$User*")}) {
Write-Verbose "$User profile exists on $Computer"
#Check user not logged on
If ($Profile | Where-Object {($_.Loaded -eq $false)}) {
#Change name of current 'User' folder to today's date/time
$Date = Get-Date -F "dd_MM_yyyy HH_mm_ss"
Rename-Item -Path "\\$Computer\C$\Users\$User" -NewName "$User.old $Date"
Write-Host "$User profile folder has successfully been renamed to `'$User.old DATE`' on $Computer" -ForegroundColor Green
#Remove user Registry key
$Profile | Remove-WmiObject
Write-Host "$User Registry key has successfully been removed on $Computer" -ForegroundColor Green
}
Else {
Write-Host "$User is still logged on to $Computer" -ForegroundColor Red
}
}
Else {
Write-Host "$User profile not found on $Computer" -ForegroundColor Red
}
}
#NETWORK PROFILE
#Display prompt to the user asking if they also wish to reset the network profile
$NetworkCheck = Read-Host -Prompt "Would you like to reset the network profile for this user? (Y/N)"
#If they select Yes - 'Y'
If ($NetworkCheck -eq 'Y') {
Try {
$everything_ok = $true
#Check User profile path exists
If (!(Test-Path -Path ($NetworkProfile = "\\userfs2\profiles\$User\Windows_NT.V6"))) {
Write-Warning "$NetworkProfile not found"
$everything_ok = $false
}
} Catch {
$everything_ok = $false
If ($LogErrors) {
$Computer | Out-File $ErrorLog -Append
Write-Warning $_.Exception.Message
}
}
If ($everything_ok) {
Write-Verbose "Proceeding to delete $User network profile"
#Delete profile file and contents
Get-ChildItem -Path "$NetworkProfile" -Force -Recurse | Remove-Item -Recurse -Force
#Pause for a couple of seconds to complete task
Start-Sleep -Seconds 4
Write-Host "$NetworkProfile successfully cleaned" -ForegroundColor Green
}
}
Else {
Write-Verbose 'Network profile reset not requested'
}
Write-Verbose 'End of PROCESS block'
}
END {}
}
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Network Profile Reset.ps1
No comments:
Post a Comment