At my university, the school of Computer and Information Science runs a student CVS server. Each subject (that chooses to use it) gets a repository, with each student enrolled in the subject getting a folder in there. The admin accounts obviously get access to the whole lot, while each student can only checkout their own folder.
For example, take the Operating Systems subject (I have taught in the past):
/cis_os_2009
|-studentID1
|-assignment1
|-assignment2
|-prac1
|-studentID2
|-etc
In the assignment specifications we give instructions for submitting assignments.
I like the CVS submission system better than emails and the web submission system that other areas of the uni use. It teaches students how to use a version control system. You can almost entirely scrub the 'my usb flash drive was lost/broken/stolen' excuse for students who do not hand in assignments, since students should be doing regular commits to the repository (in some subjects, marks are allocated to correct use of CVS).
The downside is that you cannot assume that students will know how to use CVS/SVN at the beginning of the semester. Most subjects here dedicate the first week's practical to a CVS tutorial so people can make sure that a) the sysadmins have setup their accounts correctly, and b) that they can add and commit files correctly. It also means you have to be a little lenient for submissions of the first assignment.
All you need to do for marking is checkout the repository as it existed at the due date/time of the assignment. If you run scripts for partially automating marking the repository makes it very easy. You know exactly what the folder structure should be and where all the files should be located. In the subjects I have taught, we have a marks file with a rundown of the student marks and comments on why marks were deducted. We check this file into the repository and students can get their marks immediately by doing a cvs update.