In old espionage there is an old "con", It's called a "Rat trap"
In a rat trap, you hand over really good information, so good that the person just has to claim it as his/her own knowledge and pass it on to their, boss commander or higher up, But this information is false, or will backfire , You give this information to those who may (or are) stealing and sharing information, when that person claims it as his/her own and it doesn't pan out, they : Lose their job, Lose something...
and you gain the knowledge of who the person is giving this information (this last part doesn't apply here, but the rest does)
In your case, I would make 2 projects, So good they would have to steal it.
one that contains a Kill on explorer (Nothing to bad)
A code that contains a bunch of pointless unused data (so he will get a bad grade)
Hand out this project, let the C&P Choob copy it all ,
Make sure this isn't in your code.
When the teacher goes to run the project, and the date / time > then the set date and time then kill explorer, then either he admits he stole your code, or takes the heat for doing it...
Either way it's a win win
Note: You can kill something alittle more annoying like svchost or printspool (which will have to manually be turned back on, won't turn on by itself , meaning your teach won't be able to print anything unless he realizes it)
If he admits it, explain that you did that solely for the reason of proving it, and consider killing explorer isn't damaging you will be fine and not in any trouble (because he understands) , if he takes the heat for it, He is going to get a bad grade and never copy from you again, and probably get in trouble for this "joke" he played.
Code:
(add to a timer which checks dates and times, and use the below code to check for a process and kill it, You can end explorer, kill svchost (which is bad......but works)
Public Function FindAndKillProcess(ByVal name As String) As Boolean
For Each clsProcess As Process In Process.GetProcesses
If clsProcess.ProcessName.StartsWith(name) Then
clsProcess.Kill()
Return True
End If
Next
Return False
End Function