百善镇镇域上东廓、下东廓两村之西在西汉元封元年(前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年,撤乡改镇,辖现域。