Man-of-the-match Jordi Murphy scored the only try of this festive inter-provincial clash with Jimmy Gopperth landing five of his seven kicks at goal for a 14-point haul.
However, Sean O'Brien dislocated his shoulder in the second half in a setback for both Leinster head coach Matt O'Connor and his Ireland counterpart Joe Schmidt.
O'Connor's men dominated possession and territory in the opening half, with wind-backed Ulster soaking up the pressure until giving way just before the break.
A brace of Paddy Jackson penalties had the visitors ahead when flanker Sean Doyle was sin-binned in the 36th minute, paying the price for a succession of Ulster ruck offences.
Leinster touched down just moments later as Luke Fitzgerald sent number eight Murphy crashing over with Gopperth's classy conversion making it 10-6 at half-time.
Gopperth was the lone scorer in a scrappy second period, notching penalties after 50, 57 and 62 minutes in what was the sides' first meeting since last May's league final in Dublin.
Number eights Murphy and Roger Wilson both infringed in the opening four minutes, allowing Jackson and Gopperth to trade well-struck penalty goals.
Gopperth then drifted a second right-sided penalty wide after Fitzgerald had gained good yardage from a retrieved kick.
There were plenty of full-force collisions as Leinster chipped away at Ulster's committed defence early on, with openside O'Brien an ever-willing carrier.
Gopperth was undone by the difficult kicking conditions again on the quarter hour mark, stabbing a penalty effort from the left across the posts.
Ulster captain Robbie Diack got over a ruck ball to get his side back into opposition territory, and their defence showed its resilience again after Noel Reid raided over halfway.
Another opportunity was lost for Leinster as, after a promising lineout maul, Luke Marshall poached possession at the breakdown and hard-tackling Ulster eventually cleared the danger.
Despite the lion's share of possession, Leinster's frustration continued to grow as Diack forced another penalty at the breakdown and then a side-entry call against Mike Ross allowed Jackson to kick Ulster back in front at 6-3.
But the visitors were made to pay for a sloppy finish to the first period, as Doyle saw yellow for not rolling away and Leinster pounced for a try in the very next phase.
Fitzgerald rescued a loose lineout for the hosts and his inviting offload sent Murphy charging up the left touchline and over in the corner through last-ditch tackles from Andrew Trimble and Ricky Andrew.
Gopperth gave his side a further boost with a tremendous conversion kick from wide out, and Leinster resumed on the front foot with a stiff wind now at their backs.
Gopperth right-footed a 50th minute penalty through the posts for a 13-6 advantage, with Ulster sending on big guns Ruan Pienaar and Jared Payne in response.
The pair immediately made an impact to Ulster's back-line play, lifting the tempo during a promising spell in the hosts' 22.
Leinster soon lost O'Brien to injury but Gopperth was on target again in the 57th minute to put 10 points between the provinces.
Ulster leaked their 11th penalty of the night from a scrum on their 22, with Gopperth mopping up with another three points, and Mark Anscombe's side - on a five-match winning run - failed to respond in an error-strewn climax.
Gilroy was a pass away from setting up a try, but having done the hard work straight from Gopperth's missed touchfinder the winger elected to go it alone and the chance was lost.
Payne also knocked on near the end line as he dived to reach a grubber kick from Jackson, leaving Leinster to celebrate their first win in three outings.
Benetton Treviso claimed a much-needed 20-15 victory over RaboDirect Pro12 bottom side Zebre to move up one place into ninth as they sit level on points with Cardiff with a game in hand.
First-half tries from Cornelius van Zyl and Manoa Vosawai and 10 points from the boot of Matt Berquist won it for the home side at the Stadio Comunale di Monigo, while Marco Bortolami and Dries van Schalkwyk crossed over for the visitors with Luciano Orquera adding the extras.
Benetton, who had lost three of their previous four games, just managed to hold on to take the points against their struggling opponents, who have won just one match all season.
It was the basement side that took the lead after 12 minutes through former Italy captain Bortolami, who crossed over for a try. Orquera missed the conversion but put the visitors further ahead six minutes later with a penalty kick.
Treviso hit back immediately and Van Zyl scored his side's opening try with Vosawai claiming one of his own minutes before the break - Berquist added the extras to give the home side a 14-8 half-time lead.
Zebre came out strongly in the second period and edged in front just minutes in following Van Schalkwyk's try and fly-half Orquera was successful with the goal as they went ahead for the second time in the match.
Berquist missed the chance to put his side in front 10 minutes after the break with a missed penalty, but the New Zealander kicked one over as the game neared the hour mark to put the hosts back in the lead with just two points in it.
After two more penalty misses, Berquist scored with a late effort to take his points tally to 10 in the match before Quintin Geldenhuys and Filippo Ferrarini were sin-binned in the dying moments for Zebre as their frustrations became apparent.