If you have the source code, you can determine the parameters from the getCode. The way a contract with constructor parameters is deployed to the network is literally just concatenating the contract's bytecode with the ABI encoded parameters.
For example, see the AirDropToken code and the transaction that deployed it.
You will notice the data in the transaction begins with the contract byte code and has a little extra on the end:
00000000000000000000000000000000000000000000000000000000000000a0
00000000000000000000000000000000000000000000000000000000000000e0
0000000000000000000000000000000000000000000000000000000000000012
dc03b7993bad736ad595eb9e3ba51877ac17ecc31d2355f8f270125b9427ece7
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000011
506920446179204e30306220546f6b656e000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000003
5049450000000000000000000000000000000000000000000000000000000000
If we decode this (using the source code, we know the constructor parameters):
var ethers = require('ethers');
// Types from the constructor
var types = [ 'string', 'string', 'uint8', 'bytes32', 'uint256' ];
// data is '0x' + the above lines
ethers.utils.AbiCoder.defaultCoder.decode(types, data);
/* [ 'Pi Day N00b Token',
* 'PIE',
* 18,
* '0xdc03b7993bad736ad595eb9e3ba51877ac17ecc31d2355f8f270125b9427ece7',
* BigNumber { _bn: <BN: 0> } ]
*/