Nice script.
For cleaning up the WMI errors one way would be to use the -ErrorAction parameter which almost all cmdlets support. For example
gwmi win32_operatingsystem -comp $_.name -ErrorAction SilentlyContinue| select CSName,SerialNumber
That should remove any error messages you see from your output.
As for WMI timeouts check this article I found:
http://blog.usepowershell.com/2009/...-timeouts/ Seems pretty decent, makes use of the returnimmediately flag, I haven't used it with powershell but I have with vbscript. Cheers.