高麗人內部發生政變,蓋蘇文殺死高麗王高武,又用計擁立高武的侄子高藏為王,並且還自封為高離支。
太宗得知後,與大臣商議,認為攻取高麗不難,隻是不想煩擾百姓,打算先容忍一下,等他們更加驕橫,作惡更多後,再去討伐。
貞觀十七年(公元643年)九月,新羅派使者來,說百濟攻取了他們國家的四十多座城,又與高麗軍隊聯合,圖謀截斷新羅到唐的道路,請求派兵救援。太宗命令司農寺丞相裏玄獎帶著皇帝的詔書前往高麗,對他們說:“新羅歸順大唐,朝貢不少,你們與百濟最好都停戰,如果繼續進攻,明年就發兵進攻你們。”
次年七月,太宗打算征討高麗,下令造船,用來運送軍糧,又下詔派遣營州都督張儉等人,督帥幽、營二都督府的士兵,以及契丹、奚、靺鞨(mò hé)的軍隊,先行進攻遼東,試探那兒的情況。
十一月,任命刑部尚書張亮為平壤道行軍大總管,率領士兵四萬三千人,戰艦五百艘,從萊州入海,直趨平壤。任命太子詹事、左衛率李世為遼東道行軍大總管,統率步兵、騎兵六萬人,以及蘭、河二州投降的胡人軍隊,前往遼東。兩軍相互呼應,同時前進。
李世勣率軍從柳城出發,多方營造聲勢,做出將要取道懷遠鎮的樣子,實則秘密揮師向北,前往甬道,給高麗來了個出其不意。
貞觀十九年(公元645年)四月初一,李世勣從通定渡過遼水,到達玄菟(tù)。高麗人大驚,各城都閉門守備。
十五日,李世勣、江夏王李道宗進攻高麗蓋牟城。二十六日,攻克蓋牟,俘虜兩萬多人,糧食十多萬石。五月初二,進軍到遼東城下。初八,打敗了來救援的高麗騎兵。
太宗自二月親率軍隊從洛陽出發,此時也已到達。五月初十,太宗車駕渡過遼水,隨即撤除浮橋,以此堅定將士們的決心。
太宗親自帶領幾百騎兵來到遼東城下,見士兵們正在背土填壕溝,就分了很重的一塊土,在馬上抬著,於是隨從官員爭著把土背到城下。
李世勣晝夜不停地進攻遼東城。到了第十二天,太宗帶領精兵與他會合,把城團團圍住,圍了好幾重。
十七日,南風刮得很大,太宗派勇士爬到衝竿頂上,點著了西南麵的城樓,火借風勢,延燒到城裏。於是指揮將士們攀登城牆,高麗守軍抵擋不住,遼東城被攻克。唐軍殺死一萬多人,俘虜士兵一萬多人、男女百姓四萬人。
二十八日,唐軍進發到白岩城下。在第二天的戰鬥中,右衛大將軍李思摩中了弩箭,太宗親自為他吮血。將士們聽了,沒有不受感動的。
六月初一,李世勣攻打白岩城西南邊,太宗親自駕臨城西北。城主孫代音偷偷派心腹請求投降,約定唐兵臨近城池,扔出刀斧為信號,說:“我願意投降,城裏沒有不聽從的。”
太宗把唐朝的旗幟交給使者,說:“一定投降的話,可以把旗子插在城牆上。”孫代音插上旗子,城裏的人以為唐朝軍隊已經登上城樓,於是都跟著孫代音投降。
十一日,太宗車駕從遼東城出發。二十日,到達安市城下,發兵攻打。二十一日,高麗北部首領高延壽、高惠真率領高麗、韓路士兵十五萬人援救安市,被唐軍打敗,高延壽、高惠真帶領部下三萬六千八百人請求投降,太宗將俘虜的三千三百名士兵全部活埋。
八月初十,唐軍將營帳遷移到安市城南。太宗在遼東,凡是設立營帳,隻在明處安排哨兵,而不設塹壕堡壘。即使逼近高麗城池,高麗人也不敢出城襲掠,士兵或單獨出行,或在野外宿營,就像在中原一般。
九月,各路大軍緊急進攻安市城。太宗聽見城裏雞和豬的叫聲,對李世勣說:“圍攻了很久,城裏炊煙越來越稀少,現在雞和豬叫得厲害,一定是在犒勞士兵,想在夜裏出來偷襲我們,應當嚴加防備。”當天夜裏,高麗幾百士兵順著繩子從城牆上爬下來。太宗聽說後,親自到城下,召集士兵緊急進攻,斬首幾十人,剩餘的高麗兵退逃。
李道宗率領部下在城東南角堆築上山,漸漸逼近城牆,城裏也不斷增高城牆抵擋。士兵們輪番交戰,每天交戰六七個回合。唐軍用衝車發射石塊,撞壞城牆,城裏隨即用木柵堵住缺口。李道宗的腳受傷,太宗親自為他針灸。
唐軍晝夜不停地堆築土山,總共用了六十天,勞力五十萬人,山頂離城有幾丈,可以向下俯瞰城裏的情形。李道宗讓果毅都尉傅伏愛率領士兵在山頂駐守,防備高麗兵,結果土山坍塌,壓向城牆,城牆塌陷。恰好傅伏愛私自離開營壘,高麗幾百名士兵從城牆缺口處出來進攻,奪取了土山,在那兒挖掘溝塹守衛。
太宗大怒,斬殺傅伏愛示眾,命令眾將領攻城,三天都沒攻下。李道宗光著腳到太宗的旗下請罪。太宗說:“你罪當處死,但是朕認為漢武帝殺了大將王恢,不如秦穆公重新任用孟明視,且你有攻破蓋牟、遼東的功勞,所以特別赦免你。”
太宗攻不下安市,認為遼東天氣寒冷得早,草木枯萎,水麵結冰,士兵和馬匹難以久留,而且糧食快要吃完,就於十八日下令班師。先讓遼東、蓋牟二州的百姓渡過遼水,於安市城下炫耀兵力後,率領大軍撤退,城中守軍都不敢有什麽舉動。
雖然太宗這次征討高麗失敗了,可是也打下了高麗的很多城池,並且抓了很多俘虜,加入了唐朝戶籍的人口有上萬人。唐朝士兵戰死的不多,但殺死的高麗兵卻很多,約有四萬人。