Friday, 30 November 2018

Network profile reset

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