0

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:

  • P:\Profiles$\User1\WIN7.V2
  • P:\Profiles$\User1\winxp
  • P:\Proifles$\User1\WIN7.V2_old
  • ...

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

MuppetNZ
  • 1
  • 1

3 Answers3

1
        $limit = (Get-Date).AddDays(-10)
        $path = "$ProfilePath\$subfolder\winxp"

        # Delete files older than the $limit.
    if(Test-Path -path $winxp){
        Write-Host "Old profiles found for $subfolder. Deleting now..."
    Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force
        } Else{
write-host "No old profiles to delete for $SubFolder"}

in my script use -force for delete read-only file and hidden file plus you can use -whatif at end of script for find out what happen if script run

Soheil
  • 837
  • 8
  • 17
0

The delete command will work better if you use Remove-Item -Path $winxp -recurse

Also, and more importantly, it looks like your logic is backwards on your test xp portion.

if(Test-Path -path $winxp){
    write-host "No old profiles to delete for $SubFolder"
    } Else{
Write-Host "Old profiles found for $subfolder. Deleting now..."
Remove-Item  -Path $winxp}

should probably be...

if(Test-Path -path $winxp){
Write-Host "Old profiles found for $subfolder. Deleting now..."
Remove-Item  -Path $winxp -Recurse
}Else{
write-host "No old profiles to delete for $SubFolder"}

Beyond that, it looks like the script should hit that section if it hits the parts before and after as it does in your sample output.

Trey Nuckolls
  • 581
  • 6
  • 21
0

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 ""
MuppetNZ
  • 1
  • 1