From my experiences, it is not possible to get this information when the card is in use (or even simply when the carriers software is running). We are in the same boat using VZ, Sprint and ATT embedded and PCMCIA cards and wanted to get the esns. Since all the carriers were using Novatel cards, instead of issuing AT commands to get the information, I was using the Phoenix SDK from Novatel to query this information. Each card seemed to have 2 ports assigned to it, one for communicating with Phoenix and one for the actual communicating with the provider. The issue is when the software launches, the ports become in-use and you can't send an AT command or communicate to the ports you need to.
So, in order to get around this, I had a script (.exe) run at startup and write any information we wanted to the registry (MDN, MSID, ESN, PRL Version, etc). Since our cards are not in-use when the machine starts up, we get good information almost always. Novatel release NovaCore which takes the place of Phoenix, but I have not looked into it very much.
VZ and Sprint have gone end of life with the current embedded device and are starting to use the Qualcomm Gobi card that can be flashed for a number of carriers (VZ, Sprint, ATT, Vodafone and more). Qualcomm has an extensive process to get hold of the SDK, so I don't know how to script getting info on those cards other than AT command.
Hope my experiences help a little bit
RS