Sergio Aguero condemned United manager Louis van Gaal to a 1-0 defeat in his first Manchester derby after defender Chris Smalling saw red for the visitors before halftime.
Villa scored a first goal in six games to take the lead at home to Tottenham but then had Belgian striker Christian Benteke dismissed for a moment’s indiscipline and conceded two late goals to go down 2-1.
The Manchester clubs’ 151st league meeting was decided by a goal from Argentina’s Aguero in the 63rd minute.
With Rafael Da Silva missing the game, Smalling sent off and then Marcos Rojo forced off in the second half with a shoulder injury, a makeshift United defence comprising Antonio Valencia, Michael Carrick and teenagers Paddy McNair and Luke Shaw came under increasing pressure.
The surprise was that City were pushed back and suddenly looked edgy once they had scored.
In the end, champions City were pleased to hang on for a fourth successive league win over their neighbours — the first time that has happened since 1970.
The other depressing historical note for Van Gaal was that he has now presided over United’s worst start to a season since 1986, when Ron Atkinson was sacked and Alex Ferguson appointed.
The result left United in ninth place, with 13 points from 10 games and no away wins.
City, meanwhile, returned to within six points of leaders Chelsea and two behind surprise second-placed team Southampton.
Smalling picked up a foolish yellow card for raising his foot in attempting to block a clearance by City goalkeeper Joe Hart and seven minutes before halftime he clearly fouled James Milner and was dismissed.
“I didn’t see the first yellow, but as a player if you know you have a yellow card you have to deal with that problem,” Van Gaal said. “I don’t think he dealt with it very smartly.”
United, who brought on Carrick for his first appearance of the season after a long injury, could have conceded two penalties before the interval but referee Michael Oliver gave them the benefit of the doubt as City appealed for apparent fouls against Aguero and Yaya Toure.
The visitors were then forced into another defensive change when Rojo dislocated his shoulder and was replaced by 19-year-old Northern Irish centre back McNair.
Ten minutes later Toure’s pass sent Gael Clichy to the byline and he cut the ball back for Aguero to hook in his 10th league goal of the season.
United pushed forward and finally threatened with chances for Robin van Persie, Angel Di Maria and Marouane Fellaini.
City were relieved to hear the final whistle as captain Vincent Kompany admitted: “You miss a couple of chances and seem to lose a little control,” he told Sky Sports. “They played well towards the end. But we stayed strong for a clean sheet.”
Wayne Rooney, back in the United side after suspension, added: “Our pace caused them problems and they were panicking towards the end.”
While City are not firing on all cylinders, manager Manuel Pellegrini believes they can easily make up a six-point deficit on leaders Chelsea, just as they did to Arsenal a year ago.
“We have 28 more games to play so nobody knows what will happen,” he said.
Villa boss Paul Lambert was upset with the decision to send off Benteke — a major turning point in the match — after a melee involving Tottenham’s Ryan Mason.
“I’m not condoning what Christian did, as you can’t raise your hands, but he was provoked as well,” he told Sky Sports.
Villa scored for the first time since September 13 through Austrian Andreas Weimann in the 15th minute.
Fortunes changed after Benteke was dismissed. In the last 10 minutes Nacer Chadli equalised and just before stoppage time substitute Harry Kane, who had replaced Emmanuel Adebayor, drove in a free kick that was deflected in off Nathan Baker.
It was Kane’s first League goal of the season, to add to eight in the Europa League and League Cup.
Defeat would have left Tottenham in a parlous position but the late transformation shot them up to eighth place and left Villa 15th, only two points above the relegation places after a sixth successive defeat.
(Editing by Martyn Herman)