We copy all student files to an Archive read only share every year and then delete the accounts.
If the student re-enrolls we have to grant rights to that location.
 
 VERSION HISTORY:
 1.3 06.09.2011
 Create one array of all student accounts in add
 Create another of all folders in the share
 Compare both arrays for a match
 If you have a match check the acl
 If the acl is missing add the acl
 
PowerShell
Edit|Remove
#Windows PowerShell Code########################################################################### 
# 
# AUTHOR: John Grenfell 
# 
# 
################################################################################################### 
 
<# 
.SYNOPSIS 
    A process which adds rights to a Archive location 
.DESCRIPTION 
    We copy all student files to an Archive read only share every year and then delete the accounts. 
    If the student re-enrolls we have to grant rights to that location. 
     
.EXAMPLE 
    Edit the script before running. 
.NOTES 
    VERSION HISTORY: 
    1.3 06.09.2011 
    Create one array of all student accounts in add 
    Create another of all folders in the share 
    Compare both arrays for a match 
    If you have a match check the acl 
    If the acl is missing add the acl 
#> 
 
 
 
Import-Module ActiveDirectory 
New-PSDrive -name ArchiveStudents -PSProvider filesystem -root "\\server1\Archive\2010-11\STDNT" 
Set-Location ArchiveStudents: 
 
 
 
$ScriptName = "Archive-Rights2010-$((get-date).dayOfYear).txt" 
 
$Log = "\\server1\Archive-Rights\$ScriptName" 
$ErrorLog = "\\server1\Archive-Rights\Error$ScriptName.txt" 
 
 
Function Log-Message(){ 
    Param($Message = ".") 
    Write-Verbose $Message 
    Write-Output $Message | Out-File $Log -Append -Force 
} 
 
 
Log-Message "Started run $(Get-Date)" 
 
$AllStudents = "" 
$ArchiveContents = "" 
 
$AllStudents = @(Get-ADUser -Filter 'Name -like "*"' -SearchBase 'OU=Student,DC=domain,DC=ac,DC=uk' | Select-Object Name,SamAccountName,DistinguishedName) 
$ArchiveContents = @(Get-ChildItem -Force "ArchiveStudents:" | where{$_.PsIsContainer} | select name) 
$ArchiveHomeDrives = @($ArchiveContents | ForEach {$_.name}) 
 
Log-Message "$($AllStudents.count) students and $($ArchiveContents.count) archived homedrives" 
 
Function Add-Rights(){  
Param($Folder = "x")  
  
   If ($Folder){  
            $FolderLocation = Get-Item "ArchiveStudents:\$Folder"  
            Log-Message "Starting to repair rights for $($FolderLocation.FullName)" -ForegroundColor GREEN -BackgroundColor BLACK  
            &takeown /$FolderLocation.FullName //R /D Y 
            &icacls $FolderLocation.FullName /reset //C   
            &icacls $FolderLocation.FullName /setowner DOMAIN1\$Folder //C   
            &icacls $FolderLocation.FullName /grant DOMAIN1\$Folder':(OI)(CI)R'  
            &icacls $FolderLocation.FullName /inheritance:d  
            &icacls $FolderLocation.FullName /remove "creator owner"  
           Log-Message "Finished repairing rights for $Folder" -ForegroundColor GREEN -BackgroundColor BLACK  
   }  
  
}  
 
ForEach ($Student in $AllStudents){ 
    #$Student | fl 
 
    If($ArchiveHomeDrives -contains $Student.SamAccountName){ 
        Log-Message "-Found $($Student.SamAccountName)" 
        Get-Acl ArchiveStudents:\$($Student.SamAccountName) | fl 
        $IdentityReferenceArray = @((Get-Acl ArchiveStudents:\$($Student.SamAccountName)).Access | ForEach {$_.IdentityReference}) 
        If(((Get-Acl ArchiveStudents:\$($Student.SamAccountName)).Access | ForEach {$_.IdentityReference}) -match $Student.SamAccountName){ 
            Log-Message "-Found $($Student.SamAccountName) - ACL found" 
 
        } 
        Else{ 
            Log-Message "-Found $($Student.SamAccountName) - ACL not found" 
            Add-Rights $Student.SamAccountName 
 
        } 
         
    } 
    Else{ 
        Log-Message "Not Found $($Student.SamAccountName)" 
 
    } 
     
     
} 
 
Log-Message "Finished run $(Get-Date)"