A shader. It's the only way.
Standard DX lighting does not account for collision, it only checks the lights vector (direction in XYZ) against the polygon normals to decide the colour of each vertex.
So, you should probably go and find some shaders to try.
But there is one little option that I've used in the past. If you take your objects and enable them all for collision, maybe with Sparky's collision plugin - you need to be able to check collision between 2 3D locations. Get each objects vertex location, and check for collision between the light source, and the vertex location plus it's normal. Then if there is a collision on this line, the vertex is not affected by that light, otherwise affect the vertex colour with the light colour. You could do this with multiple light sources of course and average them, affect the light strength based on distance. You'd ideally use your own lighting system, there's no need to limit it to 8 lights.
With that, you'd pretty much mimic DX lighting, it would look just as smooth, except the light won't pass through solid objects, things would even cast shadows if the surface is detailed enough.
It probably would not be workable to do this in realtime, but it wouldn't be a slouch either, you could load all your level, calculate the vertex lights, then disable lighting - this is much better for performance than using several DX lights, because the object doesn't need to calculate light at all once it's been vertex lit. If you need moving light sources then you need to use real lights, but it depends on what you need, and how complex you want to go with it. Your level could have 1000 light sources all effective at once, and would run faster than any number of DX lights, even just 1 DX light affecting your object would be slower than this method. DX lights could be used for effects and moving light sources, as they still affect things as long as you keep object lighting enabled.
It's similar to a standard lightmap - in fact this is how lightmaps started out back in the Quake era, but faster, fast enough to do it pre-game, and much better for performance again, because there's no need for extra texture passes.