Get-PC/Private/WinProfileRebuild.ps1
Zachary Gorman 4a01da0e5d Init commit
2024-06-11 11:27:55 -07:00

249 lines
7.9 KiB
PowerShell

Function Get-WinProfileRebuild($ComputerName) {
Write-Host "`n"
$AllUsers = Invoke-Command -ComputerName $ComputerName -SessionOption (New-PSSessionOption -NoMachineProfile) -ScriptBlock {
Get-ChildItem -Path C:\Users -Directory -Force -Exclude Public, Default, 'Default User', 'All Users' |
Sort-Object -Property LastWriteTime -Descending | Select-Object -First 10 -ExpandProperty Name }
Write-Host "User Profiles Found (Only displaying newest 10 profiles): $AllUsers"
Write-Host "`nThis utility will recreate the user's Windows profile.`nThe profile folder will be preserved and renamed to 'username.backup'`n"
$UserProfile = Read-Host "Enter Username to recreate Windows user profile"
$restore = Read-Host "Confirm Rebuild(y/n) or restore(r)"
if ($restore -eq 'r') {
Invoke-WinProfileRebuildRestore -Username $UserProfile -Computername $ComputerName
return
}
elseif ($restore -ne 'y') {
Write-Host "Canceling WinProfileRebuild..." -ForegroundColor Yellow
return
}
$UserSid = get-wmiobject -computername $ComputerName -class win32_userprofile | select-object -property sid, localpath |
where-object -property localpath -EQ "C:\Users\$UserProfile" | select-object -expandproperty sid
$path = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$UserSid"
$UserName = (Get-CimInstance -Class win32_computersystem -ComputerName $ComputerName).UserName
if ($UserProfile -eq $env:USERNAME) {
Write-Host "You cannot rebuild your own user profile..." -ForegroundColor Yellow
Return
}
if ($null -ne $UserName) {
if ($UserName -eq $UserProfile) {
$IsUserNameNotEmpty = 0 #Target user is currently logged in
}
elseif ($UserName -eq $env:USERNAME) {
$IsUserNameNotEmpty = 1 #Can rebuild if you are the one logged into the computer
}
else {
$IsUserNameNotEmpty = 1 #Other user logged in
}
}
else {
$IsUserNameNotEmpty = 1 #No User is logged in
}
if ($null -ne $UserSid) {
$IsSIDNotEmpty = 0 #User Sid exists
}
else {
$IsSIDNotEmpty = 1 #User Sid not found
}
Switch ($IsUserNameNotEmpty) {
0 {
Write-Host "`n$UserName is currently logged in, please have them logout..." -ForegroundColor Yellow
Write-Host "`n`nScript will now exit, please retry once user has logged off...`n" -ForegroundColor Yellow
Return
}
1 {
Write-Host "Proceed in rebuilding user profile..." -ForegroundColor Yellow
Pause
Break
}
Default {
Write-Host "ERROR WinProfileRebuild.psm1 Line 74" -ForegroundColor Red
Pause
Return
}
}
Switch ($IsSIDNotEmpty) {
0 {
$GetTime = Get-Date -Format "MMddHHmmss"
Invoke-Command -ComputerName $ComputerName -SessionOption (New-PSSessionOption -NoMachineProfile) -ScriptBlock {
Rename-Item -Path "C:\Users\$Using:UserProfile" -NewName "$Using:UserProfile.backup.$Using:GetTime" -Force -Verbose
#Write-Host "C:\Users\$Using:UserProfile"
if (Test-Path "C:\Users\$Using:UserProfile.backup.$Using:GetTime" ) {
Write-Host "Rename Successful" -ForegroundColor Green
}
else {
Write-Host "File rename failed. Please manually rename folder if registry removal succeeds" -ForegroundColor Red
}
Remove-Item $Using:path
Write-Host "$Using:UserProfile removed from registry..."
Write-Host "User can now relog into the workstation."
Break
}
}
1 {
Write-Host "`nUser SID ID not found in the registry..." -ForegroundColor Red
Write-Host "`n`nScript will now exit...`n" -ForegroundColor Yellow
Return
}
Default {
Write-Host "ERROR WinProfileRebuild.psm1 Line 116" -ForegroundColor Red
Pause
Break
}
}
}
function Invoke-WinProfileRebuildRestore {
param (
$Username,
$Computername
)
$FoldersToCopy = @(
'Desktop'
'Downloads'
'Favorites'
'Documents'
'Pictures'
'Videos'
'AppData\Local\Google\Chrome\User Data\Default\Bookmarks'
'AppData\Roaming\Microsoft'
)
#Find Backup folders
$backups = Get-ChildItem -Path "\\$Computername\c$\Users" | Where-Object -FilterScript { $_ -match $Username }
Write-Host "Backups"
if ($null -eq $backups) {
Write-Host "No backups for $username"
return
}
if ($backups -is [array]) {
for ($i = 0; $i -lt $backups.Count; $i++) {
$out = "[{0}] {1}" -f $i, $backups[$i]
Write-Host $out
}
$backupChoice = Read-Host "Choose which backup"
$backupChoice = [int]$backupChoice
if (($backupChoice -gt -1) -and ($backupChoice -lt $backups.Length)) {
$backup = $backups[$backupChoice]
}
else {
Write-Warning "Invalid Choice - re-run winprofile rebuild to try again"
return
}
}
else {
$out = "[{0}] {1}" -f 0, $backups
Write-Host $out
$backupChoice = Read-Host "Choose which backup"
if ($backupChoice -eq 0) {
$backup = $backups
}
else {
Write-Warning "Invalid Choice - re-run winprofile rebuild to try again"
return
}
}
Write-Host "Restoring from $backup"
$destinationPath = "\\$Computername\c$\Users\$username"
$sourcePath = "\\$Computername\c$\Users\$backup"
Write-Host "Removing Citrix Shortcuts from backup"
$CopiedUserDesktop = "$sourcePath\Desktop"
$Shortcuts = Get-ChildItem -Path $CopiedUserDesktop -Filter *.lnk
foreach ($Shortcut in $Shortcuts) {
$sh = New-Object -ComObject WScript.Shell
if ($sh.CreateShortcut($Shortcut.FullName).TargetPath -eq 'C:\Program Files (x86)\Citrix\ICA Client\SelfServicePlugin\SelfService.exe') {
Remove-Item $Shortcut.FullName
}
}
foreach ( $Folder in $FoldersToCopy ) {
$source = Join-Path $sourcePath $Folder
<#
#Special Case for Google Bookmarks
if($Folder -eq 'AppData\Local\Google\Chrome\User Data\Default\Bookmarks'){
Write-Host "Restoring Chrome Bookmarks"
if( -not ( Test-Path -Path $source)){
Write-Host "No Chrome Bookmarks backup"
continue
}
if( -not ( Test-Path -Path "$sourcePath\AppData\Local\Google\Chrome")){
Write-Warning "Restoring Chrome bookmarks but Chrome is not installed on this machine"
}
if( -not ( Test-Path -Path "$sourcePath\AppData\Local\Google\Chrome\User Data\Default")){
New-Item "$destinationPath\AppData\Local\Google\Chrome\User Data\Default" -ItemType Container | Write-Verbose
}
Copy-Item -Path $source -Destination $destinationPath -Force -Recurse
Write-Host "complete"
continue
} #>
if ((Test-Path $source) -and (Test-Path $destinationPath)) {
Write-Host "Restoring $folder "
Copy-Item -Path $source -Destination $destinationPath -Force -Recurse
}
else {
Write-Warning "Path Unreachable"
}
}
}