Easiest (but not cheapest!) way is probably to use a webcam and integrate the pixel values.
I don't know how much error there is in this process, but I'm quite certain it could be made to work.
[edit: expanding on Oli Glaser's comment]
I didn't notice before that serial was an option. The dirt-cheapest way would be to use a CdS photocell and a capacitor and measure the time constant using the serial control lines. This will cost about $1.50 for a DE9 connector, photocell and capacitor in single quantities.
The catch is that unless you're doing this in DOS, you will have to write a kernel driver to do the reading. Windows has enough going on that you are not going to get millisecond-level latency.
An alternative is to use a very high value capacitor (say around 1000uF or so). My experiments with NT and XP show that 50 millisecond latency is not unreasonable. By using a 1,000uF capacitor, if we assume that the average resistance of the CdS cell in the range you are reading is about 25kohms (I wrote code to do just this on an AVR a month ago and I think the light in an "average" room translated to about 25k), then the time constant is 25 seconds. That should give you plenty of resolution even if reading the serial port has 100 millisecond imprecision.
Now you've piqued my interest :-) I'm going to have to try coding this up. Wonder if .NET is up to it?