百善鎮鎮域上東廓、下東廓兩村之西在西漢元封元年(前110年)是上谷郡昌平縣治所。
民國三十七年(1948年)12月12日,屬昌順聯合縣第十區。
1949年8月,屬昌平縣第三區。
1950年2月,分屬昌平縣二區、四區,各自然村建村政府。
1953年7月,村政府撤銷建鄉,百善鄉轄百善、孟祖2村,獅子營鄉轄良各莊、泥洼、鐘營、獅子營4村,牛房圈鄉轄呂各莊、半壁街、二德莊、牛房圈4村,屬四區。
上東郭、下東郭2村屬辛立屯鄉,東沙屯屬王莊鄉,屬二區。
1956年2月,百善、獅子營、牛房圈3鄉合并為百善鄉。
東沙屯、上東郭、下東郭屬松蘭堡鄉。
1958年,屬紅旗人民公社又屬小湯山公社,各鄉稱工作站。
1960年1月,屬昌平縣。
1961年5月,成立百善人民公社。
1982年7月,百善公社改鄉。
1997年,撤鄉改鎮,轄現域。