I have tried doing this some time ago with the old engine module, and ended up with only being able to see whether they hold a button down and stuff like that.
Anyway, like you probably know, duck and jump are handled client-side and the server only has a bit set in the pEdict->v.button integer.
Most (if not all) of the button handling seems to be done in CBasePlayer:

reThink. So if you could hook PreThink and remove the jump and duck bits from the EV_INT_button integer (for example by doing button=button & ~(IN_JUMP | IN_CROUCH); ), you would be probably done. I don't know whether I haven't tried this (I only remember setting buttons before the actual Think function but not PreThink, but it is a pretty long time ago) or why i wasn't able to block the buttons - but I think it should be possible somehow.
Hope I have helped
__________________