Javier Vazquez pitched six solid innings for the Diamondbacks, who won for just the second time in their last nine games. Vazquez (6-4) allowed three runs and three hits.
Justin Morneau and Jacque Jones homered for the Twins, whose three-game winning streak was snapped.
Javier Lopez got the first two outs in the ninth and was replaced by Brian Bruney, who allowed a walk and a hit before striking out pinch-hitter Matt LeCroy for his sixth save in nine chances.
One night after being shut out on three hits by Johan Santana, the Diamondbacks opened an early 4-0 lead against Kyle Lohse (5-4).
Craig Counsell led off the first with a stand-up triple to the gap in right-center field and scored on Alex Cintron's grounder to short.
Cruz lined a homer just over the right-field fence leading off the fourth. Chad Tracy and Chris Snyder followed with consecutive singles and Vazquez sacrificed the runners to second and third. Tracy scored on a groundout by Counsell and Cintron added an RBI single for a 4-0 lead.
Morneau hit a one-out homer, his eighth, into the picnic pavilion behind the concourse in deep center field in the fifth to pull the Twins within 4-1. Vazquez then walked Michael Cuddyer and Juan Castro, but escaped the jam when Lohse struck out and Shannon Stewart flew out to Cruz at the warning track.
Jones made it 4-3 with a two-out homer in the sixth, his eighth, extending his hitting streak to nine games.
Lohse allowed four runs and seven hits with four walks and two strikeouts.