Belgian Mario Aerts of Lotto came second with Giuseppe Guerini of the Telekom team finishing third after a 142-km ride between Aime and here at the foot of the French Alps.
Lance Armstrong arrived with the peloton a few minutes later on a day when the overall standings stayed virtually the same.
US Postal team leader Armstrong still leads Spaniard Joseba Beloki of the ONCE team by 5 minutes 6 seconds, with Lithuanian Raimondas Rumsas still in third at a further two minutes behind.
On the final day of climbing in the Alps, the peloton seemed content to ride the stage at an easy pace, although a number of challenging climbs made sure it was never going to be a stroll.
After a number of early breakaways, a grop of riders including the top three finishers were allowed to break free. Although a number of counter-attacks were made, mainly by Frenchman Laurent Jalabert, Frigo's group held on till the end.
In the final sprint to the finish, Guerini, one of only two Italians in the German Telekom outfit, made the first attack, coming with more than 300 meters to go, knowing he'd be hard pressed to hold his advantage to the line.
Aerts then took over as Guerini tired and, in the final 50 meters, Frigo chose his moment to pull out from the back of the Belgian's wheel and pulled up the inside.
Although flirting with danger so close to the barricades, Frigo, who had to duck his head to avoid an out-stretched camera, stayed on line and crossed the finish with his arms in the air.
"I'm really happy to have won this stage, especially as it was in the Alps. The Tour is not the best race for me for the overall standings but today I wanted to show that I could do something."
Stage 17: Post-stage commentary
Stage 17: Live update summary
Stage 17 results, top 15 (Aime - Cluses, 142 km)
1. Dario Frigo, Italy, Tacconi, 4 hours, 2 minutes and 27 seconds.
2. Mario Aerts, Belgium, Lotto, same time.
3. Giuseppe Guerini, Italy, Telekom, 2 seconds.
4. David Moncoutie, France, Credit Agricole, 2:55.
5. Thor Hushovd, Norway, Credit Agricole, 2:58.
6. Laurent Lefevre, France, Jean Delatour, 2:58.
7. Unai Osa, Spain, ibanesto.com, 2:58.
8. Marcos Serrano, Spain, Once, 2:58.
9. Jorg Jaksche, Germany, Once, 2:58.
10. Carlos Sastre, Spain, CSC-Tiscali, 2:58.
11. Santiago Botero, Colombia, Kelme, 2:58.
12. Jose Enrique Gutierrez, Spain, Kelme, 3:14.
13. Laurent Brochard, France, Jean Delatour, 4:36.
14. Francisco Mancebo, Spain, ibanesto.com, 4:36.
15. Levi Leipheimer, United States, Rabobank, 4:36.
17. Joseba Beloki, Spain, Once, 4:36.
22. Igor Gonzalez Galdeano, Once, Spain, 4:36.
23. Raimondas Rumsas, Lithuania, Lampre, 4:36.
24. Lance Armstrong, United States, U.S. Postal Service, 4:36.
25. Jose Azevedo, Portugal, Once, 4:36.
Overall standings, top 10
1. Armstrong, 72:50:25.
2. Beloki, 5:06.
3. Rumsas, 7:24.
4. Botero, 10:59.
5. Azevedo, 12:08.
6. Gonzalez Galdeano, 12:12.
7. Mancebo, 12:28.
8. Roberto Heras, United States, U.S. Postal Service, 12:54.
9. Leipheimer, 13:58.
10. Sastre, 14:49.