Scenario: We have roaming profiles at work. During our upgrade of client machines from XP to Win7, the Win7.v2 subfolder is not being created with the inheritance flag set (minor problem easily fixed). On top of this, we also have a plethora of old profiles (winxp, winxp.old, winxp_old, winxp_, win7.v2_old etc) that need to be purged. I have come up with a script to attempt to do this but am stuck on the deletion of old profiles.
Environment: Roaming profiles are in the following format:
I am self taught so apologies for rubbish scripting. I haven't used the $date variable yet but will look to not delete any folder that was modified in the last 10 days.
cls
# Date and time script is started
$StartDate = date
# Date variable for 30 day buffer
$date = (Get-Date).AddDays(-30)
# Sets path and log variables
$ProfilePath = "D:\Work\Profiles"
$LogPath = "D:\Work\Logs"
$Takeownlog = "$LogPath\Takeown.log"
$Icaclslog = "$LogPath\icacls.log"
$NoWIN7FolderLog = "$LogPath\NoWin7Folder.log"
# Deletes any previous log entries
del $Takeownlog
del $Icaclslog
del $NoWIN7FolderLog
# Gets Subfolder list
$FolderList = Get-ChildItem $ProfilePath
# Main body of script.
foreach ($SubFolder in $FolderList)
{
$winxp = "$ProfilePath\$subfolder\winxp"
$winos = "$ProfilePath\$subfolder\%winos%"
$winvar = "$ProfilePath\$subfolder\win"
# Checks if the WIN7.V2 folder exists. If it doesn't, it logs it and moves to next folder
if(-not(Test-Path -path $ProfilePath\$SubFolder\WIN7.V2)){
Write-Host "$SubFolder\WIN7.V2 does not exist. Moving on..." -ForegroundColor Red
Write-Output "$ProfilePath\$SubFolder\WIN7.V2 does not exist" | Out-File $NoWIN7FolderLog -Append -encoding default
} Else
{
# If the WIN7.V2 folder does exist it will recursively set Ownership to Administrators and then set the inheritance on the WIN7.V2 folder
Write-Host "Fixing ownership and inheritance: $ProfilePath\$SubFolder" -foregroundcolor Green
Write-Output "Fixing ownership and ineritance: $ProfilePath\$SubFolder\WIN7.V2" | Out-File $Takeownlog -append -encoding Default
takeown /f $ProfilePath\$SubFolder\WIN7.V2 /A /R /D Y | Out-File $Takeownlog -append -encoding Default
Write-Output "" | Out-File $Takeownlog -append -encoding Default
#
Write-Output "" | Out-File $Icaclslog -append -encoding Default
Write-Output "Fixing inheritance: $ProfilePath\$SubFolder\WIN7.V2" | Out-File $Icaclslog -append -encoding Default
ICACLS $ProfilePath\$SubFolder\WIN7.V2 /inheritance:e /c /t | Out-File $Icaclslog -append -encoding Default
}
# Deletes any old profiles winxp or win7.v2_*
Write-Host "Removing any old profiles..."
if(Test-Path -path $winxp){
#if((-not(Test-Path -Path $winxp)) -and (-not(Test-Path -Path $winos)) -and (-not(Test-Path -Path $winvar)) {
write-host "No old profiles to delete for $SubFolder"
} Else
{
# If any old profiles are found it will delete them
Write-Host "Old profiles found for $subfolder. Deleting now..."
Remove-Item -Path $winxp
}
}
Write-Host ""
$EndDate = date
Write-Host "Started: $StartDate"
Write-Host "Ended: $EndDate"
Write-Host ""
The first part of the script to reset inheritance works fine as below:
Fixing ownership and inheritance: D:\Work\Profiles\mcbridt
Fixing ownership and inheritance: D:\Work\Profiles\singhj
Fixing ownership and inheritance: D:\Work\Profiles\test1
test2\WIN7.V2 does not exist. Moving on...
Started: 04/13/2015 16:25:09
Ended: 04/13/2015 16:25:09
But the second part to delete any 'old' profiles does not work at all. I have tried many iterations of remove-item but cannot for the life of me figure it out. I appreciate any suggestions and fixes.
Many thanks
Many thanks to the 2 users above that were able to steer me in the right direction. After some slight modification I was able to get it working. It's not pretty, but it works.
cls
# Date and time script is started
$StartDate = date
# Date variable for 30 day buffer
$date = (Get-Date).AddDays(-30)
# Sets path and log variables
$ProfilePath = "<local drive>\<share>"
$LogPath = "C:\temp"
$Takeownlog = "$LogPath\Takeown.log"
$Icaclslog = "$LogPath\icacls.log"
$NoWIN7FolderLog = "$LogPath\NoWin7Folder.log"
# Deletes any previous log entries
del $Takeownlog -ErrorAction SilentlyContinue
del $Icaclslog -ErrorAction SilentlyContinue
del $NoWIN7FolderLog -ErrorAction SilentlyContinue
# Gets Subfolder list
$FolderList = Get-ChildItem $ProfilePath
# Main body of script.
foreach ($SubFolder in $FolderList)
{
# Sets commonly known 'old' profile folder names
$winxpold = "$ProfilePath\$SubFolder\winx*"
$winosold = "$ProfilePath\$subfolder\%win*"
$win7old = "$ProfilePath\$subfolder\WIN7.V2.*"
$win7old2 = "$ProfilePath\$SubFolder\WIN7.V2_*"
# Checks if the WIN7.V2 folder exists. If it doesn't, it logs it and moves to next folder
if(-not(Test-Path -path $ProfilePath\$SubFolder\WIN7.V2)){
Write-Host "No WIN7.V2 folders exists for: $subfolder" -ForegroundColor Red
Write-Output "No WIN7.V2 folders exists for: $subfolder" | Out-File $NoWIN7FolderLog -Append -encoding default
} Else
{
# If the WIN7.V2 folder does exist it will recursively set Ownership to Administrators and then set the inheritance on the WIN7.V2 folder
Write-Host "Fixing ownership and inheritance for: $SubFolder" -foregroundcolor Green
Write-Host "Path: $ProfilePath\$SubFolder" -ForegroundColor Green
Write-Output "Fixing ownership and ineritance for: $ProfilePath\$SubFolder\WIN7.V2" | Out-File $Takeownlog -append -encoding Default
takeown /f $ProfilePath\$SubFolder\WIN7.V2 /A /R /D Y | Out-File $Takeownlog -append -encoding Default
Write-Output "" | Out-File $Takeownlog -append -encoding Default
#
Write-Output "" | Out-File $Icaclslog -append -encoding Default
Write-Output "Fixing inheritance: $ProfilePath\$SubFolder\WIN7.V2" | Out-File $Icaclslog -append -encoding Default
ICACLS $ProfilePath\$SubFolder\WIN7.V2 /inheritance:e /c /t | Out-File $Icaclslog -append -encoding Default
}
# Deletes any old profiles winxp or win7.v2_*
if((Test-Path -path $winxpold) -or
(Test-path -Path $winosold) -or
(Test-path -Path $Win7old) -or
(Test-Path -path $win7old2)){
Write-Host "Old profiles found for: $subfolder. Deleting now..." -ForegroundColor Yellow
Write-Output "Old profiles found for: $subfolder. Deleting now..." | Out-File $Icaclslog -append -encoding Default
Get-ChildItem -Path $ProfilePath\$subfolder -Force |
Where-Object { $_.PSIsContainer -and $_.LastWriteTime -lt $date -and $_.Name -like "winx*" -or $_.Name -like "%win*" -or $_.Name -like "WIN7.V2.*" -or $_.Name -like "WIN7.V2_*" } |
Remove-Item -Recurse -Force
} Else{
write-host "No old profiles to delete for: $SubFolder" -ForegroundColor Green}
Write-Host ""
}
Write-Host ""
$EndDate = date
Write-Host "Started: $StartDate"
Write-Host "Ended: $EndDate"
Write-Host ""