# encoding: ascii
# api: powershell
# title: Remove local profiles
# description: Remove local profiles from Windows 7 or above.
# version: 2.02
# type: script
# author: Richard Gagg
# license: CC0
# x-poshcode-id: 4026
# x-archived: 2015-10-31T01:21:28
# x-published: 2015-03-17T22:35:00
#
#
<#
.SYNOPSIS
   This is a powershell script form to remove a users local profile from a workstation and
   and gives the option to remove the users profile fromt he network.
.DESCRIPTION
   This script askes for a machine name.
   It displays all of the roaming profiles on that machine.
   The administrator selects the profile to be removed from the machine.
   The administrator selects whether the network profile is to be removed as well.
   The administrator clicks the delete button and the script removes the local profile
   and the network profile if the option was seleteced.
.NOTES
   This script must be run as with adminstrator credentials.
   Created: 08/03/13
#>

CLS

Import-Module ActiveDirectory

# Define Variables
$global:Workstation = ""


function CheckCredentials
{
	# Check Credentials
	$Credential = ([Security.Principal.WindowsIdentity]::GetCurrent()).Name
	$CredentialTest = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
	if($CredentialTest -eq $false)
	{
		[System.Windows.Forms.MessageBox]::Show("You are not an Administrator.`n`nPlease run the script with `nAdministrator credentials." , "Not an Administrator!" , 0)
		$objForm.Close()
	}
}

function TestWMIConnection
{
	# Test WMI Connection and update label
	if(!(Get-WmiObject -class "Win32_Process" -namespace "root\cimv2" -ComputerName $Workstation -ErrorAction SilentlyContinue))
	{
		$WMIConnectionLabel.ForeColor = "Red"
		$WMIConnectionLabel.Text = "WMI Connection to device is DOWN."
	}
	else
	{
		$WMIConnectionLabel.ForeColor = "Green"
		$WMIConnectionLabel.Text = "WMI Connection to device is OK."
	}
}

function GetLocalProfiles
{
		$ProfilesFoundListBox.Items.Clear()
		$ProfileDetailsRichTextBox.Text = ""
		$Profiles = ""
		
		$Profiles = @(Get-WmiObject -Class Win32_UserProfile -ComputerName $Workstation -ErrorAction SilentlyContinue | ?{$_.Status -eq "2"})
		# Profile Status values are (0, 1, 2, 4, 8) where a value of zero denotes unset or default
		# and 1 = Temporary, 2 = Roaming, 4 = Mandatory and 8 = Corrupted.
		
		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]
			$ProfilesFoundListBox.Items.Add($Profilename.ToUpper())
			$objForm.Update()
		}
}

function GetProfileDetails
{
	# Get AD Account Info
	$ADInfo = ""
	$LocalProfile = ""
	
	$ADUserID = Get-ADUser -Identity $ProfilesFoundListBox.SelectedItem -Properties *
	
	$ProfileInfo = "Active Directory Details:"
	$ProfileInfo = $ProfileInfo + "`nName    : " + $ADUserID.displayNamePrintable
	$ProfileInfo = $ProfileInfo + "`nOffice  : " + $ADUserID.Office
	$ProfileInfo = $ProfileInfo + "`nStaff ID: " + $ADUserID.EmployeeID
	$ProfileInfo = $ProfileInfo + "`nProfile : " + $ADUserID.ProfilePath
	
	# Get Local Profile Info
	$LocalProfile = Get-WmiObject -Class Win32_UserProfile -ComputerName $Workstation -ErrorAction SilentlyContinue | ?{$_.LocalPath -like "*" + $ProfilesFoundListBox.SelectedItem}
	try
	{
		$LastDownloadTime = $LocalProfile.ConvertToDateTime($LocalProfile.LastDownloadTime).ToShortDateString()
	}
	catch
	{
		$LastDownloadTime = "Never Downloaded"
	}
	$LastUsedTime = $LocalProfile.ConvertToDateTime($LocalProfile.LastUseTime).ToShortDateString()
	
	$ProfileInfo = $ProfileInfo + "`n`nLocal Profile Details:"
	$ProfileInfo = $ProfileInfo + "`nProfile Path  : " + $LocalProfile.LocalPath
	$ProfileInfo = $ProfileInfo + "`nLast Download : " + $LastDownloadTime
	$ProfileInfo = $ProfileInfo + "`nLast Used     : " + $LastUsedTime
	$ProfileInfo = $ProfileInfo + "`nIs Loaded     : " + $LocalProfile.Loaded
	
	$ProfileDetailsRichTextBox.Text = $ProfileInfo
	
	if($LocalProfile.Loaded -eq $true)
	{
		[System.Windows.Forms.MessageBox]::Show("The selected profile is currently loaded.`nThe profile will need to be logged off.", "Profile Loaded" , 0)
	}
	
}

function DeleteLocalProfile
{
	$ConfirmDelete = [System.Windows.Forms.MessageBox]::Show("CONFIRM`n`nDelete local profile :   " + $ProfilesFoundListBox.SelectedItem + "`nFrom Workstation  :   " + $Workstation.ToUpper() , "Local Profile Delete" , 4)
	if ($ConfirmDelete -eq "YES")
	{
		Get-WmiObject -Class Win32_UserProfile -ComputerName $Workstation -ErrorAction SilentlyContinue | ?{$_.LocalPath -like "*" + $ProfilesFoundListBox.SelectedItem} | Remove-WmiObject
		[System.Windows.Forms.MessageBox]::Show("Profile "+ $ProfilesFoundListBox.SelectedItem + " has been deleted from " + $Workstation + ".", "Profile Deleted" , 0)
	}
}

function DeleteNetworkProfile
{
	$ADUserID = Get-ADUser -Identity $ProfilesFoundListBox.SelectedItem -Properties *
	$ConfirmDelete = [System.Windows.Forms.MessageBox]::Show("CONFIRM`n`nDelete network profile :  " + $ADUserID.displayNamePrintable + "`nPath :  " + $ADUserID.ProfilePath , "Network Profile Delete" , 4)
	if ($ConfirmDelete -eq "YES")
	{
		$NetProfile = $ADUserID.ProfilePath
		$NetProfile = [string]::Join('\', $NetProfile.Split('\')[0..$($NetProfile.Split('\').Length-2)])
		Remove-Item $NetProfile -Recurse -Force
		[System.Windows.Forms.MessageBox]::Show("Network profile has been deleted.`n" + "Path :  " + $NetProfile , "Profile Deleted" , 0)
	}
	else
	{
		$objForm.Close()
	}
}

Function BuildForm
{
	[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
	[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
	[void] [System.Windows.Forms.Application]::EnableVisualStyles()
	
	$objForm = New-Object System.Windows.Forms.Form 
	$objForm.Text = "Remove Profile Tool"
	$objForm.Icon = [system.drawing.icon]::ExtractAssociatedIcon($PsHome + "\powershell.exe")
	$objForm.Size = New-Object System.Drawing.Size(550,500) 
	$objForm.StartPosition = "CenterScreen"
	$objForm.AutoSize = $True
	$objForm.AutoSizeMode = "GrowOnly" # GrowAndShrink or GrowOnly
	$objForm.AutoScroll = $True
	$objForm.MinimizeBox = $true
	$objForm.MaximizeBox = $False
	$objForm.WindowState = "Normal" # Maximized, Minimized, Normal
	$objForm.SizeGripStyle = "Hide" # Auto, Hide, Show
	$objForm.ShowInTaskbar = $true
	$objForm.Topmost = $True
	$objFormFont1 = New-Object System.Drawing.Font("Arial",24,[System.Drawing.FontStyle]::Regular)          # Form title font
	$objFormFont2 = New-Object System.Drawing.Font("Arial",10,[System.Drawing.FontStyle]::Regular)          # Form font
	$objFormFont3 = New-Object System.Drawing.Font("Consolas",10,[System.Drawing.FontStyle]::Regular)       # Fixed width font
#	$objFormFont3 = New-Object System.Drawing.Font("Lucida Console",10,[System.Drawing.FontStyle]::Regular) # Second fixed width font

	# Font styles are: Regular, Bold, Italic, Underline, Strikeout
	$objForm.Font = $objFormFont2 # Applies font to whole form
	
	$objForm.KeyPreview = $True
#	$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter"){$x=$objTextBox.Text;$objForm.Close()}})
	$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape"){$objForm.Close()}})
	
	# Form Objects
	# Check Credentials
	CheckCredentials
	
	#Form Title
	$FormTitleLabel = New-Object System.Windows.Forms.Label
	$FormTitleLabel.Location = New-Object System.Drawing.Size(10,10)
	$FormTitleLabel.Autosize = $true # = New-Object System.Drawing.Size(650,40)
	$FormTitleLabel.Font = $objFormFont1
	$FormTitleLabel.Text = "Profile Removal Tool"
	$objForm.Controls.Add($FormTitleLabel)
	
	
	#Get Workstation Name
	$GetWorkstationNameLabel = New-Object System.Windows.Forms.Label
	$GetWorkstationNameLabel.Location = New-Object System.Drawing.Size(10,70)
	$GetWorkstationNameLabel.Size = New-Object System.Drawing.Size(140,20)
	$GetWorkstationNameLabel.Text = "Enter Machine Name"
	$objForm.Controls.Add($GetWorkstationNameLabel)
	
	$GetWorkstationNameTextBox = New-Object System.Windows.Forms.TextBox
	$GetWorkstationNameTextBox.Location = New-Object System.Drawing.Size(155,69) # Count as (160,70) -1 to align text box
	$GetWorkstationNameTextBox.Size = New-Object System.Drawing.Size(140,20)
	$objForm.Controls.Add($GetWorkstationNameTextBox)
	
	$GetWorkstationNameButton = New-Object System.Windows.Forms.Button
	$GetWorkstationNameButton.Location = New-Object System.Drawing.Size(305,69) # Count as (305,70) -1 to align button
	$GetWorkstationNameButton.Size = New-Object System.Drawing.Size(75,23)
	$GetWorkstationNameButton.Text = "OK"
	$GetWorkstationNameButton.Add_Click(
	{
		$Workstation = $GetWorkstationNameTextBox.Text.ToUpper()
		
		# Update profiles found label
		$ProfilesFoundLabel.Text = "Profiles found on " + $Workstation
		$objForm.Controls.Add($ProfilesFoundLabel)
		
		# Test WMI Connection
		TestWMIConnection
		
		# Get local profiles
		GetLocalProfiles		
	})
	$objForm.Controls.Add($GetWorkstationNameButton)
	
	#WMI Connection Status
	$WMIConnectionLabel = New-Object System.Windows.Forms.Label
	$WMIConnectionLabel.Location = New-Object System.Drawing.Size(10,115)
	$WMIConnectionLabel.Size = New-Object System.Drawing.Size(280,20)
	$WMIConnectionLabel.Text = "WMI Connection to device is..."
	$objForm.Controls.Add($WMIConnectionLabel)
	
	# Found Profiles
	$ProfilesFoundLabel = New-Object System.Windows.Forms.Label
	$ProfilesFoundLabel.Location = New-Object System.Drawing.Size(10,150)
	$ProfilesFoundLabel.Size = New-Object System.Drawing.Size(280,20)
	$ProfilesFoundLabel.Text = "Profiles found on..."
	$objForm.Controls.Add($ProfilesFoundLabel)

	$ProfilesFoundListBox = New-Object System.Windows.Forms.ListBox
	$ProfilesFoundListBox.Location = New-Object System.Drawing.Size(10,180)
	$ProfilesFoundListBox.Size = New-Object System.Drawing.Size(280,200)
	$ProfilesFoundListBox.Text = "Found Profiles"
	$ProfilesFoundListBox.Add_Click(
	{
		GetProfileDetails
	})
	$objForm.Controls.Add($ProfilesFoundListBox)
	
	# Profile Details
	$ProfileDetailsLabel = New-Object System.Windows.Forms.Label
	$ProfileDetailsLabel.Location = New-Object System.Drawing.Size(305,150)
	$ProfileDetailsLabel.Size = New-Object System.Drawing.Size(280,20)
	$ProfileDetailsLabel.Text = "Profile Details"
	$objForm.Controls.Add($ProfileDetailsLabel)

	$ProfileDetailsRichTextBox = New-Object System.Windows.Forms.RichTextBox
	$ProfileDetailsRichTextBox.Location = New-Object System.Drawing.Size(305,180)
	$ProfileDetailsRichTextBox.Size = New-Object System.Drawing.Size(280,200)
	$ProfileDetailsRichTextBox.Font = $objFormFont3
	$ProfileDetailsRichTextBox.ForeColor = "DarkGreen"
	$objForm.Controls.Add($ProfileDetailsRichTextBox)
	
	# Delete network profile checkbox
	$DeleteNetProfileCheckBox = New-Object System.Windows.Forms.CheckBox
	$DeleteNetProfileCheckBox.Location = New-Object System.Drawing.Size(10,390) 
	$DeleteNetProfileCheckBox.Size = New-Object System.Drawing.Size(280,20) 
	$DeleteNetProfileCheckBox.Text = "Include Network Profile in Delete"
	$DeleteNetProfileCheckBox.ForeColor = "Red"
	$objForm.Controls.Add($DeleteNetProfileCheckBox) 
	
	# Delete button
	$DeleteButton = New-Object System.Windows.Forms.Button
	$DeleteButton.Location = New-Object System.Drawing.Size(10,430)
	$DeleteButton.Size = New-Object System.Drawing.Size(135,23)
	$DeleteButton.Text = "Delete"
	$DeleteButton.BackColor = "Red"
	$DeleteButton.Forecolor = "White"
	$DeleteButton.Add_Click(
	{
		DeleteLocalProfile
		
		if($DeleteNetProfileCheckBox.Checked)
		{
			DeleteNetworkProfile
		}
		
		# Update profile info
		GetLocalProfiles

	})
	$objForm.Controls.Add($DeleteButton)
	
	$ExitButton = New-Object System.Windows.Forms.Button
	$ExitButton.Location = New-Object System.Drawing.Size(155,430)
	$ExitButton.Size = New-Object System.Drawing.Size(135,23)
	$ExitButton.Text = "Exit"
	$ExitButton.Add_Click({$objForm.Close()})
	$objForm.Controls.Add($ExitButton)
	
	# Status Line
	$StatusLineLabel = New-Object System.Windows.Forms.Label
	$StatusLineLabel.Location = New-Object System.Drawing.Size(415,430) 
	$StatusLineLabel.Size = New-Object System.Drawing.Size(180,40) 
	$StatusLineLabel.Text = "Version       : 2.02"
	$objForm.Controls.Add($StatusLineLabel) 

	# Show Form
	$objForm.Add_Shown({$objForm.Activate()})
	[void] $objForm.ShowDialog()
} # End Function


# Application Start
BuildForm
