Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Powershell Delete Profile script - error checking not working

I have this delete profile script that prompts for a username and deletes it from each of the computers listed. The delete profile and "user is logged in" parts are both working but the part that says “No profiles found on $Computer with Name $UserName” is not. I ran my script on two computers and it successfully deleted my profile on both. I recreated my profile (logged in) and stayed logged on to one and not the other. I run it again and it gives me the message "user is logged in". For the other computer it just deleted the profile on does not display the "no profile found" message. It just skips over it and displays nothing. I have changed the "if" to an "else" but, when I do that it displays multiple lines of "no profiles found" including the computer it previously deleted the profile on.

Here is the link where most of the script is derived from. http://techibee.com/powershell/powershell-script-to-delete-windows-user-profiles-on-windows-7windows-2008-r2/1556. Looking through the comments, no one else seemed to have any issues with that part of it.

I do not have much knowledge in PowerShell and this has just been pieced together from other scripts I have found based on our needs. Our environment is Windows 7 and Server 2008 R2. Any assistance is greatly appreciated.

$UserName=Read-host "Please Enter Username: "

$ComputerName= @("computer1","computer2")


foreach($Computer in $ComputerName) {            
 Write-Verbose "Working on $Computer"            
 if(Test-Connection -ComputerName $Computer -Count 1 -ea 0) {            
  $Profiles = Get-WmiObject -Class Win32_UserProfile -Computer $Computer -ea 0            

  foreach ($profile in $profiles) {            
   $objSID = New-Object System.Security.Principal.SecurityIdentifier($profile.sid)            
   $objuser = $objsid.Translate([System.Security.Principal.NTAccount])            
   $profilename = $objuser.value.split("\")[1]            

   if($profilename -eq $UserName) {            
    $profilefound = $true            

    try {            
     $profile.delete()            
     Write-Host -ForegroundColor Green "$UserName profile deleted successfully on $Computer"            
    } catch {            
     Write-Host -ForegroundColor Yellow "Failed to delete the profile, $UserName logged on to $Computer"            
    }            
   }            
  }            

  if(!$profilefound) {            
   Write-Host -ForegroundColor Cyan "No profiles found on $Computer with Name $UserName"            
  }            
 } else {            
  write-verbose "$Computer Not reachable"            
 }            
}
like image 652
DavidG Avatar asked Aug 16 '16 19:08

DavidG


1 Answers

PowerShell has a number of automatic variables that you should avoid re-using.

$Profile is one of these, it contains the paths to the Profile scripts applicable to the current session.

Use any other variable name (ie. $userprofile) and you'll be fine:

foreach ($userprofile in $profiles) {            
   $objSID = New-Object System.Security.Principal.SecurityIdentifier($userprofile.sid)            
   $objuser = $objsid.Translate([System.Security.Principal.NTAccount])            
   $profilename = $objuser.value.split("\")[1]            

   if($profilename -eq $UserName) {
    $profilefound = $true

    try {
     $userprofile.delete()
     Write-Host -ForegroundColor Green "$UserName profile deleted successfully on $Computer"
    } catch {
     Write-Host -ForegroundColor Yellow "Failed to delete the profile, $UserName logged on to $Computer"
    }
   }
  }
like image 158
Mathias R. Jessen Avatar answered Oct 12 '22 01:10

Mathias R. Jessen