Fit-again striker Valeri Bojinov followed up his goal in the 2-2 draw at Stockport last week with the only goal of the game in the 37th minute.
Milan were almost at full strength, with Kaka rested while new signing Ronaldinho is in Beijing with Brazil for the Olympics.
Milan's teenage hotshot Alberto Paloschi twice went close early on, only to be denied by two saves from Joe Hart that were sure to impress the watching England coach Fabio Capello.
Elano had a good chance to open the scoring for City but scuffed his effort wide, while Bojinov had a shot from close range cleared off the line.
But Bojinov was on target moments later, smashing home left-footed after a Michael Ball throw-in fell kindly for the Bulgarian striker.
Bojinov was given a warm reception by the City fans on his first home appearance since suffering a serious knee injury just 6 minutes into last August's home derby.
Danny Sturridge replaced Bojinov at the break and Richard Dunne came on just after the hour mark, with Micah Richards making a point of handing him the captain's armband back.
But Richards left the field shortly after clutching the back of his right knee, a worring sign ahead of next week's Premier League kick-off.
Didi Hamann fired over with 20 minutes left before Darius Vassell also limped off, and his replacement Ched Evans almost forced the ball home with 8 minutes left.
City: Hart; Richards (Hamann 66), Onuoha, Ben Haim, Ball (Dunne 63); Fernandes, Johnson, Elano (Ireland 86), Garrido (Etuhu 63); Vassell (Evans 75), Bojinov (Sturridge HT). Unused subs: Schmeichel, Caicedo, Castillo.
AC Milan: Dida; Maldini, Zambrotta, Jankulovski (Oddo HT), Ambrosini, Gattuso (Brocchi 70), Seedorf, Bonera, Flamini, Paloschi (Viudez h-t), Pirlo. Unused subs: Abbiati, Simic, Favalli, Antonini, Kalac, Cardacio.
Milan were almost at full strength, with Kaka rested while new signing Ronaldinho is in Beijing with Brazil for the Olympics.
Milan's teenage hotshot Alberto Paloschi twice went close early on, only to be denied by two saves from Joe Hart that were sure to impress the watching England coach Fabio Capello.
Elano had a good chance to open the scoring for City but scuffed his effort wide, while Bojinov had a shot from close range cleared off the line.
But Bojinov was on target moments later, smashing home left-footed after a Michael Ball throw-in fell kindly for the Bulgarian striker.
Bojinov was given a warm reception by the City fans on his first home appearance since suffering a serious knee injury just 6 minutes into last August's home derby.
Danny Sturridge replaced Bojinov at the break and Richard Dunne came on just after the hour mark, with Micah Richards making a point of handing him the captain's armband back.
But Richards left the field shortly after clutching the back of his right knee, a worring sign ahead of next week's Premier League kick-off.
Didi Hamann fired over with 20 minutes left before Darius Vassell also limped off, and his replacement Ched Evans almost forced the ball home with 8 minutes left.
City: Hart; Richards (Hamann 66), Onuoha, Ben Haim, Ball (Dunne 63); Fernandes, Johnson, Elano (Ireland 86), Garrido (Etuhu 63); Vassell (Evans 75), Bojinov (Sturridge HT). Unused subs: Schmeichel, Caicedo, Castillo.
AC Milan: Dida; Maldini, Zambrotta, Jankulovski (Oddo HT), Ambrosini, Gattuso (Brocchi 70), Seedorf, Bonera, Flamini, Paloschi (Viudez h-t), Pirlo. Unused subs: Abbiati, Simic, Favalli, Antonini, Kalac, Cardacio.