The first half was scrappy in windy conditions. Danny Allsopp had the best chance of it when Ben Burgess passed through to him in the 18th minute, but he shot over.
Allsopp made amends 10 minutes into the second half by scoring the opener. He chased Burgess' flick-on and poked the ball past goalkeeper Mark Ovendale into the North Stand goal.
But the visitors were back on level terms 10 minutes later as Lee Nogan nodded in Dave Merris' left-wing cross at the back post.
This prompted Peter Taylor to bring his new signing Jon Walters off the bench, coming on in place of Ryan France on right wing.
However, it was the Minstermen who came closest to taking the lead in the 71st minute after Marc Joseph's mistake let in Lee Bullock, but he inexplicably fired wide when one-on-one with Boaz Myhill.
Ovendale caught Stuart Green's long-range effort, but Walters beat the York custodian with 16 minutes to go. Lee Marshall - making his KC Stadium debut - crossed from the right and Walters headed home from six yards out.
City almost let their lead slip for a second time minutes later but Andy Dawson blocked on the line from a corner.
Walters went on a run and played in Stuart Elliott, but Ovendale dived at his feet to parry the shot out.
York's battling performance went unrewarded as the Tigers took all three points in front of a 19,099 crowd.
City line-up (4-4-2): Myhill; Marshall, Joseph, Delaney, Dawson; France (Walters 69), Green, Ashbee, Elliott (Holt 88); Allsopp (Hinds 84), Burgess.
Un-used subs: Musselwhite, Forrester.