<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Neeme Vool Weblog</title>
	<atom:link href="http://neemevool.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://neemevool.wordpress.com</link>
	<description>Just another WordPress.com weblog</description>
	<lastBuildDate>Fri, 31 Jul 2009 13:18:58 +0000</lastBuildDate>
	<language>et</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='neemevool.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Neeme Vool Weblog</title>
		<link>http://neemevool.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://neemevool.wordpress.com/osd.xml" title="Neeme Vool Weblog" />
	<atom:link rel='hub' href='http://neemevool.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Uus imedieet &#8211;20kg!</title>
		<link>http://neemevool.wordpress.com/2009/07/31/uus-imedieet-20kg/</link>
		<comments>http://neemevool.wordpress.com/2009/07/31/uus-imedieet-20kg/#comments</comments>
		<pubDate>Fri, 31 Jul 2009 13:18:58 +0000</pubDate>
		<dc:creator>neemevool</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://neemevool.wordpress.com/2009/07/31/uus-imedieet-20kg/</guid>
		<description><![CDATA[Vabandan kohe esimese lausega. Jah, –20kg on õige. Kuid mingit imet siin ei ole. Pigem tahaksin kirja panna oma lõpliku arvamuse kõikidest imedieetidest ja kaalujälgimisest peale seda, kui ilma erilise nähtava tahte- või jõupingutuseta saavutasin languse 113kg-lt 93 kilole. Ja mitte ainult. Samal ajal suurendasin oma füüsilisi võimeid märgatavalt (nii ise tehtavate kui laboratoorsete mõõtmistega [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=neemevool.wordpress.com&amp;blog=3487776&amp;post=13&amp;subd=neemevool&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Vabandan kohe esimese lausega. Jah, –20kg on õige. Kuid mingit imet siin ei ole. Pigem tahaksin kirja panna oma lõpliku arvamuse kõikidest imedieetidest ja kaalujälgimisest peale seda, kui ilma erilise nähtava tahte- või jõupingutuseta saavutasin languse 113kg-lt 93 kilole. Ja mitte ainult. Samal ajal suurendasin oma füüsilisi võimeid märgatavalt (nii ise tehtavate kui laboratoorsete mõõtmistega tõestatult). </p>
<p>Mõnele võib alljärgnev ehk olla hirmutav, mõnele aga annab ehk paremaid näpunäiteid, kuna olen nüüd selle kõik ise läbi teinud. </p>
<h2>Lähtekoht</h2>
<p>Oma füüsilisest ja dietoloogilisest taustast. Olen hetkel 36 aastat vana, kaks aastat tagasi olin oma elu kaalu “tipul” – 113 kg. Pikkus on 178 cm. Alates lapseeast kuni põhikooli lõpuni olin üle keskmise kaaluga, kuid siiski peab mainima, et vägagi liikuv. Väga palju aega veetsin väljas, sestap väitis Vomaxis koormustesti teinud professor, et ilmselt sellest ka keskmise täiskasvanuga võrreldes 130% kopsumaht. Pärilikult tugev ja väga koormustaluv süda – maksimaalne treeningpulss 188. Aga see ei ole antud juhul siiski määrav. Keskkoolis hakkasin tõsisemalt treenima, siis lubas esimest korda ENSV ajaloos haridusministeerium ka kehalise kasvatuse kavasid diferentseerida. Valida sai jõusaali, üldkehalise ja kergejõustiku vahel. Ei ole vaja kaks korda arvata – muidugi valisin jõusaali. Sellest peale algas esimene vormi saavutamine. Keskkooli lõpuks oli kõik normis. Ülikooli 2. kursusest alates alustasin aga kooli kõrvalt tööd ja sellest ajast hakkasid prioriteedid segi minema – liikumisi ja trenne jäi ära, spordisaalide külastused olid järjest kaootilisemad. Muidugi arvasin ma kuni 113 kg-ni et ma olen heas vormis – tugev eesti mees, vööümbermõõt 112 ei ole ju õnnetus. Pükse veel poest leidis. </p>
<p>Siiski, päris rahul ma ei olnud ja illusioonides ei elanud. Püüdsin ikka midagi ette võtta. Käisin jõusaalis – mehelik koht ju. Muide, mehed kes te arvate, et jõusaalis pingutavad kangelased. Anaeroobset kõrge pulsi juures tekkivat pinget on palju raskem taluda kui jõusaalis rassida! Sestap niiväga palju ma rattaga või joostes ei pingutanud ka. </p>
<p>Vomaxis mõõtsin ära enda füüsilised näitajad koormuse all tehtavas hapnikutarbimise testis. </p>
<p>Kaal: 112,5 kg</p>
<p>Pikkus: 178 cm</p>
<p>Max pulss: 186</p>
<p>Pulss istudes: 78</p>
<p>Vererõhk: 90/150</p>
<p>Vererõhk max koormuse ajal: 200</p>
<p>Taastumine: 4-5 min</p>
<p>Max hapnikutarbmine ml/kg: 32 (halb)</p>
<p>Jalgade jõud: 275W (hea)</p>
<p>Rasvaprotsent: 27%</p>
<h2>Dieedid</h2>
<p>Lühidalt võib dieedid jagada kaheks &#8211; kehale või rahakotile hävitavalt mõjuvaks. Mõned neist on muidugi ka mõlemat korraga. Kõige ohutumad on lihtsalt rahakotile mõjuvad dieedid, neid leiab enamasti läikivatest ajakirjadest. Nende praktiliselt ainus väärtus on see, et kõiki vajalikke koostisosi hankides kulutate märkimisväärsel hulgal kaloreid. Peale kolossaalse rahakulu on neil aga teine halb omadus – nad tekitavad näilise rahulolu – ma ju tegelen dieediga ja võtan midagi ette. Kuid alati lõppeb kõik pohmelusega – mingit praktilist ja väga nähtavat mõju ei ole. Peamine põhjus on, et õgid ka seda dieettoitu ikkagi meeletus koguses – söömisharjumused jäävad samaks. Proovisin mõnesid selliseid dieete, kuid lõpetasin peamiselt seetõttu, et kogu selle menüü valmistamine oli üks paras jahmerdamine. </p>
<p>Teine suur kategooria on tervisele kahjulikud dieedid. Siia alla kuuluvad kõik dieedid, mida serveeritakse kui imet. Söö toitaineid eraldi dieedid, valgudieedid, rasvadieedid, veedieedid kuni radikaalsed 900kcal dieedid jne. Laias laastus ajavad sellised dieedid kas keha paanikasse (drastiliselt madalakalorilised) või siis rikuvad normaalse ainevahetuse (ühekülgsed dieedid). Erinevalt vaid rahakotile mõjuvatest dieetidest on neil muidugi mingi mõju olemas – teatud määrani või siis teatud tervisliku seisundini. Enamasti võib aga unustada sportimise ja aktiivse elu, raskemad variandid tagavad halval juhul vaid vegeteerimise sarnase letargia. Nende puhul mul kahjuks mingit isiklikku kogemust ei ole, kuna omades siiski mingit teadmist füsioloogiast, toitumisest ja ainevahetusest vältisin neid kategooriliselt. </p>
<h2>-20kg?</h2>
<p>Mida aga siis peale seda targutamist teha? Kui ma ei oleks ilma imedieetideta saavutanud –20kg, siis ilmselgelt ei julgeks ma dieetide kohalt sõna võtta. Enne alustamist seadsin lisaks aga tingimused:</p>
<ul>
<li>füüsiline vorm peab paranema kõikides parameetrites. Ma pean peale programmi olema tugevam (ühekordselt tõstetavate raskuste mõttes), vastupidavam (jõuvastupidavus), kiirem (rattasõit, sõude-ergomeeter). Kuna ma ei kavatse tegelda tippspordi tasemel, siis ei tohiks muidu vastuoluliste näitajate arendamine võimatu olla. </li>
<li>parema tervisega. Ei tahaks lõpetada vigastuste hinnaga. Samuti peaks paranema mitmed näitajad mida mõõdetakse laboris – maksimaalne hapnikutarbimine, vererõhu näitajad, südame töö jms. </li>
</ul>
<h2>Asja võti</h2>
<p>Kui teha kohe kokkuvõte, siis tuleb öelda, et asja tuumaks on elustiili muutus. Mitte mingi kampaania “homsest sportima” ega dieet ei aita. Muutuma peab kogu komplekt – töö, vaba aeg, toitumine. Lihtne öelda, raske teha. Ja ega omakorda seda muudatust ei olegi võimalik ühekorraga või siis ühest otsast alustades teha. See muudatus on pikaajaline ja seda peab vedama mitmest otsast.</p>
<h3>Esiteks: prioriteedid paika. </h3>
<p>Enamasti on kõigil olemas vabandus – just täna on tööl väga palju teha, ainult täna jätame vahele. Kiire läheb aga mööda. Ärge saage valesti aru, ma ei kutsu üles minnalaskmisele või töö tegemata jätmisele. Kuid igal asjal on oma aeg ja kõigega tuleb hakkama saada. Kui ei tähtaeg tulemas, siis tuleb lihtsalt kauem teha, aga vahepeal tuleb trennis ära käia. Kui töötad õhtul, hommikul vara või öösel, siis ei ole enam kellelgi vahet, kas su töö valmib kell 22.00 või 23.00, peaasi et hommikuks valmis on.&#160; </p>
<p>Alustada võib väga rahulikult – ma sättisin paika kaks trenni nädalas, mida ma kunagi ära ei jätnud. Mõttekas on valida need rühmatreeningud, mis algavad kindlal ajal ja seega ei saa viilida &#8211; “lähen 30, 45, 1 tund hiljem”. </p>
<h3>Teiseks: las kõht räägib</h3>
<p>Edasi hakkas mind huvitama, kas mu söömisharjumustes on süüdi kõht või aju. Ehk, äkki suudan ma põhimõtteliselt piiri pidada ja küsimus on vaid selles, et paljud söömised on asendus- või kõrvaltegevus. </p>
<p>Ostsin täpse köögikaalu, millel on taarafunktsioon ja otsustasin võrrelda sisse söödud toidu kogust ja kaloraaži sellega, mida mu kõht selle kohta ütleb. St. kas tegelikult tekib tunne “nüüd aitab” õigel ajal. </p>
<p>Nädala jooksul kaalusin ära kõik, mis üldse suhu läks, absoluutselt ilma ühegi erandita. Ka vähima toidutüki, isegi kohvi sisse pandava tilga piima. Samal ajal jälgisin, mida mu kõht räägib. Selgus oodatud, ometi tol hetkel hämmastav tõsiasi – kõht ütles väga täpselt, millal aitab ja vajalik kalorinorm käes on. See tähendas, et kui ma söön “kõhutunde” järgi, siis ei tohiks ülekaalust juttugi olla. </p>
<p>Teise positiivse efektina sain teada, kui palju tegelikult mingi esmapilgul tühine asi võib energiat sisaldada. Hommikune võileib üks viil näiteks 150-200kcal. Tass kohvi suhkruga sinna juurde 60kcal! Kuid norm üldse on kaalu langetamisel ju 300-400kcal negatiivset bilanssi päeva kohta. Ehk kahe võileivaga võib terve dieedi juba tühistada!</p>
<h3>Kolmandaks: EI “täna söön, homme treenin” põhimõttele</h3>
<p>Nii mugav – täna söön veidi rohkem, homme teen rohkem trenni. Muidugi, nii rangelt asja võtta ei saa. Nii nagu ei ole võimalik väga täpselt jagada kaloraaži (kaalujälgijad!), ei ole ka päevad sarnased. Samuti tuleb ikka ette sünnipäevi, grilliõhtuid ja muidu üritusi. Seal ei pea nurgas istuma ja oma kapsalehte närima. Kuid ei hakanud pealkirja keerukat “valemit” välja mõtlema. Pealkirja mõte on see, et ka grillipeol süües kontrollin end ja arvutan suures järgus kalorid kokku ja siis ka järgmisel päeval tõesti püüan need omakorda maha ajada. Ehk, variatiivsus nii koormuses kui toitumises on tegelikult looduse poolt ette nähtud ja normaalne. Seda täielikult vältida ei õnnestu ja ei olegi vajalik. Kuid nädala kaloraaž peaks juba rangelt negatiivne olema. </p>
<h3>Neljandaks: kasuta ära saadud energia</h3>
<p>Ümberkorraldused ja esimesed positiivsed märgid andsid jõudu ja energiat edasi tegutseda. Märkasin, et tegelikult kompenseerub trennis veedetud aeg suurema energiaga töö tegemiseks. Midagi tegemata ei jäänud, vastupidi, aega hakkas juskui juurde tekkima. Paljud vedelemised ja laisklemised kadusid ära. Võib öelda, et 1 tund trenni = +1 tund muude tegevuste jaoks leitud aega. Või teiste sõnadega, üks tund trenni aktiviseeris vähemalt ühe tunni päevast lisaks, mis muidu möödus passiivselt. </p>
<p>Ja nii see siis hakkaski minema. Edasi lisasin juba vabatahtlikult treeninguid juurde. Rühmatreeningule (BodyPump) lisasin tagasi jõusaali 1x nädalas. Seejärel lisasin aeroobse treeningu – ratas, sõudeergomeeter vms. Seejärel täitsin ära juba kõik päevad, tulemuseks 7x trenni nädalas – 2 BP, 2-3x jõusaal, 2x aeroobne. </p>
<p>Tulemused olid juba hämmastavad esimese poole aastaga – seejuures tegin sel perioodil trenni vaid 3x nädalas. Kusjuures kaalu langus esimese kuue kuuga ei olnudki midagi erilist – 6kg. Kuid Vomaxis mõõdetud muud näidud olid kõvasti muutunud:</p>
<p>Vererõhk: 80/140</p>
<p>Veel parem, koormuse all 70/190</p>
<p>Max hapnikutarbimine: 37 mg/kg. </p>
<p>Taastumine: 3 min</p>
<p>See tõestas, et suund on õige. </p>
<h2>Kokkuvõte: kaal = kalorid sisse – liikumine</h2>
<p>Kokkuvõtteks võib öelda, et väga triviaalne põhimõte – kaal sõltub sissesöödud ja kulutatud kalorite vahest – töötab sama raudselt nagu gravitatsioon ja päikesetõus hommikul. Kõikvõimalikud imedieedid on suur jama, ühed on teisest paremad vaid selle poolest kuivõrd katavad organismi toitainete vajaduse – ühekülgselt või mitmekülgselt. Tulemus aga sõltub sisse söödud ja kulutatud energiast. Mitte mingid imed ei ole võimalikud. Tuleb teha tööd ja mitte õgida. </p>
<p>Küll aga on selle valemi “kogemine” väga huvitav kogemus. </p>
<ul>
<li>Alustasin 2-3x nädalas, trennis kulutatud kaloreid 2400 nädalas (kuna Vomaxis mõõdeti hapnikutarbimine täpselt, samuti pulss, siis pulsikell näitas täpselt). Vähendasin toitu peale trenni, st. trennijärgsetel õhtutel. Kaal langes 6kg 6 kuuga. Siis jäi aga püsima. </li>
<li>Otsustasin midagi ette võtta. Selge see, et nüüd ammugi mingeid “lollusi” tegema ei hakanud. Valem oli selge: rohkem trenni, vähem kaloreid. Hakkasin treenima 5x nädalas, lisasin intensiivsed kaloripõletamised. Osa toidust asendasin täielikult Biolabi pulbritega. Järk-järgult. Kõik hakkas liikuma jälle, jõudsin 102 kiloni. Edasi tekkis aga jälle seisak. Aeg: 1 aasta ja paar kuud möödas. </li>
<li> Nüüdseks oli aga kõht harjunud ütlema, millal aitab toidust. Kuid ainult koguseliselt. Samuti oli aga keha harjunud puhtamate toitudega. Igasugused ekstravagantsused ja niisama maiustamised gurmeega olid kadunud ja ega neist kahju ei olnud. Nüüd oli käes aeg kolmandaks muudatuseks. 7x nädalas trenn ja toit pudrud, salatid ja valgupulber (peamiselt jõusaali tarbeks). Järgnes vabalangus 93 kiloni, mis kestab edasi. Rasvaprotsent on 16% (nahavoldi mõõtmise järgi). </li>
</ul>
<p>Ja lõpetuseks ka teistest näitajatest. </p>
<ul>
<li>Jõusaalis on lisandunud raskusi tunduvalt. Samas olen üle läinud loomulikumatele baasharjutustele – lõuatõmbed, kükid kangiga, vaba kangiga harjutused jms. masinate asemel. </li>
<li>Sõudeergomeetril 500m keskmine aeg 45 minuti jooksul 2:57. 500m aeg 1:28. </li>
<li>Max hapnikutarbimine 48, pulss istudes 55. </li>
<li>Enesetunne hea, energiat palju, pulbri ja putrudega rahul <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/neemevool.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/neemevool.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/neemevool.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/neemevool.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/neemevool.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/neemevool.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/neemevool.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/neemevool.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/neemevool.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/neemevool.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/neemevool.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/neemevool.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/neemevool.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/neemevool.wordpress.com/13/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=neemevool.wordpress.com&amp;blog=3487776&amp;post=13&amp;subd=neemevool&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://neemevool.wordpress.com/2009/07/31/uus-imedieet-20kg/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b701928efb475985e5d9e3d83512adc9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">neemevool</media:title>
		</media:content>
	</item>
		<item>
		<title>Ristiretk MS Entity Framework p&#252;hale maale</title>
		<link>http://neemevool.wordpress.com/2008/06/26/ristiretk-ms-entity-framework-phale-maale/</link>
		<comments>http://neemevool.wordpress.com/2008/06/26/ristiretk-ms-entity-framework-phale-maale/#comments</comments>
		<pubDate>Thu, 26 Jun 2008 06:44:19 +0000</pubDate>
		<dc:creator>neemevool</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://neemevool.wordpress.com/2008/06/26/ristiretk-ms-entity-framework-phale-maale/</guid>
		<description><![CDATA[Nüüdseks umbes kaks aastat tagasi kirjutasin ühe programmi, millega saab genereerida SQL 2005 andmebaasi struktuurist C# klasse ehk vaese mehe ORM. Hiljem lisandusid võimalused genereerida neid olemeid manipuleerivad meetodid a la SaveEntity, DeleteEntity, FillEntityList jms. Samuti tekkisid SQL Compactiga sünkroniseerimist võimaldavad veebiteenused. Ma ei pidanud seda rakendust kunagi täiemahuliste kommerts-ORMide konkurendiks, selle eeliseks oli aga [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=neemevool.wordpress.com&amp;blog=3487776&amp;post=10&amp;subd=neemevool&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Nüüdseks umbes kaks aastat tagasi kirjutasin ühe programmi, millega saab genereerida SQL 2005 andmebaasi struktuurist C# klasse ehk vaese mehe ORM. Hiljem lisandusid võimalused genereerida neid olemeid manipuleerivad meetodid a la SaveEntity, DeleteEntity, FillEntityList jms. Samuti tekkisid SQL Compactiga sünkroniseerimist võimaldavad veebiteenused. </p>
<p>Ma ei pidanud seda rakendust kunagi täiemahuliste kommerts-ORMide konkurendiks, selle eeliseks oli aga täielik kontroll koodi üle mida see genereeris. Samuti genereeris see koodi, mis vastas täpselt just WinForms rakenduste vajadustele, mida paljud kommerts-ORMidki kahe silma vahele olid jätnud, näiteks OnChanged sündmused andmesidumise võimaldamiseks. Sestap ei pühendanud selle arendamisele enam aega kui hädavajalik. </p>
<p>Juba Teched 2007-l Hispaanias 2007 aasta novembris jagas MS laiali ajakirju, kus tutvustati kohe-kohe saabuvat MS Entity Frameworki, mis promo järgi pidi olema võimsaim ORM ever. See oli teine põhjus, miks ma ei arendanud enda töövahendit eriti tugevalt edasi. </p>
<p>See oli sissejuhatus, edasi tuleb aga ristiretke kirjeldus, mis lõpeb sellega, et maandusin esialgu jällegi &#8220;vana hea&#8221; ise genereeritud ORMi otsa ja uus ristiretk on kavas aastal 2009. </p>
<h2>Esimene: kodust minema!</h2>
<p>Projekteerides anno 2008 uut suuremat rakendust, tekkis küsimus, kas saaks ehk optimeerida klassikalise veebiteenustel töötava WinForms rakenduse arendustsüklit andmebaas-&gt;C# olemid-&gt;tüpiseeritud ASP.NET veebiteenus-&gt;SCSF andmeteenus-&gt;C# klient-olemid. Kuigi mul oli käepärast seesama enda arendatud ORM tööriist, suunasin otsingud kahele peamisele suunale.</p>
<h2>Teine: SQL 2005 HTTP Endpoints ehk SQL 2005 veebiteenused</h2>
<p>SQL 2005 server sisaldab võimalust näidata protseduure, funktsioone ja päringuid otse täiemahuliseks SOAP veebiteenuseks, kus ka WSDL kaasas. Seega kujuneks veebiteenuse kasutamine äärmiselt lihtsaks &#8211; kirjutada protseduur -&gt; avada HTTP endpoint -&gt; genereerida rakenduses wsdlist proxy klassid. Esiteks, elimineeritud oleks vajadus üleüldse mingit veebiteenuse koodi kirjutada (HTTP endpoint avamine on lihtne ja selle tekitamise saab lisada näiteks andmebaasi paigaldamise koodi, kuna on tavaline T-SQL). </p>
<h2>Kolmas: WSDL tupiktee &#8211; olemite ühesuunaline liiklus</h2>
<p>Loomulikult aga soovisin ma veebiteenust panna välja näitama mitte primitiivtüüpe vaid objekte, mida saaks tarbida otse või läbi vahekonverteri (mida saaks vähemalt automaatselt genereerida) normaalses OOP rakenduses. HTTP endpointe kasutades on see isegi teoreetiliselt võimalik: 1) deklaratsioonis saab ette anda ise genereeritud WSDLi, mis võib olla milline iganes. 2) veebiteenus ise ehk protseduur, mida see eksponeerib võib tagastada näiteks SQL serveri XML andmetüübi. Siit oleks vaid üks lühike samm rakenduseni. Siiski nõuab kokkuvõttes eriti just &#8220;tavapärase&#8221; tüpiseeritud veebiteenusega analoogse WSDLi moodustamine tuntavat pingutust, sest kuigi &#8220;for XML&#8221; päringud saab panna väljastama ka mitte tulemust, vaid XML schemat, on saadud XML schema vaid päringu tulemuse kirjeldus primitiividena, mitte aga mingi olemina. Ok, teostatav. Kuid veel suurem takistus ilmneb olemite tagastamisel ehk näiteks SaveEntity(Entity x) loomisel. Kui väljastamisel oli teoreetiliselt võimalik veel vajalik WSDL saavutada (vihje: XML andmetüüp sproc väljundina &#8211; ärge küsige minult näitekoodi, viskasin lõpuks kõik minema ja katsefaile otsida ei viitsi), siis nn. tagasisalvestamisel oleks vastupidine trikk kindlalt hambad murdnud (siiski võimalik &#8211; XML andmetüüp -&gt; SQL 2005 XML XQUERY sproc muutujateks -&gt; sproc salvestamine.) Kokku aga siiski juba nii palju lisatööd, et muudab mängu mõttetuks. Ehk, kogu HTTP endpointide ilu&nbsp; rikkus ära just salvestusoperatsioonide keerukus. </p>
<p>Ja lõpuks leidsin MS blogidest vihje, et SQL 2008-s on HTTP Endpointid nagunii &#8220;deprecated&#8221; ja asendatakse peagi ADO.NET Data Services tehnoloogiaga, mis töötab ADO.NET Entity Framework peal ja on veelgi vingem. Otsustasin, et uue projekti jaoks ei ole ilmselt mõistlik kasutada tehnoloogiat, mis on järgmises versioonis &#8220;vananenud&#8221;. Muidugi, kuni lõpeb 2005 tugi kuluks veel aastaid ja ilmselt sureks ka uus rakendus enne kui SQL 2005, tekitab probleeme hoopis paanika, mis arendajate seas tekib kohe kui MS teatab millegi &#8220;deprekeerimisest&#8221; &#8211; HTTP endpointide kohta leiab niigi vähe infot, ja ilmselt seda juurde ka ei tule kuna tehnoloogia on kuulutatud kaduvaks. </p>
<p>Kokkuvõte &#8211; SQL 2005 endpoints on hea vahend näidata välja ad hoc andmeid ilma massiivse veebiteenuse koodi kirjutamiseta. Näiteks tarbimiseks Excelis vms. kus peamiselt liiguvad andmed ühes suunas. Kuid klassikalise OOP CRUD süsteemi jaoks on kõlbmatu. </p>
<h2>Neljas: ADO.NET Data Services tõotatud maa</h2>
<p>ADO.NET Data Services on just jõudnud koodnimest Astoria viimase beetani, ametlik ADO.NET Data Services ja Entity Framework peaks valmis saama selleks sügiseks ehk täpselt õigeks ajaks. Hetkel (juuni 2008) väljas olevas .NET 3.5 SP1 beetas ilmselt ei muutu enam dramaatiliselt midagi peale bugfixide (nagu MS projekti tiim kirjutab, vt. Astoria Team Blog). Seega väga sobiv kandidaat &#8211; uus, värske, peagi valmis ja ilmselt niipea ei &#8220;vanane&#8221;. </p>
<p>Esimeste olemite genereerimine baasist, nende eksponeerimine veebiteenustes kulges suuremate tõrgeteta ja tuleb tunnistada, et võrreldes SQL 2005 HTTP endpointidega on OOP CRUD väga lihtne. Hoolimata sellest, et süsteem tuleb esialgu paigutada ASP.NET veebiteenusesse, käib kogu vajaliku koodi genereerimine automaatselt ja seega võib selle pidada hallatavuselt ekvivalentseks HTTP endpointidega hoolimata rakenduse asumisest kahel platvormil. </p>
<p>Esimene tõrge tekkis aga protseduuride välja näitamisel. Nimelt peale esimest kahte triviaalset tabelit oli vaja kolmanda sammuna näidata andmeid, mille arvutamine sprocina oli ainumõeldav. Tegu oli teatava ajagraafiku arvutamisega, kus lähteandmeteks on loetelu sündmuste toimumisest &#8211; kas üksikute kuupäevadena või siis korduvusreeglitena, millest tuli lahutada nn. erandkuupäevad. Kasutajale ja ka andmebaasile on kõige sõbralikum sellist infot hoida kahes tabelis &#8211; graafik ise (sh. korduvused kujul intervalli algus, intervalli lõpp, korduvusreegel) ja erandid (mis lülitasid korduvusreeglist teatud kuupäevad välja &#8211; näiteks &#8220;igal nädalal teisipäeviti, välja arvatud 23. juuni&#8221;). Nende pealt aga tuleb graafikus kuvamiseks komponeerida lõplik graafik. Muidugi, seda saaks teha ka veebiteenuses otse ja C# koodis oleks see triviaalne. Kuid probleemiks oli see, et graafikut vajavad ka moodulid, mis ei tarvita veebiteenust. Seega oleks äriloogika paiknenud mitmes kohas. </p>
<p>Seega oli vaja kuvada ADO.NET Data Services abil välja sproci andmed. Ma arvasin, et see on triviaalne, sest a) esialgne Astoria manuaal kirjeldas seda b) minu jaoks oli ilmne, et maailmas, kus suur osa andmete ligipääsu on teostatud sprocidena (seda on ju jutlustatud aastaid), ei saa ADO.NET Data Services ilma selleta läbi. </p>
<p>Tõde oli aga kohutav &#8211; ADO.NET Entity Framework v.1.0 ei toeta nn. read sproce ehk sproc-&gt;ADO.NET Entity-&gt;teenus. Sprocidel on koht vaid CUD (Create, Update, Delete) maatriksis, kus on võimalik andmete manipuleerimisse sekkuda. </p>
<p>Erinevalt HTTP Endpointide tupikust, kust (kuna lubati uut võimsamat Entity Frameworki) kiiresti tagasi pöördusin, tegin siin mitmeid kiireid otsinguid probleemi lahendamiseks. </p>
<p>1. suvaline sproc on võimalik kenasti importida EF (Entity Framework) Function Impordiks ja seda saab otse [WebGet] või [WebInvoke] meetodis kasutada nii, et ei ole vaja minna veel Data Services tehnoloogiat mõttetuks muutva SQL kirjutamiseni. Kuid, IEnumerable [WebGet]&nbsp; meetodi kutsub EF kliendi osa välja kujul WebGetMethodName()?args isegi juhul, kui anda sellele parameetrid. Jah, eemaldades () sulud väljakutses (näiteks kirjutades päringu otse brauserisse või siis käsitsi koostades päringu urli, mitte dataContext.AddParameter) kõik töötab &#8211; kuid vaid seni, kuni MS otsustab selle &#8220;augu&#8221; likvideerida RTMis. Seega oleks oma koodi sellele häkile üles ehitada ohtlik. </p>
<p>2. WebGeti kirjutamine IQueryablet tagastavaks nõuab klassi koostamist, mis implementeerib IQueryable. Sproci wrapper seda ei ole. Lisaks ilmusid blogidesse ja foorumitesse teated, et &#8220;returning primitive types as IQueryable&lt;type&gt; is not supported&#8221; &#8211; anymore. Seega ei maksaks ehitada üleüldse oma lootusi seda RTMis näha, isegi kui ehitaks valmis IQueryable objekti sproc tulemuse peale (mida ma ka isegi tegin). </p>
<p>3. Well, edasi on võimalus luua &#8220;legaalne&#8221; EF olem, mida IQueryable Webget probleemideta väljastab ja ADO.NET Data Services klient ka korrektselt tarbib. Kuid, ärge lootkegi et saate EF olemi väljastada sproci tulemusena. Ehk, lugege edasist nagu anekdooti, kus puänt on viimasel real:</p>
<p>a) Olemi (Entity) loomine on täiesti ok ja loomulikult legaalne tegevus</p>
<p>b) sprocist, mis tagastab täpselt olemile vastava signatuuriga andmed, saab legaalsete vahenditega luua Function Impordi. Disaineris saab sproc tagastatavaks andmetüübiks valida loodud olemi (sic!). Kuid sellega ei ole halligi edasi teha. Loe edasi &#8230;</p>
<p>c) VS keeldub rakendust kompileerimast, sest &#8220;entity is not mapped&#8221;. Nimelt, iga olem peab olema mäpitud _tabelile_ (WTF see sproci andmetüübi määramine siis üldse on??).</p>
<p>d) Nüüd algab nali. MS EF tiimi liikmed annavad foorumites soovitusi, mida kadestaks isegi Dogbert Dilberti koomiksites. Jah, .edmx xml failidesse saab tekitada &#8220;virtuaalsed&#8221; tabelid käsitsi XMLi tehes, millest omakorda saab mäppida väljad sproci väljundisse &#8211; ja kõik töötab. Usinamad tiimiliikmed on teinud lausa tutorialid, mõned lausa edmx faili &#8220;tweakimise&#8221; utiliidid. Kuid puänt on selles, et kogu &#8220;lisatud&#8221; kood lendab vastu taevast kohe, kui te soovite lisada või uuendada mõnda &#8220;legaalset&#8221; tabelit andmebaasist. MS koodi genereerimise utiliit mitte ei uuenda vastavaid lõike koodis vaid genereerib kogu koodi uuesti. Ja kogu töö on vastu taevast. Tunnen kaasa neile õnnetutele foorumi külastajatele, kes kurdavad isegi kuni kahest kuust raisatud ajast, kuni jõuti sproci teemani. </p>
<p>Ma ei suuda uskuda, kuidas on võimalik et MS ignoreeris algusest peale seda ilmset fakti, et de facto on suur osa andmeloogikat ehitatud sprocidesse ja mitte ainult CUD loogika. </p>
<p>ADO.NET Data Services Program Manager aga tunnistab lõpuks tehtud jama ja ütleb, et &#8220;read&#8221; sprocide tugi tuleb Entity Framework v. 2-te. Ja millal tuleb Entity Framework v. 2? &#8220;somewhere in 2009&#8243;. Seniks aga kasutage MS poolt kiiresti kokku häkitud &#8220;EF Extensione&#8221; ehk C# koodi millega saab EF-ist ikkagi sprocide andmeid kätte. Edu neile, kes julgevad kasutada selliseid häkke, mille MS võib iga hetk aknast välja visata. </p>
<h2>Viies: tagasi koju, püha Graal jäi leidmata</h2>
<p>Kokkuvõte &#8211; ADO.NET Data Services ja Entity Framework on kahtlemata suurepärane ORM ja triviaalse CRUD koodi kirjutamine võrreldes HTTP endpointidega või mõne muu ORMiga on mugav ja kiire. Kuid selles haigutab meeletu auk kohas, kus andmed ei paikne lihttabelites. Samuti teeb ettevaatlikuks kogu projekti kestel mitu korda muutunud reeglid veebiteenuste tarbmisel. Seega lükkan EF kasutamise edasi aastasse 2009 EF 2.0-ni (kui selleks ajaks see projekt veel elab) ja kasutan end tõestanud kommerts-ORMe või siis oma vana head kodukootud rakendust.</p>
<h2>Epiloog: kodumaja on alles</h2>
<p>Siiski, kuna lõin EF-t tarvitava rakenduse SCSF ja OOP klassikalisi reegleid järgides, kulus EF-&gt;enda ORM modifikatsiooniks vaid paar loetud tundi. Kuna rakendus oli arhitektuurselt jaotatud MVP mustriks, kus teenus kasutas ADO.NET Data Services teenuseid läbi EF Data Contect peale loodud wrapperite, pidin muutma vaid reaalselt EF-i päringuid tegeva koodi SOAP WS päringuid saatvaks koodiks. Kõik muu töötas edasi. Fantastiline. </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/neemevool.wordpress.com/10/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/neemevool.wordpress.com/10/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/neemevool.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/neemevool.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/neemevool.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/neemevool.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/neemevool.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/neemevool.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/neemevool.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/neemevool.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/neemevool.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/neemevool.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/neemevool.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/neemevool.wordpress.com/10/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/neemevool.wordpress.com/10/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/neemevool.wordpress.com/10/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=neemevool.wordpress.com&amp;blog=3487776&amp;post=10&amp;subd=neemevool&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://neemevool.wordpress.com/2008/06/26/ristiretk-ms-entity-framework-phale-maale/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b701928efb475985e5d9e3d83512adc9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">neemevool</media:title>
		</media:content>
	</item>
		<item>
		<title>ClickOnce rakenduse publitseerimine TFS 2008 Team Build abil</title>
		<link>http://neemevool.wordpress.com/2008/05/13/clickonce-rakenduse-publitseerimine-tfs-build-abil/</link>
		<comments>http://neemevool.wordpress.com/2008/05/13/clickonce-rakenduse-publitseerimine-tfs-build-abil/#comments</comments>
		<pubDate>Tue, 13 May 2008 17:17:26 +0000</pubDate>
		<dc:creator>neemevool</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://neemevool.wordpress.com/2008/05/13/clickonce-rakenduse-publitseerimine-tfs-build-abil/</guid>
		<description><![CDATA[Selle teksti mõte on dokumenteerida enda tarbeks ClickOnce abil publitseeritava rakenduse komplekteerimine TFS build abil, kuna MSDN abitekstid (http://msdn.microsoft.com/en-us/library/xc3tc5xx.aspx) osutusid jällegi puudulikeks, vigasteks ja eksitavateks (jätsin sinna ka kommentaari). Teiseks, eriti just SCSF rakenduse publitseerimisel ei saa kasutada out-of-the-box TFS Team Buildi, sest see nõuab projekti ülesehitust, kus kogu SCSF mõte kaob. SCSF tugevus seisneb [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=neemevool.wordpress.com&amp;blog=3487776&amp;post=6&amp;subd=neemevool&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Selle teksti mõte on dokumenteerida enda tarbeks ClickOnce abil publitseeritava rakenduse komplekteerimine TFS build abil, kuna MSDN abitekstid (<a title="http://msdn.microsoft.com/en-us/library/xc3tc5xx.aspx" href="http://msdn.microsoft.com/en-us/library/xc3tc5xx.aspx">http://msdn.microsoft.com/en-us/library/xc3tc5xx.aspx</a>) osutusid jällegi puudulikeks, vigasteks ja eksitavateks (jätsin sinna ka kommentaari).</p>
<p>Teiseks, eriti just SCSF rakenduse publitseerimisel ei saa kasutada out-of-the-box TFS Team Buildi, sest see nõuab projekti ülesehitust, kus kogu SCSF mõte kaob. SCSF tugevus seisneb aga selles, et rakendus on võimalik kokku panna erinevate arendajate poolt loodud moodulitest, mis ei pruugi olla ühes versioonikontrolli harus ega isegi mitte samas serveris. Või siis tarnivad mõned arendajad oma mooduli .dllina. Seega on vaja süsteemi, kus Team Build abil on võimalik kogu Smart Client rakendus kokku panna nö. algosadest. </p>
<p>ClickOnce rakenduse publitseerimisel võib olla vähemalt kaks lähtepunkti:</p>
<ol>
<li>rakendus on kompileeritud (dll-id, konfiguratsioonifailid jms.) ja see on vaja vaid komplekteerida (näiteks SmartClient) lisades/eemaldades komponente.
<li>rakendus on lähtekoodi kujul, vaja on kompileerida ja publitseerida. </li>
</ol>
<p>Alljärgnev sobib mõlemale juhule, punkt 1. on punkti 2. alamosa.</p>
<h2>1. Ettevalmistused</h2>
<p>ClickOnce rakendus on kohustuslik signeerida. Selleks on vaja signeerimissertifikaati. Testrakenduse signeerimiseks sobib ka ise genereeritud sertifikaat. Windows SDK-s on selleks tööriist makecert</p>
<p>1. Loo sertifikaat: makecert -sv mykey.pvk -n &#8220;CN=myname&#8221; mykey.cer genereerib nii privaatvõtme kui ka sertifikaadi. CN=myname on muidugi vaid osa sertifikaadi tunnusest, reaalse sertifikaadi genereerimiseks on vaja rohkem infot.</p>
<p>2. Loo signeerimiseks vajalik võtmefail utiliidiga pvk2pfx: pvk2pfx -pvk mykey.pvk -spc mykey.cer -pfx mykey.pfx -po pfxparool, kus pfx parool on eraldi parool allkirjastamisel pfx võtme avamiseks ja ei tohiks olla sama mis privaatvõtme ja sertifikaadi genereerimisel.</p>
<p>3. Kontrolli, kas masinas (seega siis Team Build masin), kus töötad, on Publisher info olemas. Nimelt on ClickOnce publikatsiooni puhul vajalik Publisher info. Selle võid enne signeerimist kirjutada publikatsiooni manifesti teegina</p>
<p>&lt;description asmv2:publisher=&#8221;&lt;fimanimi&gt;&#8221; asmv2:product=&#8221;&lt;tootenimi&gt;&#8221; asmv2:supportUrl=&#8221;&lt;tugilehe URL&gt;&#8221; xmlns=&#8221;urn:schemas-microsoft-com:asm.v1&#8243; /&gt;</p>
<p>või siis märkida registrisse võtme<br />HKEY_LOCAL_MACHINE\SOFTWARE\MIcrosoft\Windows\<br />WIndowsNT\CurrentVersion\RegisteredOrganization alla.</p>
<h2>2. Koodi ja teekide alla laadimine </h2>
<p>Et me saaks koodi jms. laadida alla suvalistest versioonikontrolli harudest, peame ise tekitama workspace ja selle mappingud. Defineerime kogu keskkonna põhimuutujad &#8211; kuhu lähevad kompileeritud asjad, kuhu tõmmatakse lähtekoodid ja mis on loodava workspace nimi:</p>
<div style="font-size:10pt;font-family:monospace;background-color:white;"><span style="color:blue;">&lt;</span><span style="color:#a31515;">PropertyGroup</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">OutputPath</span><span style="color:blue;">&gt;</span><span style="color:black;">C:\TFSBuilds\projekt\bin\</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">OutputPath</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">RootPath</span><span style="color:blue;">&gt;</span><span style="color:black;">C:\TFSBuilds\projekt\</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">RootPath</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">WorkspaceName</span><span style="color:blue;">&gt;</span><span style="color:black;">projektDEV</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">WorkspaceName</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Tf</span><span style="color:blue;">&gt;</span><span style="color:black;">tf</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">Tf</span><span style="color:blue;">&gt;<br />&lt;/</span><span style="color:#a31515;">PropertyGroup</span><span style="color:blue;">&gt;</span></div>
<p>Edasi defineerime versioonikontrolli mappingud töökeskkonda:</p>
<div style="font-size:10pt;font-family:monospace;background-color:white;"><span style="color:blue;">&lt;</span><span style="color:#a31515;">ItemGroup</span><span style="color:blue;">&gt;<br />&lt;</span><span style="color:#a31515;">WorkspaceMapping</span><span style="color:blue;"> </span><span style="color:red;">Include</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$/DEV/kood</span><span style="color:black;">&#8220;</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">LocalPath</span><span style="color:blue;">&gt;</span><span style="color:black;">$(RootPath)kood</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">LocalPath</span><span style="color:blue;">&gt;<br />&lt;/</span><span style="color:#a31515;">WorkspaceMapping</span><span style="color:blue;">&gt;</span> </div>
<div style="font-size:10pt;font-family:monospace;background-color:white;"><span style="color:blue;">&lt;/</span><span style="color:#a31515;">ItemGroup</span><span style="color:blue;">&gt;</span> </div>
<p>Muidugi võib neid mappinguid olla rohkem.</p>
<p>Seejärel tekitame töökeskkonna targetiga CreateWorkspace:</p>
<div style="font-size:10pt;font-family:monospace;background-color:white;"><span style="color:blue;">&lt;</span><span style="color:#a31515;">Target</span><span style="color:blue;"> </span><span style="color:red;">Name</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">CreateWorkspace</span><span style="color:black;">&#8220;</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;!&#8211;</span><span style="color:green;"> Checking input parameters </span><span style="color:blue;">&#8211;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Error</span><span style="color:blue;"> </span><span style="color:red;">Condition</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(WorkspaceName) == &#8221;</span><span style="color:black;">&#8220;</span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">Text</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Please specify WorkspaceName property</span><span style="color:black;">&#8220;</span><span style="color:blue;">/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Error</span><span style="color:blue;"> </span><span style="color:red;">Condition</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(RootPath) == &#8221;</span><span style="color:black;">&#8220;</span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">Text</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Please specify RootPath property</span><span style="color:black;">&#8220;</span><span style="color:blue;">/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Error</span><span style="color:blue;"> </span><span style="color:red;">Condition</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">!HasTrailingSlash(&#8216;$(RootPath)&#8217;)</span><span style="color:black;">&#8220;</span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">Text</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Please make sure RootPath is slash terminated</span><span style="color:black;">&#8220;</span><span style="color:blue;">/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Exec</span><span style="color:blue;"> </span><span style="color:red;">Command</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(Tf) workspace /delete </span><span style="color:red;">&amp;quot;</span><span style="color:blue;">$(WorkspaceName)</span><span style="color:red;">&amp;quot;</span><span style="color:black;">&#8220;</span><span style="color:blue;"> </span><span style="color:red;">ContinueOnError</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">true</span><span style="color:black;">&#8220;</span><span style="color:blue;"> </span><span style="color:red;">IgnoreExitCode</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">true</span><span style="color:black;">&#8220;</span><span style="color:blue;">/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;!&#8211;</span><span style="color:green;"> Create new workspace</span><span style="color:blue;">&#8211;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Exec</span><span style="color:blue;"> </span><span style="color:red;">Command</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(Tf) workspace /new /noprompt </span><span style="color:red;">&amp;quot;</span><span style="color:blue;">$(WorkspaceName)</span><span style="color:red;">&amp;quot;</span><span style="color:black;">&#8220;</span><span style="color:blue;"> /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;!&#8211;</span><span style="color:green;"> Remove default mapping </span><span style="color:blue;">&#8211;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Exec</span><span style="color:blue;"> </span><span style="color:red;">Command</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(Tf) workfold /unmap /workspace:</span><span style="color:red;">&amp;quot;</span><span style="color:blue;">$(WorkspaceName)</span><span style="color:red;">&amp;quot;</span><span style="color:blue;"> $/</span><span style="color:black;">&#8220;</span><span style="color:blue;">/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;!&#8211;</span><span style="color:green;"> Create new mappings (uses MSBuild batching) </span><span style="color:blue;">&#8211;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Exec</span><span style="color:blue;"> </span><span style="color:red;">Command</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(Tf) workfold /map </span><span style="color:red;">&amp;quot;</span><span style="color:blue;">%(WorkspaceMapping.Identity)</span><span style="color:red;">&amp;quot;</span><span style="color:blue;"> </span><span style="color:red;">&amp;quot;</span><span style="color:blue;">%(WorkspaceMapping.LocalPath)</span><span style="color:red;">&amp;quot;</span><span style="color:blue;"> /workspace:</span><span style="color:red;">&amp;quot;</span><span style="color:blue;">$(WorkspaceName)</span><span style="color:red;">&amp;quot;</span><span style="color:black;">&#8220;</span><span style="color:blue;">/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;!&#8211;</span><span style="color:green;"> Great success! </span><span style="color:blue;">&#8211;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Message</span><span style="color:blue;"> </span><span style="color:red;">Text</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Workspace &#8216;$(WorkspaceName)&#8217; created sucessfully</span><span style="color:black;">&#8220;</span><span style="color:blue;">/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;!&#8211;</span><span style="color:green;"> List created mappings </span><span style="color:blue;">&#8211;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Exec</span><span style="color:blue;"> </span><span style="color:red;">Command</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(Tf) workfold /workspace:</span><span style="color:red;">&amp;quot;</span><span style="color:blue;">$(WorkspaceName)</span><span style="color:red;">&amp;quot;</span><span style="color:black;">&#8220;</span><span style="color:blue;">/&gt;<br />&lt;/</span><span style="color:#a31515;">Target</span><span style="color:blue;">&gt;<br /></span></div>
<p>Laeme alla koodi loodud workspace:</p>
<div style="font-size:10pt;font-family:monospace;background-color:white;"><span style="color:blue;">&lt;</span><span style="color:#a31515;">Target</span><span style="color:blue;"> </span><span style="color:red;">Name</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">GetProjects</span><span style="color:black;">&#8220;</span><span style="color:blue;"> </span><span style="color:red;">DependsOnTargets</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">CreateWorkspace</span><span style="color:black;">&#8220;</span><span style="color:blue;">&gt;</p>
<p>&lt;!&#8211;</span><span style="color:green;"> Get the sources for the given workspace</span><span style="color:blue;">&#8211;&gt;<br />&lt;</span><span style="color:#a31515;">Get</span><span style="color:blue;"> </span><span style="color:red;">TeamFoundationServerUrl</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(TeamFoundationServerUrl)</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">BuildUri</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(BuildUri)</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">Workspace</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(WorkspaceName)</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">Version</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">T</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">Filespec</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$/DEV/kood</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">PopulateOutput</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(GetPopulateOutput)</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">Overwrite</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(GetOverwrite)</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">Preview</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(PreviewGet)</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">Recursive</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(RecursiveGet)</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">Force</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(ForceGet)</span><span style="color:black;">&#8220;</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Output</span><span style="color:blue;"> </span><span style="color:red;">TaskParameter</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Gets</span><span style="color:black;">&#8220;</span><span style="color:blue;"> </span><span style="color:red;">ItemName</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Gets</span><span style="color:black;">&#8220;</span><span style="color:blue;"> /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Output</span><span style="color:blue;"> </span><span style="color:red;">TaskParameter</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Replaces</span><span style="color:black;">&#8220;</span><span style="color:blue;"> </span><span style="color:red;">ItemName</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Replaces</span><span style="color:black;">&#8220;</span><span style="color:blue;"> /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Output</span><span style="color:blue;"> </span><span style="color:red;">TaskParameter</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Deletes</span><span style="color:black;">&#8220;</span><span style="color:blue;"> </span><span style="color:red;">ItemName</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Deletes</span><span style="color:black;">&#8220;</span><span style="color:blue;"> /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Output</span><span style="color:blue;"> </span><span style="color:red;">TaskParameter</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Warnings</span><span style="color:black;">&#8220;</span><span style="color:blue;"> </span><span style="color:red;">ItemName</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">GetWarnings</span><span style="color:black;">&#8220;</span><span style="color:blue;"> /&gt;<br />&lt;/</span><span style="color:#a31515;">Get</span><span style="color:blue;">&gt;</span></div>
<div style="font-size:10pt;font-family:monospace;background-color:white;"><span style="color:blue;">&lt;/</span><span style="color:#a31515;">Target</span><span style="color:blue;">&gt;</span> </div>
<p>Kus siis Filespec tähistab mingit elementi (haru, fail vms.) versioonikontrollist. Get lõiku kordame nii palju kui vaja, soovi korral võime laadida ka mitte viimase, vaid mingi muu versiooni jne.</p>
<p>Edasi puhastame kompileerimiskoha:</p>
<div style="font-size:10pt;font-family:monospace;background-color:white;"><span style="color:blue;">&lt;</span><span style="color:#a31515;">Target</span><span style="color:blue;"> </span><span style="color:red;">Name</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">ClearBin</span><span style="color:black;">&#8220;</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">RemoveDir</span><span style="color:blue;"> </span><span style="color:red;">Directories</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(OutputPath)</span><span style="color:black;">&#8220;</span><span style="color:blue;">/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">MakeDir</span><span style="color:blue;"> </span><span style="color:red;">Directories</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(OutputPath)</span><span style="color:black;">&#8220;</span><span style="color:blue;">/&gt;<br />&nbsp;&nbsp;&nbsp; <br />&lt;/</span><span style="color:#a31515;">Target</span><span style="color:blue;">&gt;</span> </div>
<p>Seejärel kompileerime projektid, mille tõmbasime alla lähtekoodina:</p>
<div style="font-size:10pt;font-family:monospace;background-color:white;"><span style="color:blue;">&lt;</span><span style="color:#a31515;">Target</span><span style="color:blue;"> </span><span style="color:red;">Name</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">CustomBuild</span><span style="color:black;">&#8220;</span><span style="color:blue;"> </span><span style="color:red;">DependsOnTargets</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">CopyLibraries</span><span style="color:black;">&#8220;</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">MSBuild</span><span style="color:blue;"> </span><span style="color:red;">Projects</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(RootPath)kood\kood.csproj</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">Properties</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">OutputPath=$(OutputPath);NoWin32Manifest=true;</span><span style="color:black;">&#8220;</span><span style="color:blue;">/&gt;<br /></span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">Target</span><span style="color:blue;">&gt;</span> </div>
<p>VS2008 ja ClickOnce puhul on eriti oluline kompileerimislipp NoWin32Manifest=true, et kompileerimisel ei lisataks manifesti kompilatsioonidesse. Pärast rakenduse manifesti genereerimisel satub see vastuollu ClickOnce manifestiga ja tulemuseks on müstiline (MS poolt lahti seletamata) veateade &#8220;Reference in the manifest does not match the identity of the downloaded assembly&#8221;. </p>
<p>Edasi defineerime ClickOnce rakenduse versiooni ja publitseerimise muutujad, kus ShellExe on SCSF rakenduse koorik, DeploymentDir on koht, kuhu publitseeritakse rakendus (NB! versiooni alamkataloog luuakse hiljem), DeployUrl on aga koht, kust rakendus kasutajale paistma hakkab (jälle ilma versiooniharuta):</p>
<div style="font-size:10pt;font-family:monospace;background-color:white;"><span style="color:blue;">&lt;</span><span style="color:#a31515;">PropertyGroup</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Major</span><span style="color:blue;">&gt;</span><span style="color:black;">1</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">Major</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Minor</span><span style="color:blue;">&gt;</span><span style="color:black;">0</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">Minor</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Build</span><span style="color:blue;">&gt;</span><span style="color:black;">0</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">Build</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Revision</span><span style="color:blue;">&gt;</span><span style="color:black;">0</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">Revision</span><span style="color:blue;">&gt;<br />&lt;/</span><span style="color:#a31515;">PropertyGroup</span><span style="color:blue;">&gt;</span> </div>
<div style="font-size:10pt;font-family:monospace;background-color:white;"><span style="color:blue;">&lt;</span><span style="color:#a31515;">PropertyGroup</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">ShellExe</span><span style="color:blue;">&gt;</span><span style="color:black;">Shell.exe</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">ShellExe</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">DeploymentDir</span><span style="color:blue;">&gt;</span><span style="color:black;">C:\software\dev\</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">DeploymentDir</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">DeployUrl</span><span style="color:blue;">&gt;</span><span style="color:black;">http://software.dev.ee/dev/</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">DeployUrl</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">SupportUrl</span><span style="color:blue;">&gt;</span><span style="color:black;">http://www.dev.ee/</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">SupportUrl</span><span style="color:blue;">&gt;<br />&lt;/</span><span style="color:#a31515;">PropertyGroup</span><span style="color:blue;">&gt;</span> </div>
<p>Edasi defineerime rakenduse koosluse koorikust (exe), teekidest (dll) ja failidest (nii tavalised kui andmefailid):</p>
<div style="font-size:10pt;font-family:monospace;background-color:white;"><span style="color:blue;">&lt;</span><span style="color:#a31515;">ItemGroup</span><span style="color:blue;">&gt;<br />&lt;</span><span style="color:#a31515;">EntryPoint</span><span style="color:blue;"> </span><span style="color:red;">Include</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(OutputPath)$(ShellExe)</span><span style="color:black;">&#8220;</span><span style="color:blue;">/&gt;</p>
<p>&lt;</span><span style="color:#a31515;">Dependency</span><span style="color:blue;"> </span><span style="color:red;">Include</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(OutputPath)Microsoft.Practices.CompositeUI.dll</span><span style="color:black;">&#8220;</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">AssemblyType</span><span style="color:blue;">&gt;</span><span style="color:black;">Managed</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">AssemblyType</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">DependencyType</span><span style="color:blue;">&gt;</span><span style="color:black;">Install</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">DependencyType</span><span style="color:blue;">&gt;<br />&lt;/</span><span style="color:#a31515;">Dependency</span><span style="color:blue;">&gt;</span> </div>
<div style="font-size:10pt;font-family:monospace;background-color:white;"><span style="color:blue;">&lt;</span><span style="color:#a31515;">File</span><span style="color:blue;"> </span><span style="color:red;">Include</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(OutputPath)ProfileCatalog.xml</span><span style="color:black;">&#8220;</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">TargetPath</span><span style="color:blue;">&gt;</span><span style="color:black;">ProfileCatalog.xml</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">TargetPath</span><span style="color:blue;">&gt;<br />&lt;/</span><span style="color:#a31515;">File</span><span style="color:blue;">&gt;</p>
<p>&lt;</span><span style="color:#a31515;">File</span><span style="color:blue;"> </span><span style="color:red;">Include</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(OutputPath)Data\Data.sdf</span><span style="color:black;">&#8220;</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">TargetPath</span><span style="color:blue;">&gt;</span><span style="color:black;">Data\Data.sdf</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">TargetPath</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">IsDataFile</span><span style="color:blue;">&gt;</span><span style="color:black;">true</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">IsDataFile</span><span style="color:blue;">&gt;<br />&lt;/</span><span style="color:#a31515;">File</span><span style="color:blue;">&gt;</span></div>
<div style="font-size:10pt;font-family:monospace;background-color:white;"><span style="color:blue;">&lt;/</span><span style="color:#a31515;">ItemGroup</span><span style="color:blue;">&gt;</span> </div>
<p>Nüüd saame publitseerida rakenduse alamversiooniga kataloogi:</p>
<div style="font-size:10pt;font-family:monospace;background-color:white;"><span style="color:blue;">&lt;</span><span style="color:#a31515;">Target</span><span style="color:blue;"> </span><span style="color:red;">Name</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">ClickOnceDeploy</span><span style="color:black;">&#8220;</span><span style="color:blue;"> </span><span style="color:red;">DependsOnTargets</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">CustomBuild</span><span style="color:black;">&#8220;</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Version</span><span style="color:blue;"> </span><span style="color:red;">VersionFile</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(RootPath)versionnumber.txt</span><span style="color:black;">&#8220;</span><span style="color:blue;"> </span><span style="color:red;">BuildType</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">None</span><span style="color:black;">&#8220;</span><span style="color:blue;"> </span><span style="color:red;">RevisionType</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Increment</span><span style="color:black;">&#8220;</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Output</span><span style="color:blue;"> </span><span style="color:red;">TaskParameter</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Major</span><span style="color:black;">&#8220;</span><span style="color:blue;"> </span><span style="color:red;">PropertyName</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Major</span><span style="color:black;">&#8220;</span><span style="color:blue;"> /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Output</span><span style="color:blue;"> </span><span style="color:red;">TaskParameter</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Minor</span><span style="color:black;">&#8220;</span><span style="color:blue;"> </span><span style="color:red;">PropertyName</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Minor</span><span style="color:black;">&#8220;</span><span style="color:blue;"> /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Output</span><span style="color:blue;"> </span><span style="color:red;">TaskParameter</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Build</span><span style="color:black;">&#8220;</span><span style="color:blue;"> </span><span style="color:red;">PropertyName</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Build</span><span style="color:black;">&#8220;</span><span style="color:blue;"> /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Output</span><span style="color:blue;"> </span><span style="color:red;">TaskParameter</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Revision</span><span style="color:black;">&#8220;</span><span style="color:blue;"> </span><span style="color:red;">PropertyName</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Revision</span><span style="color:black;">&#8220;</span><span style="color:blue;"> /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/</span><span style="color:#a31515;">Version</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">GenerateApplicationManifest<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">AssemblyVersion</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(Major).$(Minor).$(Build).$(Revision)</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">Dependencies</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">@(Dependency)</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">Description</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Shell</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">Files</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">@(File)</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">EntryPoint</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(OutputPath)$(ShellExe)</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">OutputManifest</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(OutputPath)$(ShellExe).manifest</span><span style="color:black;">&#8220;</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Output<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">ItemName</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">ApplicationManifest</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">TaskParameter</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">OutputManifest</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/</span><span style="color:#a31515;">GenerateApplicationManifest</span><span style="color:blue;">&gt;</span></div>
<div style="font-size:10pt;font-family:monospace;background-color:white;"><span style="color:blue;">&lt;!&#8211; signeerime rakenduse manifesti &#8211;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Exec</span><span style="color:blue;"> </span><span style="color:red;">Command</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">mage -s $(OutputPath)$(ShellExe).manifest -cf $(RootPath)mykey.pfx -pwd pfxparool</span><span style="color:black;">&#8220;</span><span style="color:blue;">/&gt;</span></div>
<div style="font-size:10pt;font-family:monospace;background-color:white;"><span style="color:blue;">&lt;!&#8211; genereerime publikatsiooni manifesti &#8211;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">GenerateDeploymentManifest<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">EntryPoint</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">@(ApplicationManifest)</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">AssemblyName</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(ShellExe).application</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">AssemblyVersion</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(Major).$(Minor).$(Build).$(Revision)</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">DeploymentUrl</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(DeployUrl)$(Major)_$(Minor)_$(Build)_$(Revision)/$(ShellExe).application</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">MapFileExtensions</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">true</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">Install</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">false</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">OutputManifest</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(OutputPath)$(ShellExe).application</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">Product</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Albert Editor</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">Publisher</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">AS Firma</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">SupportUrl</span><span style="color:blue;">=</span><span style="color:black;"></span><span style="color:blue;"><a href="http://www.firma.ee/">http://www.firma.ee/</a></span><span style="color:black;"><br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">UpdateEnabled</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">false</span><span style="color:black;">&#8220;</span><span style="color:blue;">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Output<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">ItemName</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">DeployManifest</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">TaskParameter</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">OutputManifest</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/</span><span style="color:#a31515;">GenerateDeploymentManifest</span><span style="color:blue;">&gt;</span></div>
<div style="font-size:10pt;font-family:monospace;background-color:white;"><span style="color:blue;">&lt;!&#8211; signeerime publikatsiooni manifesti &#8211;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Exec</span><span style="color:blue;"> </span><span style="color:red;">Command</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">mage -s $(OutputPath)$(ShellExe).application -cf $(RootPath)mykey.pfx -pwd pfxparool</span><span style="color:black;">&#8220;</span><span style="color:blue;">/&gt;</span></div>
<div style="font-size:10pt;font-family:monospace;background-color:white;"><span style="color:blue;">&lt;!&#8211; loendame rakenduse failid &#8211;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">CreateItem</span><span style="color:blue;"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">Include</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(OutputPath)**\*.*</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">Exclude</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(OutputPath)**\*.manifest;$(OutputPath)**\*.application</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Output</span><span style="color:blue;"> </span><span style="color:red;">ItemName</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">DeploymentFiles</span><span style="color:black;">&#8220;</span><span style="color:blue;"> </span><span style="color:red;">TaskParameter</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">Include</span><span style="color:black;">&#8220;</span><span style="color:blue;">/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/</span><span style="color:#a31515;">CreateItem</span><span style="color:blue;">&gt;</span></div>
<div style="font-size:10pt;font-family:monospace;background-color:white;"><span style="color:blue;">&lt;!&#8211; kopeerime failid, andes laiendi .deploy &#8211;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Copy</span><span style="color:blue;"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">SourceFiles</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">@(DeploymentFiles)</span><span style="color:black;">&#8220;<br /></span><span style="color:blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:red;">DestinationFiles</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">@(DeploymentFiles-&gt;&#8217;$(DeploymentDir)$(Major)_$(Minor)_$(Build)_$(Revision)\%(RecursiveDir)%(Filename)%(Extension).deploy&#8217;)</span><span style="color:black;">&#8220;</span><span style="color:blue;">/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Copy</span><span style="color:blue;"> </span><span style="color:red;">SourceFiles</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(OutputPath)$(ShellExe).manifest</span><span style="color:black;">&#8220;</span><span style="color:blue;"> </span><span style="color:red;">DestinationFolder</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(DeploymentDir)$(Major)_$(Minor)_$(Build)_$(Revision)</span><span style="color:black;">&#8220;</span><span style="color:blue;">/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Copy</span><span style="color:blue;"> </span><span style="color:red;">SourceFiles</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(OutputPath)$(ShellExe).application</span><span style="color:black;">&#8220;</span><span style="color:blue;"> </span><span style="color:red;">DestinationFolder</span><span style="color:blue;">=</span><span style="color:black;">&#8220;</span><span style="color:blue;">$(DeploymentDir)$(Major)_$(Minor)_$(Build)_$(Revision)</span><span style="color:black;">&#8220;</span><span style="color:blue;">/&gt;<br /></span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">Target</span><span style="color:blue;">&gt;</span> </div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/neemevool.wordpress.com/6/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/neemevool.wordpress.com/6/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/neemevool.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/neemevool.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/neemevool.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/neemevool.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/neemevool.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/neemevool.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/neemevool.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/neemevool.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/neemevool.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/neemevool.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/neemevool.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/neemevool.wordpress.com/6/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/neemevool.wordpress.com/6/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/neemevool.wordpress.com/6/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=neemevool.wordpress.com&amp;blog=3487776&amp;post=6&amp;subd=neemevool&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://neemevool.wordpress.com/2008/05/13/clickonce-rakenduse-publitseerimine-tfs-build-abil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b701928efb475985e5d9e3d83512adc9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">neemevool</media:title>
		</media:content>
	</item>
		<item>
		<title>ID kaardi p&#245;hise autentimise seadistamine IIS 6.0-s</title>
		<link>http://neemevool.wordpress.com/2008/05/07/id-kaardi-phise-autentimise-seadistamine-iis-60-s/</link>
		<comments>http://neemevool.wordpress.com/2008/05/07/id-kaardi-phise-autentimise-seadistamine-iis-60-s/#comments</comments>
		<pubDate>Wed, 07 May 2008 13:07:58 +0000</pubDate>
		<dc:creator>neemevool</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://neemevool.wordpress.com/2008/05/07/id-kaardi-phise-autentimise-seadistamine-iis-60-s/</guid>
		<description><![CDATA[Kirjutamise põhjuseks on www.id.ee peal olev eksitav juhend: http://www.id.ee/10456?id=10737 . Selle juhendi üle on kaevanud ka teised: http://dukelupus.wordpress.com/2006/12/24/tants-id-kaardi-umber-ehk-iisi-ja-id-kaardi-suhtlema-panemine/ Kuna samuti kulutasin selle &#8220;üllitise&#8221; järgi IIS 6.0 konfigureerides mitu tundi oma aega, siis kirjutan teise versiooni sellest. Siiski, ma ei ole testinud seda lahendust kõikidel Windows serveri platvormidel, tegin selle läbi Windows Server 2003 R2, Standard [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=neemevool.wordpress.com&amp;blog=3487776&amp;post=5&amp;subd=neemevool&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Kirjutamise põhjuseks on <a href="http://www.id.ee">www.id.ee</a> peal olev eksitav juhend: <a title="http://www.id.ee/10456?id=10737" href="http://www.id.ee/10456?id=10737">http://www.id.ee/10456?id=10737</a> . Selle juhendi üle on kaevanud ka teised: <a title="http://dukelupus.wordpress.com/2006/12/24/tants-id-kaardi-umber-ehk-iisi-ja-id-kaardi-suhtlema-panemine/" href="http://dukelupus.wordpress.com/2006/12/24/tants-id-kaardi-umber-ehk-iisi-ja-id-kaardi-suhtlema-panemine/">http://dukelupus.wordpress.com/2006/12/24/tants-id-kaardi-umber-ehk-iisi-ja-id-kaardi-suhtlema-panemine/</a></p>
<p>Kuna samuti kulutasin selle &#8220;üllitise&#8221; järgi IIS 6.0 konfigureerides mitu tundi oma aega, siis kirjutan teise versiooni sellest. </p>
<p>Siiski, ma ei ole testinud seda lahendust kõikidel Windows serveri platvormidel, tegin selle läbi Windows Server 2003 R2, Standard Edition, Service Pack 2 peal. </p>
<p>1. Installeeri IISi SSL tugi. SSL on vajalik, IIS ei aktiveeri kliendilt sertifikaatide küsimist üle HTTP. </p>
<p>Selleks:</p>
<p>a) osta, generereeri või hangi testsertifikaat. SSL sertifikaatide pakkujaid on väga palju ja hinnad on väga erinevad. Erinevused tulevad peamiselt sellest, kas SSL sertifikaadi pakkuja on kõigis enamlevinud brauserites registreeritud või mitte. Lisaks muud &#8220;äriteenused&#8221; ja &#8220;võimalused&#8221;, nagu näiteks &#8220;wildcard SSL&#8221; jms. Ise ostsin SSL sertifikaadi Thawtelt, sealtsamast saab ka 21 päeva kehtiva ajutise sertifikaadi. Thawte ostu protsess on samuti kõige arusaadavam. </p>
<p>b) kuidas täpselt SSL sertifikaati IISi paigaldada, võib lugeda kahte allikat kombineerides: Thawte lehelt dokumendist <a title="https://www.thawte.com/ucgi/gothawte.cgi?a=w44600158747054000" href="https://www.thawte.com/ucgi/gothawte.cgi?a=w44600158747054000">https://www.thawte.com/ucgi/gothawte.cgi?a=w44600158747054000</a> (Securing your Microsoft Internet Information Services (MS IIS) Web Server with a thawte Digital Certificate ja raamatust Microsoft IIS 6.0: Administrator&#8217;s Pocket Consultant, William R. Stanek, ISBN: 0735615608. Viimati nimetatud raamatus peatükk 8 on väga lakooniline ja samas täpne. </p>
<p>2. Kontrolli, et IIS suudab üle HTTPSi serveerida. </p>
<p>3. Lae Sertifitseerimiskeskuse lehelt alla sertifikaadid: <a title="http://www.sk.ee/pages.php/0202040501" href="http://www.sk.ee/pages.php/0202040501">http://www.sk.ee/pages.php/0202040501</a>&nbsp;</p>
<p>Sul on vaja PEM formaadis sertifikaate: Juur-SK, ESTEID-SK ja ESTEID-SK 2007. </p>
<p>Kindlam viis on sertifikaadid installeerida Windows Serveri halduskonsoolis, selleks:</p>
<p>a) Start-&gt;Run, kirjuta mmc, OK. Avaneb tühi konsool. </p>
<p>b) konsoolis vali File-&gt;Add/Remove Snap In, avanenud aknas vajuta nuppu Add&#8230;</p>
<p>c) avanenud uues aknas vali nimekirjast Certificates, vajuta Add. Avaneb uus aken, kus vali Compute account. Finish, Close. </p>
<p>d) vajuta järelejäänud aknas OK.</p>
<p>e) Halduskonsooli tekitati Certificates puu, kus ava Trusted Root Certification Authorities ja parema hiire klikiga vali selle peal All Tasks -&gt; Import. Vali JUUR-SK.PEM.cer ja impordi. </p>
<p>f) Impordi sertifikaatide harusse Intermediate Certification Authorities/Certificates alla ESTEID-SK.PEM.cer ja ESTEID-SK 2007.PEM.cer</p>
<p>4. Ava IIS halduskonsool, vali veebisaidi, millele soovid ID autentimist rakendada omadused (Properties). Kaardilt Directory Security (mis peaks juba tuttav olema, kuna sealt paigaldasid ka eelnevalt SSL sertifikaadi) vajuta osas Secure Communications nuppu Edit &#8230;</p>
<p>a) võid märkida valikukasti Require secure channel &#8211; kuid ID kaardiga autentimiseks ei ole see kogu saidile vajalik. </p>
<p>b) vali Client certificates alt vähemalt Accept client certificates (arusaadavatel põhjustel ei ole mõtet valida Ignore &#8230;)</p>
<p>c) Tee linnuke valikukasti Enable certificate trust list. Kui sul veel ei ole ühtki, siis vali New. Avanenud viisardis vajuta nuppu Add From Store, kus avanenud aknas lisa JUUR-SK sertifikaat. </p>
<p>Juhul, kui kasutad test-SSL sertifikaati, siis pead valima lisaks ka juursertifikaadi SSL jaoks (mina näiteks Thawte Test CA Root). </p>
<p>Certificates in the CTL ehk Certificate Trust List loetleb <strong>JUUR</strong>sertifikaadid, mille sertifikaate aktsepteeritakse. </p>
<p>5. Edasi võid ID kaardiga autentimiseks valida mitmeid tehnikaid &#8211; kuid, sa ei pea sugugi kõiki faile tingimata kaitsma ID kaardi autentimisega. Piisab, kui su lehel leidub üks fail, nt. login.aspx, mille puhul nõutakse autentimist ja login.aspx seab püsti juba sessiooni, näiteks cookie põhise. Edasi teised failid kasutaks siis juba enda loodud sessiooni. See on otstarbekas näiteks siis, kui lehel saab mitmel moel autentida. </p>
<p>6. Login.aspx ID autentimist küsima panemiseks vali IIS halduskonsoolis veebisaidi failide nimekirjast Login.aspx ja parema nupuga kuva omadused ehk Properties.</p>
<p>a) vali File Security kaart, sealt Secure Communications osast vajuta Edit &#8230;</p>
<p>b) Tee linnuke valikukasti Require secure channel (SSL) </p>
<p>c) Client Certificates osast vali vähemalt Accept client certificates. Sa ei pea valima Require client certificates, sest juhul, kui kasutaja keeldub ID kaardiga autentimast, peaksid saama endiselt pakkuda kasutajale alternatiive, mitte keelduma näitamast login lehekülge. </p>
<p>7. Nüüd jääb teha veel saidipõhine autentimis- ja sessioonilahendus. Väga lihtne näide, kuidas ilma sertifikaadi aegumist kontrollimata lugeda aspx failis isikukood ja nimi:</p>
<p>if (Request.ClientCertificate["Subject"].Length == 0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&#8220;Ei antud sertifikaate&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String unparsed=Request.ClientCertificate["Subject"];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Text.RegularExpressions.Regex re = new Regex(&#8220;SERIALNUMBER=(\\d{11})&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&#8220;&lt;br/&gt;unparsed:&#8221; + unparsed + &#8220;&lt;br/&gt;&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (re.IsMatch(unparsed))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String idcode = re.Match(unparsed).Groups[1].Value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&#8220;Su isikukood on:&#8221; + idcode + &#8220;&lt;br/&gt;&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Text.RegularExpressions.Regex rename = new Regex(&#8220;SN=(.*?),\\s+G=(.*?),&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (rename.IsMatch(unparsed))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String eesnimi = rename.Match(unparsed).Groups[1].Value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String perenimi = rename.Match(unparsed).Groups[2].Value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.Write(&#8220;Su nimi on: &#8220;+eesnimi+&#8221; &#8221; +perenimi+&#8221;&lt;br/&gt;&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }  </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/neemevool.wordpress.com/5/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/neemevool.wordpress.com/5/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/neemevool.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/neemevool.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/neemevool.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/neemevool.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/neemevool.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/neemevool.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/neemevool.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/neemevool.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/neemevool.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/neemevool.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/neemevool.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/neemevool.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/neemevool.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/neemevool.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=neemevool.wordpress.com&amp;blog=3487776&amp;post=5&amp;subd=neemevool&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://neemevool.wordpress.com/2008/05/07/id-kaardi-phise-autentimise-seadistamine-iis-60-s/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b701928efb475985e5d9e3d83512adc9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">neemevool</media:title>
		</media:content>
	</item>
		<item>
		<title>WiX p&#245;hise MSI installeri crashcourse</title>
		<link>http://neemevool.wordpress.com/2008/04/21/wix-phise-msi-installeri-crashcourse/</link>
		<comments>http://neemevool.wordpress.com/2008/04/21/wix-phise-msi-installeri-crashcourse/#comments</comments>
		<pubDate>Mon, 21 Apr 2008 07:41:02 +0000</pubDate>
		<dc:creator>neemevool</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://neemevool.wordpress.com/2008/04/21/wix-phise-msi-installeri-crashcourse/</guid>
		<description><![CDATA[Ma ei kirjuta siin (veel) sellest, mis on WiX &#8211; vt. http://www.tramontana.co.hu/wix/index.php Ma ei kirjuta, kuidas saada WiX tööle VS 2008 all &#8211; hetkel enam ei mäleta, kui arvuti crashib, eks siis tuletan meelde ja kirjutan ka blogi. Kirjatüki mõte on dokumenteerida enda jaoks nn. WiX 1-2-3 töö alustamiseks, et iga kord ei peaks WiX [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=neemevool.wordpress.com&amp;blog=3487776&amp;post=4&amp;subd=neemevool&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<ol>
<li>Ma ei kirjuta siin (veel) sellest, mis on WiX &#8211; vt. <a title="http://www.tramontana.co.hu/wix/index.php" href="http://www.tramontana.co.hu/wix/index.php">http://www.tramontana.co.hu/wix/index.php</a>
<li>Ma ei kirjuta, kuidas saada WiX tööle VS 2008 all &#8211; hetkel enam ei mäleta, kui arvuti crashib, eks siis tuletan meelde ja kirjutan ka blogi.
<li>Kirjatüki mõte on dokumenteerida enda jaoks nn. WiX 1-2-3 töö alustamiseks, et iga kord ei peaks WiX mahukast materjalist läbi närima ja meelde tuletama &#8211; &#8220;kuidas see kõik nüüd käis&#8221;. </li>
</ol>
<h2>Lähteülesanne </h2>
<ol>
<li>Peatada Windows teenus
<li>Paigaldada uued teenusefailid (teenuse exe jms.) &#8211; küsida kasutajalt enne nende asukohta
<li>Küsida kasutajalt SQL serveri (kus asuvad teenuse poolt kasutatavad SQL SP-d) andmed, kontrollida ligipääs.
<li>Vajadusel uuendada SQL SP-d.
<li>Käivitada teenus </li>
</ol>
<h2>1. Samm &#8211; WiX projekt</h2>
<ol>
<li>kohanda Product teek, sisestades väärtused:
<ol>
<li>Id &#8211; GUID saad nt. Tools-&gt;Create GUID
<li>Name &#8211; kirjuta toote nimi, mitte installika nimi
<li>Version &#8211; installitava rakenduse versioon
<li>UpdgradeCode &#8211; vt. tutorial. </li>
</ol>
<li>Kohanda Package teek, kindlasti sisesta Id. Package Id-d tuleb alati muuta, kui ükskõik milline osa paigaldusest (failid vms.) on muutunud. </li>
</ol>
<h2>2. Samm &#8211; loo kataloogide struktuur ja lisa failid</h2>
<ol>
<li>Loo Directory teekidest hierarhia </li>
</ol>
<h2>3. Samm &#8211; defineeri komponendid</h2>
<p>Kuidas failid, featuurid jms. komponentideks komplekteerida, sõltub rakendusest. </p>
<p>Igale komponendile tuleks anda viisakas ID ja genereerida Guid, mis peaks muutuma siis ja ainult siis, kui komponendis on mingeid muudatusi. </p>
<p>Iga komponent sisaldab/ei sisalda faile (File). Iga faili puhul tuleb näidata, kus see fail on kompileerimise hetkel ja mis on selle faili nimi installeerides. </p>
<p>Kuna soov on saavutada kompileeritavust ka TFS-is, siis peaks nii installeeritavad kui ka mitte installeeritavad (nt. SQL skriptid vms.) paigutama mingisse alamkataloogi või teise kohta, kindlasti mitte piirduma vaid Name atribuudiga, et WiX ei hakkaks faile ise taga otsima. </p>
<p>Testimiseks võib msi käivitada käsurealt: <br />msiexec /i msifail.msi /l*v install.log</p>
<p>ja mahavõtmiseks:</p>
<p>msiexec /x msifail.msi</p>
<p>Võti /l*v on eriti kasulik debugimise ajal, sest sel juhul logitakse tekstifaili detailsed veateated. Käsitsi msi-d käivitades aga teatab msi paljude vigade korral lakooniliselt &#8220;Error 2819&#8243; ja lõpetab töö. </p>
<h2>4. Tingimuste kontroll</h2>
<p>Kõige triviaalsemad tingimused on näiteks failipõhised &#8211; kas mingi fail eksisteerib kuskil või mitte. </p>
<p>Selleks tuleb lisada Product teegi alla (nt. peale Directory teeki) plokk:</p>
<blockquote><p><font face="Courier New" size="2">&lt;Property Id=&#8221;CONFIGEXISTS&#8221;&gt; <br />&lt;DirectorySearch Id=&#8221;CheckConfFileDir&#8221;&nbsp; Path=&#8221;[INSTALLLOCATION]&#8221; Depth=&#8221;0&#8243;&gt; <br />&lt;FileSearch Id=&#8221;CheckConfFile&#8221; Name=&#8221;filetocheck&#8221; /&gt; <br />&lt;/DirectorySearch&gt; <br />&lt;/Property&gt;</font></p>
</blockquote>
<p>Edasi saab seda tingimust kontrollida, kui lisada Feature teeki tingimus:</p>
<p>&lt;Condition Level=&#8221;0&#8243;&gt;NOT CONFIGEXISTS&lt;/Condition&gt;</p>
<p>Kus CONFIGEXISTS viitab Property=&#8221;CONFIGEXISTS&#8221; peale.</p>
<h2>5. Installatsioonikoha muutmine kasutaja poolt</h2>
<p>Selleks võib Feature teegile lisada Display ja ConfigurableDirectory parameetrid, määratud peavad olema ka Title ja Description. ConfigurableDirectory viitab Directory teekide hulgas Directory.Id peale, mida kasutajal lubatakse muuta. </p>
<h2>6. UI määramine</h2>
<p>Standarseid kasutajaliideseid on 4, UI määramiseks ühe nende seast tuleb Product teegi alla lisada:</p>
<p>&lt;UIRef Id=&#8221;WixUI_Mondo&#8221; /&gt; <br />&lt;UIRef Id=&#8221;WixUI_ErrorProgressText&#8221;/&gt;</p>
<p>Samuti tuleb projekti viidetesse lisada WixUIExtension.dll. </p>
<p>NB! Kõi Feature-d ilmuvad valikute alla ainult siis, kui tingimus(ed) Feature juures on täidetud. </p>
<h2>7. WixUI_Mondo juurde kuuluva litsentsiteksti muutmine ja ikoonide muutmine</h2>
<p>License.rtf faili viitamiseks tuleb aga ka üle kirjutada muutuja WixUILicenseRtf, seda Product tasemel:</p>
<p>&lt;WixVariable Id=&#8221;WixUILicenseRtf&#8221; Value=&#8221;Bitmap\License.rtf&#8221; /&gt;</p>
<p>Standardsete graafikafailide muutmiseks tuleb defineerida muutujad:</p>
<ol>
<li>WixUIBannerBmp &#8211; Top banner, 493 × 58
<li>WixUIDialogBmp &#8211; Background bitmap used on welcome and install-complete dialogs, 493 × 312
<li>WixUIExclamationIco &#8211; Exclamation icon on the wait-for-costing dialog, 32 × 32
<li>WixUIInfoIco &#8211; Information icon on the cancel and error dialogs, <br />32 × 32
<li>WixUINewIco &#8211; Button glyph on directory-browse dialog, 16 × 16
<li>WixUIUpIco &#8211; Button glyph on directory-browse dialog, 16 × 16 </li>
</ol>
<h2>8. Dialoogiakende loomine</h2>
<p>Enda dialoogiakende loomiseks tuleb panna need .wxs failidesse. Kõige mugavam on dialooge redigeerida mitte käsitsi, vaid Wixedit abil. </p>
<p>Edasi tuleb dialoog &#8220;haakida&#8221; valitud põhidialoogi Next ja Back nuppude abil. Selleks tuleb valitud põhidialoogi .wxs failist teha projekti koopia. WiX UI failid on Wix lähtekoodi kataloogis src\ext\UIExtension\wixlib.</p>
<p>Kõige mugavam on oma dialooge haakida dialoogide vahele, kus ei ole palju võimalusi edasi-tagasi liikumiseks. St. halb on dialooge panna vahele sellistesse kohtadesse, kuhu kasutaja võib liikuda mitut teed pidi. Mondo puhul on sobiv koht LicenseAgreementDlg ja SetupTypeDlg vahel ehk kohe peale litsentsiga nõustumist kuid enne installatsioonitüübi valikut. Muidugi, kui tegemist on valikutega, mis sõltuvad eelnevalt valitud installeerimistüübist, siis tuleb rohkem vaeva näha ja lisada dialooge mujale ning kontrollida kasutaja valikud. </p>
<p>9. UI elementide aktiveerimine/inaktiveerimine sõltuvalt kasutaja valikutest</p>
<p>Mingi UI elemendi aktiveerimiseks/inaktiveerimiseks näiteks CheckBox oleku peale võib vastava Control teegi sisse kirjutada tingimused:</p>
<blockquote><pre><span style="color:#000000;"></span><span style="color:#0000ff;">&lt;</span><span style="color:#a31515;">Condition</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Action</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">disable</span><span style="color:#000000;">"</span><span style="color:#0000ff;">&gt;&lt;![CDATA[</span><span style="color:#808080;">SQLTEST &lt;&gt; "1"</span><span style="color:#0000ff;">]]&gt;&lt;/</span><span style="color:#a31515;">Condition</span><span style="color:#0000ff;">&gt;
&lt;</span><span style="color:#a31515;">Condition</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Action</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">enable</span><span style="color:#000000;">"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">SQLTEST = "1"</span><span style="color:#0000ff;">&lt;/</span><span style="color:#a31515;">Condition</span><span style="color:#0000ff;">&gt;</span></pre>
</blockquote>
<p>Antud näites juhib siis elementi CheckBox:</p>
<blockquote><pre><span style="color:#000000;"></span><span style="color:#0000ff;">&lt;</span><span style="color:#a31515;">Control</span><span style="color:#0000ff;">  </span><span style="color:#ff0000;">Property</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">SQLUSEWINDOWSAUTH</span><span style="color:#000000;">"</span><span style="color:#0000ff;">
      </span><span style="color:#ff0000;">CheckBoxValue</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">1</span><span style="color:#000000;">"</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Type</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">CheckBox</span><span style="color:#000000;">"      </span><span style="color:#ff0000;">Width</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">128</span><span style="color:#000000;">"</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Height</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">17</span><span style="color:#000000;">"</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">X</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">210</span><span style="color:#000000;">"</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Y</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">105</span><span style="color:#000000;">"      </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">SqlServerUseWindowsAuth</span><span style="color:#000000;">"</span><span style="color:#0000ff;">&gt;
      &lt;</span><span style="color:#a31515;">Text</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">Use Windows authentication</span><span style="color:#0000ff;">&lt;/</span><span style="color:#a31515;">Text</span><span style="color:#0000ff;">&gt;
&lt;/</span><span style="color:#a31515;">Control</span><span style="color:#0000ff;">&gt;</span></pre>
</blockquote>
<h2>10. SQL kasutaja konfigureerimine</h2>
<p>Wix SQL skeemi&nbsp; (Sql Schema) kuuluvate SQL korralduste käivitamiseks tuleb eelnevalt defineerida SQL kasutaja. Selleks on Util skeemi kuuluv User element:</p>
<p>User elemendi lisamiseks tuleb muidugi lisada ka viide WixUtilExtension dll-ile ja üks dokumenteerimata probleem: Wix teeki tuleb lisada ka util nimeruum:</p>
<p><a title="util=" href="util=">xmlns:util=&#8221;http://schemas.microsoft.com/wix/UtilExtension&#8221;</a></p>
<p>Juhul, kui Wix on korrektselt installeeritud, siis pakub VS intellisens seda skeemi ka skeemide loetelust. </p>
<p>Edasi saab kasutaja viite tekitada näiteks:</p>
<p>&lt;util:User Id=&#8221;SQLUSER&#8221; Name=&#8221;[SQLUSERNAME]&#8221; Password=&#8221;[SQLPASSWORD]&#8220;/&gt; </p>
<p>[ ] sees on siis muutujad (Property), mille väärtus võib tulla näiteks omakorda vormist. </p>
<p>Juhul, kui kasutajat <strong>ei ole</strong> vaja tekitada, siis ei tohi seda panna Component teegi sisse. </p>
<p>Siiski ei ole SQL baasi külge ühendumine nii lihtne. Nimelt ei ole võimalik ei util:User ega ühegi sql nimeruumi kuuluva elemendi puhul määrata, kas kasutada Windowsi autentimist või SQL serverisse sisse ehitatud autentimist. util:User puhul kasutajanime ja parooli tühjaks jätmine ei pane aga sql nimeruumi elemente kasutama vaikimisi Windows autentimist &#8211; mis on ka loogiline (by-the-spec programmeerija seisukohalt muidugi, kes ütleks &#8220;aga kui kasutajal ongi parool tühi??&#8221;). </p>
<p>Ainuke võimalus on teha nii:</p>
<ol>
<li>Loo muutujad (Property) SQL serveri aadressi, andmebaasi nime, kasutajanime, parooli ja autentimisviisi lipu jaoks, nt. SQLSERVERADDRESS jne. (kui ei ole teisiti öeldud, siis edaspidised koodilõigud käivad kõik Product teegi alla, suvalises järjekorras.&nbsp; <br /><span style="color:#0000ff;">&lt;</span><span style="color:#a31515;">Property</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">SQLSERVERADDRESS</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">/&gt; <br />&lt;</span><span style="color:#a31515;">Property</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">SQLSERVERDATABASE</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">/&gt; <br />&lt;</span><span style="color:#a31515;">Property</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">SQLUSEWINDOWSAUTH</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">/&gt; <br />&lt;</span><span style="color:#a31515;">Property</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">SQLUSERNAME</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">/&gt; <br />&lt;</span><span style="color:#a31515;">Property</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">SQLPASSWORD</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">/&gt;</span>
<li>Loo üks util:User, millele määrad vaid Name ja Password peale Id.&nbsp; <br /><span style="color:#0000ff;">&lt;</span><span style="color:#a31515;">util:User</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">SqlUser</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Name</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">[SQLUSERNAME]</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Password</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">[SQLPASSWORD]</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">/&gt;</span>
<li>Loo kaks sql:Database elementi Product alla, anna neile erinevad Id-d. Ühele neist määra User parameeter, viitama loodud util:User elemendile &#8211; see on siis SQL parooliga autentimiseks. Teisel sql:Database elemendil jäta User loomata. Muus osas on nad identsed. <br />&nbsp;<span style="color:#0000ff;">&lt;</span><span style="color:#a31515;">sql:SqlDatabase</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">SqlDatabaseWinAuth</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:#ff0000;">Database</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">[SQLSERVERDATABASE]</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Server</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">[SQLSERVERADDRESS]</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">/&gt; <br />&lt;</span><span style="color:#a31515;">sql:SqlDatabase</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">SqlDatabasePassAuth</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:#ff0000;">Database</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">[SQLSERVERDATABASE]</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Server</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">[SQLSERVERADDRESS]</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">User</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">SqlUser</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">/&gt;</span>
<li>Loo kaks komponenti (Component) eraldi Windows autentimise teel ühendumiseks ja SQL kasutajanime/parooli abil autentimiseks. Component teegid muidugi paiguta väljapoole Directory teeke, otse Product alla. Anna komponentidele erinevad Id-d, näiteks SqlUpdateWinAuth ja SqlUpdatePassAuth. Kahjuks tekitab aga see lahendus probleeme komponendi GUID-idega &#8211; need peavad olema erinevad ja hiljem võib uuendustel tekkida nende kontrollil lisatööd (hetkel ei tea küll, kus) &#8211; aga ehk ka mitte &#8230; (NB! Allpool olevas näites on ära jäetud SqlStringide kõik muud atribuudid, mis reaalses koodis on vajalikud. <br />&nbsp;<span style="color:#0000ff;">&lt;</span><span style="color:#a31515;">Component</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Directory</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">TARGETDIR</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">SqlUpdateWinAuth</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;"> </span><span style="color:#0000ff;">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">sql:SqlString</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">SqlDb</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">SqlDatabaseWinAuth</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/</span><span style="color:#a31515;">Component</span><span style="color:#0000ff;">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Component</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Directory</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">TARGETDIR</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">SqlUpdatePassAuth</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">sql:SqlString</span><span style="color:#0000ff;">&nbsp;</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">SQL</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">create table a (bb int not null)</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:#ff0000;">SqlDb</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">SqlDatabasePassAuth</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/</span><span style="color:#a31515;">Component</span><span style="color:#0000ff;">&gt;</span>
<li>Kirjuta oma komponentidesse sql:SqlScript elemendid, mis viitavad samale sql skriptile või siis sql:SqlString elemendid (viimasel juhul muidugi pead SQL käsud dubleerima). Ühele määra SqlDb parameetriks SQL parooliga autentiv sql:SqlDatabase, teisele Windows põhise autentimisega (vt. eelmise punkti näide).
<li>Kummagi komponendi jaoks loo Feature, millel määra Display=&#8221;hidden&#8221; &#8211; sa ei taha, et need oleks kasutajale näha. Lisa kummalegi vastavalt eelnevalt loodud komponendid. <br /><span style="color:#0000ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Feature</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Display</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">hidden</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">SqlUpdateWinAuth</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Title</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">With Windows Auth</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:#ff0000;">Description</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">Install updates with win Auth</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Level</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">1</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">ComponentRef</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">SqlUpdateWinAuth</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/</span><span style="color:#a31515;">Feature</span><span style="color:#0000ff;">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">Feature</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Display</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">hidden</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">SqlUpdatePassAuth</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Title</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">With Password Auth</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;"> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color:#ff0000;">Description</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">Install updates with pass Auth</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Level</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">1</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">ComponentRef</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">SqlUpdatePassAuth</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/</span><span style="color:#a31515;">Feature</span><span style="color:#0000ff;">&gt;</span>
<li>Ja nüüd jääb teha viimane samm &#8211; kuigi Feature on hidden, siis vältimaks selle &#8220;installeerimist&#8221; tuleb üks neist eemaldada. Selleks võib panna Sql dialoogi Next nupu alla teated (Event) mille tüübiks on Remove (Event=&#8221;Remove&#8221; ja Value=&#8221;featuur, mida pole vaja&#8221;). Teisi standardseid teateid (Event) vt. Wix manuaalist. <br /><span style="color:#0000ff;">&lt;</span><span style="color:#a31515;">Publish</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Event</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">Remove</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">&nbsp; <br />&nbsp;</span><span style="color:#ff0000;">Value</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">SqlUpdateWinAuth</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">&gt;&lt;![CDATA[</span><span style="color:#808080;">SQLUSEWINDOWSAUTH &lt;&gt; "1"</span><span style="color:#0000ff;">]]&gt; <br />&lt;/</span><span style="color:#a31515;">Publish</span><span style="color:#0000ff;">&gt; <br />&lt;</span><span style="color:#a31515;">Publish</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Event</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">Remove</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">&nbsp; <br /></span><span style="color:#ff0000;">Value</span><span style="color:#0000ff;">=</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">SqlUpdatePassAuth</span><span style="color:#000000;">&#8220;</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">SQLUSEWINDOWSAUTH = &#8220;1&#8243; <br /></span><span style="color:#0000ff;">&lt;/</span><span style="color:#a31515;">Publish</span><span style="color:#0000ff;">&gt;</span> </li>
</ol>
<h2>11. Sql kasutaja kontrollimine</h2>
<p>Kui oled loonud dialoogi, milles on väljad SQL serveri andmete küsimiseks, siis oleks hea lisada ka &#8220;Test connection&#8221; nupp, et installeerimine ei katkeks, kuna kasutaja sisestas kogemata valed andmed. Kahjuks ei ole sql nimeruumis ega üheski muus nimeruumis selliseid võimalusi. Muidugi on olemas laiendamisvõimalused:</p>
<ol>
<li>luua CustomAction, mis käivitab Win32 DLLis etteantud meetodi. Win32 dll eeliseks on see, et kaasates msi C päised, saab Win32 DLL otseselt kirjutada msi muutujatesse (Property). Puuduseks on see, et tuleb osata C++ keelt ja mitte ainult &#8211; tuleb osata ka reaalne kooditükk valmis kirjutada.
<li>kirjutada CustomAction, mille sisuks on JScript või VBScript. Kuid lisaks keele oskamise vajadusele tekib selle lahenduse puhul probleem arvutites, kus on viirusetõrje. Viirusetõrjeprogrammid peavad MSI-d lisatud skriptiga viiruseks ja keelavad MSI käivitamise.
<li>Kirjutada CustomAction .NET-is, exena (soovitav on teha WinForms rakendus, kui MSI kasutab UI-d ja konsoolirakendusena, kui MSI ei kasuta UI-d). Nimelt UI-d kasutav MSI vilgutab konsoolirakenduse puhul ikkagi akent. Eeliseks on, et laiendust on .NET programeerijal lihtne luua, vajalik kood on suure tõenäosusega olemas nagunii. Kuid suurimaks puuduseks on võimatus anda MSI-sse tagasisidet muutuja näol (System.Environment.Exit(&lt;kood&gt;) ei kvalifitseeru, sest !=0 puhul teatab MSI, et viga on fataalne ja kogu paigaldus lõpetatakse. Kuid nt. SQL parameetrite kontrolli puhul peab andma kasutajale vaid teada, et ühendus õnnestus/ei õnnestunud). </li>
</ol>
<p>Soovitav on siiski kasutada varianti 3, kuna loodetavasti kirjutatakse siiski ka WiX parem .NET CustomActioni tugi. Kuigi hetkel on Microsofti MSI meeskond esitanud hulk argumente .NET CustomActionite vastu, mis seisnevad peamiselt selles, et välised rakendused kujutavad MSI stabiilsusele riski, võiks see siiski olla mingil määral kasutaja valik. Nimelt ka antud näite kohane lihtne SQL parameetrite kuontroll on &#8220;MSI invariantne&#8221; ehk ei installi ega eemalda midagi. </p>
<p>Seega, kirjutasin .NET WinForm rakenduse (kasutades vaid System.* nimeruumi, et ei tekiks sõltuvusi teistest .NET teekidest) WinWixSQLCheck.exe, mis loeb käsurealt argumendi kujul Sqlserver=&lt;server&gt;|Sqldatabase=&lt;andmebaas&gt; jne. ja käivitan selle Wix CustomActionina:</p>
<pre><span style="color:#000000;"></span><span style="color:#0000ff;">&lt;</span><span style="color:#a31515;">Binary</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">WixChecker</span><span style="color:#000000;">"</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">SourceFile</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">Binaries\WinWixSQLCheck.exe</span><span style="color:#000000;">"</span><span style="color:#0000ff;">/&gt;
&lt;</span><span style="color:#a31515;">CustomAction</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">CheckSql</span><span style="color:#000000;">"</span><span style="color:#0000ff;">
            </span><span style="color:#ff0000;">BinaryKey</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">WixChecker</span><span style="color:#000000;">"</span><span style="color:#0000ff;">
            </span><span style="color:#ff0000;">ExeCommand</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">Username=[SQLUSERNAME]|Password=[SQLPASSWORD]|Sqlserver=[SQLSERVERADDRESS]|Sqldatabase=[SQLSERVERDATABASE]|Usewinauth=[SQLUSEWINDOWSAUTH]</span><span style="color:#000000;">"</span><span style="color:#0000ff;">
            </span><span style="color:#ff0000;">Return</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">check</span><span style="color:#000000;">"</span><span style="color:#0000ff;"> /&gt;</span></pre>
<pre>us: </pre>
<ol>
<li>Eelnevalt laen WinWixSQLCheck.exe MSI-sse binaarse lisana Binary teegi abil (Binaries on projekti alamkataloog)
<li>ExeCommand on käsurea argument </li>
</ol>
<p>Ja edasi käivitan kontrolliva exe näiteks &#8220;Test connection&#8221; nupu abil: </p>
<pre><span style="color:#000000;"></span><span style="color:#0000ff;">&lt;</span><span style="color:#a31515;">Control</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Type</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">PushButton</span><span style="color:#000000;">"</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Width</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">78</span><span style="color:#000000;">"</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Height</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">17</span><span style="color:#000000;">"</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">X</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">248</span><span style="color:#000000;">"</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Y</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">169</span><span style="color:#000000;">"</span><span style="color:#0000ff;">       </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">SqlTest</span><span style="color:#000000;">"</span><span style="color:#0000ff;">&gt;
      &lt;</span><span style="color:#a31515;">Text</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">Test connection</span><span style="color:#0000ff;">&lt;/</span><span style="color:#a31515;">Text</span><span style="color:#0000ff;">&gt;
      &lt;</span><span style="color:#a31515;">Publish</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Property</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">SQLTEST</span><span style="color:#000000;">"</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Value</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">1</span><span style="color:#000000;">"</span><span style="color:#0000ff;">/&gt;
      &lt;</span><span style="color:#a31515;">Publish</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Event</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">DoAction</span><span style="color:#000000;">"</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Value</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">CheckSql</span><span style="color:#000000;">"</span><span style="color:#0000ff;">&gt;</span><span style="color:#000000;">1</span><span style="color:#0000ff;">&lt;/</span><span style="color:#a31515;">Publish</span><span style="color:#0000ff;">&gt;
&lt;/</span><span style="color:#a31515;">Control</span><span style="color:#0000ff;">&gt;</span></pre>
<p>Event DoAction ongi CustomActioni käivitamiseks, Value=CheckSql on tegevuse nimi. Publish Property=SQLTEST on aga vajalik selleks, et lubada Next nupu vajutamine (mida Next nupp loeb). </p>
<h2>12. Windows teenuste (Service) paigaldamine</h2>
<p>Võrreldes eelnevaga on see tõeliselt lihtne. Tuleb luua komponent, milles defineeri teenus, ning valmis see ongi:</p>
<pre><span style="color:#000000;"></span><span style="color:#0000ff;">&lt;</span><span style="color:#a31515;">Component</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">NewsletterService</span><span style="color:#000000;">"</span><span style="color:#0000ff;"> </span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Directory</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">TARGETDIR</span><span style="color:#000000;">"&gt;</span><span style="color:#0000ff;">&nbsp;&nbsp; &lt;</span><span style="color:#a31515;">File</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">KeyPath</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">yes</span><span style="color:#000000;">"</span><span style="color:#0000ff;">
                </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">ServiceExecutable</span><span style="color:#000000;">"</span><span style="color:#0000ff;">
                </span><span style="color:#ff0000;">Source</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">Artifacts\&lt;serviceexe&gt;.exe</span><span style="color:#000000;">"</span><span style="color:#0000ff;">
                </span><span style="color:#ff0000;">Name</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">&lt;serviceexe&gt;.exe</span><span style="color:#000000;">"</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Vital</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">yes</span><span style="color:#000000;">"</span><span style="color:#0000ff;">/&gt;
            &lt;</span><span style="color:#a31515;">ServiceControl</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">StopNLS</span><span style="color:#000000;">"</span><span style="color:#0000ff;">
                </span><span style="color:#ff0000;">Start</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">install</span><span style="color:#000000;">"</span><span style="color:#0000ff;">
                </span><span style="color:#ff0000;">Remove</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">uninstall</span><span style="color:#000000;">"</span><span style="color:#0000ff;">
                </span><span style="color:#ff0000;">Stop</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">install</span><span style="color:#000000;">"</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Name</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">&lt;servicename&gt;</span><span style="color:#000000;">"</span><span style="color:#0000ff;">/&gt;

&lt;</span><span style="color:#a31515;">ServiceInstall</span><span style="color:#0000ff;">
                </span><span style="color:#ff0000;">ErrorControl</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">normal</span><span style="color:#000000;">"</span><span style="color:#0000ff;">
                &nbsp;&nbsp; </span><span style="color:#ff0000;">Description</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">&lt;service desc&gt;</span><span style="color:#000000;">"</span><span style="color:#0000ff;">
                </span><span style="color:#ff0000;">DisplayName</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">&lt;service disp name&gt;</span><span style="color:#000000;">"</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">&nbsp;&nbsp; Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">InstallNLService</span><span style="color:#000000;">"
</span><span style="color:#0000ff;">                </span><span style="color:#ff0000;">Name</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">&lt;servicename&gt;</span><span style="color:#000000;">"</span><span style="color:#0000ff;">
                </span><span style="color:#ff0000;">Type</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">ownProcess</span><span style="color:#000000;">"</span><span style="color:#0000ff;">
                </span><span style="color:#ff0000;">Start</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">auto</span><span style="color:#000000;">"</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Vital</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">yes</span><span style="color:#000000;">"</span><span style="color:#0000ff;">/&gt;

&lt;/</span><span style="color:#a31515;">Component</span><span style="color:#0000ff;">&gt;</span></pre>
<p>Kus:</p>
<ol>
<li>Teenuse exe peab olema Component teegi esimene alamelement ning Keypath=yes &#8211; ServiceInstall element eeldab seda.
<li>Servicecontrol teek kirjeldab, kuidas käituda installeerimisel ja eemaldamisel ja kas/millal teenus käivitada </li>
</ol>
<h2>13. Uuenduste loomine</h2>
<p>Uuenduste tegemise hõlbustamiseks kasutan WiX kompilaatori muutujaid, kus defineerin toote versiooni ja ID-d. Lisada Wix teegi alla definitsioonid:<br /><span style="color:#0000ff;">&lt;!&#8211;</span><span style="color:#008000;"> when you make upgrade, then increment Version numbers as <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; needed and ALWAYS change SetupProductCodeGuid and SetupPackageCodeGuid <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DO NOT modify SetupPackageUpgradeGuid unless you do not want old product be upgradable anymore</span><span style="color:#0000ff;">&#8211;&gt;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;?</span><span style="color:#a31515;">define</span><span style="color:#0000ff;"> </span><span style="color:#808080;">SetupProductMajorVersion=&#8221;0&#8243;</span><span style="color:#0000ff;">?&gt;<br />&nbsp;&nbsp;&nbsp; &lt;?</span><span style="color:#a31515;">define</span><span style="color:#0000ff;"> </span><span style="color:#808080;">SetupProductMinorVersion=&#8221;0&#8243;</span><span style="color:#0000ff;">?&gt;<br />&nbsp;&nbsp;&nbsp; &lt;?</span><span style="color:#a31515;">define</span><span style="color:#0000ff;"> </span><span style="color:#808080;">SetupProductBuildVersion=&#8221;5&#8243;</span><span style="color:#0000ff;">?&gt;<br />&nbsp;&nbsp;&nbsp; &lt;?</span><span style="color:#a31515;">define</span><span style="color:#0000ff;"> </span><span style="color:#808080;">SetupProductCodeGuid=&#8221;DEE9008F-00A5-4f4c-85C1-560BE483E7FC&#8221;</span><span style="color:#0000ff;">?&gt;<br />&nbsp;&nbsp;&nbsp; &lt;?</span><span style="color:#a31515;">define</span><span style="color:#0000ff;"> </span><span style="color:#808080;">SetupPackageCodeGuid=&#8221;7BDEC0DA-5339-4b1e-8507-F97948F36A21&#8243;</span><span style="color:#0000ff;">?&gt;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;?</span><span style="color:#a31515;">define</span><span style="color:#0000ff;"> </span><span style="color:#808080;">SetupPackageUpgradeGuid=&#8221;C72056CC-97EC-479F-ADF5-323EABD35D56&#8243;</span><span style="color:#0000ff;">?&gt;</span></p>
<p>Edasi kasutan toote, paketi ja versiooni koodidena neid muutujaid:</p>
<pre><span style="color:#000000;"></span><span style="color:#0000ff;">&lt;</span><span style="color:#a31515;">Product</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">$(var.SetupProductCodeGuid)</span><span style="color:#000000;">"</span></pre>
<pre><span style="color:#000000;">Peale Package teeki lisan:</span></pre>
<pre><span style="color:#000000;"></span><span style="color:#0000ff;">&lt;</span><span style="color:#a31515;">InstallExecuteSequence</span><span style="color:#0000ff;">&gt;
            &lt;</span><span style="color:#a31515;">RemoveExistingProducts</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Before</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">InstallInitialize</span><span style="color:#000000;">"</span><span style="color:#0000ff;">/&gt;
        &lt;/</span><span style="color:#a31515;">InstallExecuteSequence</span><span style="color:#0000ff;">&gt;</span></pre>
<p><span style="color:#0000ff;"></span></p>
</p>
<p>Edasi defineerin Updgrade bloki:</p>
<pre><span style="color:#000000;"></span><span style="color:#0000ff;">&lt;</span><span style="color:#a31515;">Upgrade</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">Id</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">$(var.SetupPackageUpgradeGuid)</span><span style="color:#000000;">"</span><span style="color:#0000ff;">&gt;
            &lt;</span><span style="color:#a31515;">UpgradeVersion</span><span style="color:#0000ff;">
                </span><span style="color:#ff0000;">Minimum</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">0.0.0</span><span style="color:#000000;">"</span><span style="color:#0000ff;">
                </span><span style="color:#ff0000;">IncludeMinimum</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">no</span><span style="color:#000000;">"
</span><span style="color:#0000ff;">                </span><span style="color:#ff0000;">Maximum</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">$(var.SetupProductMajorVersion).$(var.SetupProductMinorVersion).$(var.SetupProductBuildVersion)</span><span style="color:#000000;">"
</span><span style="color:#0000ff;">                </span><span style="color:#ff0000;">IncludeMaximum</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">no</span><span style="color:#000000;">"
</span><span style="color:#0000ff;">                </span><span style="color:#ff0000;">Property</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">OLDERVERSIONBEINGUPGRADED</span><span style="color:#000000;">"</span><span style="color:#0000ff;">/&gt;
            &lt;</span><span style="color:#a31515;">UpgradeVersion</span><span style="color:#0000ff;"> </span><span style="color:#ff0000;">OnlyDetect</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">yes</span><span style="color:#000000;">"
</span><span style="color:#0000ff;">                </span><span style="color:#ff0000;">Property</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">NEWVERSIONDETECTED</span><span style="color:#000000;">"
</span><span style="color:#0000ff;">                </span><span style="color:#ff0000;">Minimum</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">$(var.SetupProductMajorVersion).$(var.SetupProductMinorVersion).$(var.SetupProductBuildVersion)</span><span style="color:#000000;">"
</span><span style="color:#0000ff;">                </span><span style="color:#ff0000;">IncludeMinimum</span><span style="color:#0000ff;">=</span><span style="color:#000000;">"</span><span style="color:#0000ff;">no</span><span style="color:#000000;">"</span><span style="color:#0000ff;">/&gt;
        &lt;/</span><span style="color:#a31515;">Upgrade</span><span style="color:#0000ff;">&gt;</span></pre>
<p><span style="color:#0000ff;"></span></p>
<pre><span style="color:#0000ff;"></span>&nbsp;</pre>
<h2>14. Visual Studios tekib Wix projekti avamisel viga &#8220;&#8230;. HRESULT E_FAIL &#8230;&#8221; </h2>
<p>Ma ei tea küll vea tegelikku põhjust, sest tegu on väga üldise veaga, kuid viga peitub mingil moel rikutud wixproj failis. Kuid milles, on samuti müstiline &#8211; nimelt tekitasin ma uue projektifaili, mis avanes korrektselt. Seejärel võrdlesin WinMerge abil töötavat ja vigast projektifaili, kuni leidsin, et viga kaob, kui projektifailist eemaldada teek WixExtension Include=&#8221;WixUIExtension&#8221;. Kusjuures omapärane on see, et teise loodud projekti WixUIExtensioni lisamisel ei tekkinud endiselt probleeme. Kuid samas tekkis viga isegi siis, kui korras projektifailist tõstsin selle teegi WinMerge abil üle. </p>
<p>Lahendus: kustuta käsitsi projektifailist kogu ItemGroup, kus on Extension teegid, ava projekt VS-s ja lisa referentsid uuesti. </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/neemevool.wordpress.com/4/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/neemevool.wordpress.com/4/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/neemevool.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/neemevool.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/neemevool.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/neemevool.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/neemevool.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/neemevool.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/neemevool.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/neemevool.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/neemevool.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/neemevool.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/neemevool.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/neemevool.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/neemevool.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/neemevool.wordpress.com/4/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=neemevool.wordpress.com&amp;blog=3487776&amp;post=4&amp;subd=neemevool&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://neemevool.wordpress.com/2008/04/21/wix-phise-msi-installeri-crashcourse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b701928efb475985e5d9e3d83512adc9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">neemevool</media:title>
		</media:content>
	</item>
		<item>
		<title>ID kaardi põhise autentimise seadistamine IIS 6.0-s</title>
		<link>http://neemevool.wordpress.com/2008/04/15/id-kaardi-pohise-autentimise-seadistamine-iis-60-s/</link>
		<comments>http://neemevool.wordpress.com/2008/04/15/id-kaardi-pohise-autentimise-seadistamine-iis-60-s/#comments</comments>
		<pubDate>Tue, 15 Apr 2008 14:12:15 +0000</pubDate>
		<dc:creator>neemevool</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://neemevool.wordpress.com/?p=3</guid>
		<description><![CDATA[Kirjutamise põhjuseks on www.id.ee peal olev eksitav juhend: http://www.id.ee/10456?id=10737 . Selle juhendi üle on kaevanud ka teised: http://dukelupus.wordpress.com/2006/12/24/tants-id-kaardi-umber-ehk-iisi-ja-id-kaardi-suhtlema-panemine/ Kuna samuti kulutasin selle &#8220;üllitise&#8221; järgi IIS 6.0 konfigureerides mitu tundi oma aega, siis kirjutan teise versiooni sellest. Siiski, ma ei ole testinud seda lahendust kõikidel Windows serveri platvormidel, tegin selle läbi Windows Server 2003 R2, Standard Edition, Service [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=neemevool.wordpress.com&amp;blog=3487776&amp;post=3&amp;subd=neemevool&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Kirjutamise põhjuseks on <a href="http://www.id.ee/"><span style="color:#669966;font-family:&quot;">www.id.ee</span></a> peal olev eksitav juhend: <a title="http://www.id.ee/10456?id=10737" href="http://www.id.ee/10456?id=10737"><span style="color:#669966;font-family:&quot;">http://www.id.ee/10456?id=10737</span></a> . Selle juhendi üle on kaevanud ka teised: <a title="http://dukelupus.wordpress.com/2006/12/24/tants-id-kaardi-umber-ehk-iisi-ja-id-kaardi-suhtlema-panemine/" href="http://dukelupus.wordpress.com/2006/12/24/tants-id-kaardi-umber-ehk-iisi-ja-id-kaardi-suhtlema-panemine/"><span style="color:#669966;font-family:&quot;">http://dukelupus.wordpress.com/2006/12/24/tants-id-kaardi-umber-ehk-iisi-ja-id-kaardi-suhtlema-panemine/</span></a></p>
<p>Kuna samuti kulutasin selle &#8220;üllitise&#8221; järgi IIS 6.0 konfigureerides mitu tundi oma aega, siis kirjutan teise versiooni sellest.</p>
<p>Siiski, ma ei ole testinud seda lahendust kõikidel Windows serveri platvormidel, tegin selle läbi Windows Server 2003 R2, Standard Edition, Service Pack 2 peal.</p>
<p>1. Installeeri IISi SSL tugi. SSL on vajalik, IIS ei aktiveeri kliendilt sertifikaatide küsimist üle HTTP.</p>
<p>Selleks:</p>
<p>a) osta, generereeri või hangi testsertifikaat. SSL sertifikaatide pakkujaid on väga palju ja hinnad on väga erinevad. Erinevused tulevad peamiselt sellest, kas SSL sertifikaadi pakkuja on kõigis enamlevinud brauserites registreeritud või mitte. Lisaks muud &#8220;äriteenused&#8221; ja &#8220;võimalused&#8221;, nagu näiteks &#8220;wildcard SSL&#8221; jms. Ise ostsin SSL sertifikaadi Thawtelt, sealtsamast saab ka 21 päeva kehtiva ajutise sertifikaadi. Thawte ostu protsess on samuti kõige arusaadavam.</p>
<p>b) kuidas täpselt SSL sertifikaati IISi paigaldada, võib lugeda kahte allikat kombineerides: Thawte lehelt dokumendist <a title="https://www.thawte.com/ucgi/gothawte.cgi?a=w44600158747054000" href="https://www.thawte.com/ucgi/gothawte.cgi?a=w44600158747054000"><span style="color:#669966;font-family:&quot;">https://www.thawte.com/ucgi/gothawte.cgi?a=w44600158747054000</span></a> (Securing your Microsoft Internet Information Services (MS IIS) Web Server with a thawte Digital Certificate ja raamatust Microsoft IIS 6.0: Administrator&#8217;s Pocket Consultant, William R. Stanek, ISBN: 0735615608. Viimati nimetatud raamatus peatükk 8 on väga lakooniline ja samas täpne.</p>
<p>2. Kontrolli, et IIS suudab üle HTTPSi serveerida.</p>
<p>3. Lae Sertifitseerimiskeskuse lehelt alla sertifikaadid: <a title="http://www.sk.ee/pages.php/0202040501" href="http://www.sk.ee/pages.php/0202040501"><span style="color:#669966;font-family:&quot;">http://www.sk.ee/pages.php/0202040501</span></a> </p>
<p>Sul on vaja PEM formaadis sertifikaate: Juur-SK, ESTEID-SK ja ESTEID-SK 2007. Ava Notepadis uus tekstifail, ja copy-paste sinna üksteise järel samas järjekorras sertifikaatide sisu. Faili nimi ei ole oluline, võib olla näiteks ESTIDCompl.PEM.cer.</p>
<p>Ka faili laiend ei ole oluline, kuid kui annad laiendiks .cer, siis on võimalik sertifikaat kohe ka topeltklikiga installeerida. Sertifikaatide installeerimiseks pead olema sisse loginud administraatorina.</p>
<p>Kindlam viis on sertifikaadid installeerida Windows Serveri halduskonsoolis, selleks:</p>
<p>a) Start-&gt;Run, kirjuta mmc, OK. Avaneb tühi konsool.</p>
<p>b) konsoolis vali File-&gt;Add/Remove Snap In, avanenud aknas vajuta nuppu Add&#8230;</p>
<p>c) avanenud uues aknas vali nimekirjast Certificates, vajuta Add. Avaneb uus aken, kus vali Compute account. Finish, Close.</p>
<p>d) vajuta järelejäänud aknas OK.</p>
<p>e) Halduskonsooli tekitati Certificates puu, kus ava Trusted Root Certification Authorities ja parema hiire klikiga vali selle peal All Tasks -&gt; Import. Vali see kokku pandud fail (meie näites ESTIDCompl.PEM.cer).</p>
<p>Juhul, kui oled eelnevalt id.ee eksliku juhendi järgi katseid tehes oma sertifikaatide lao segi keeranud (installeerinud neid kõikidesse kohtadesse vms.), siis otsi üles just paigaldatud ESTIDCompl.PEM.cer-st tekkinud sertifikaat ja selle peal nimekirjas Properties aknas võid anda talle mingi sobiva Friendly Name.</p>
<p>4. Ava IIS halduskonsool, vali veebisaidi, millele soovid ID autentimist rakendada omadused (Properties). Kaardilt Directory Security (mis peaks juba tuttav olema, kuna sealt paigaldasid ka eelnevalt SSL sertifikaadi) vajuta osas Secure Communications nuppu Edit &#8230;</p>
<p>a) võid märkida valikukasti Require secure channel &#8211; kuid ID kaardiga autentimiseks ei ole see kogu saidile vajalik.</p>
<p>b) vali Client certificates alt vähemalt Accept client certificates (arusaadavatel põhjustel ei ole mõtet valida Ignore &#8230;)</p>
<p>c) Tee linnuke valikukasti Enable certificate trust list. Kui sul veel ei ole ühtki, siis vali New. Avanenud viisardis vajuta nuppu Add From Store, kus avanenud aknas lisa hiljuti lisatud ESTID failist tehtud sertifikaat (tunned selle ära näiteks eelnevalt antud Friendly Name järgi &#8211; kui oled eelnevalt juba importinud id.ee juhendi järgi, siis vale valiku tegemisel ei hakka autentimine tööle).</p>
<p>Juhul, kui kasutad test-SSL sertifikaati, siis pead valima lisaks ka juursertifikaadi SSL jaoks (mina näiteks Thawte Test CA Root).</p>
<p>Certificates in the CTL ehk Certificate Trust List loetleb <strong>JUUR</strong>sertifikaadid, mille sertifikaate aktsepteeritakse.</p>
<p>5. Edasi võid ID kaardiga autentimiseks valida mitmeid tehnikaid &#8211; kuid, sa ei pea sugugi kõiki faile tingimata kaitsma ID kaardi autentimisega. Piisab, kui su lehel leidub üks fail, nt. login.aspx, mille puhul nõutakse autentimist ja login.aspx seab püsti juba sessiooni, näiteks cookie põhise. Edasi teised failid kasutaks siis juba enda loodud sessiooni. See on otstarbekas näiteks siis, kui lehel saab mitmel moel autentida.</p>
<p>6. Login.aspx ID autentimist küsima panemiseks vali IIS halduskonsoolis veebisaidi failide nimekirjast Login.aspx ja parema nupuga kuva omadused ehk Properties.</p>
<p>a) vali File Security kaart, sealt Secure Communications osast vajuta Edit &#8230;</p>
<p>b) Tee linnuke valikukasti Require secure channel (SSL)</p>
<p>c) Client Certificates osast vali vähemalt Accept client certificates. Sa ei pea valima Require client certificates, sest juhul, kui kasutaja keeldub ID kaardiga autentimast, peaksid saama endiselt pakkuda kasutajale alternatiive, mitte keelduma näitamast login lehekülge.</p>
<p>7. Nüüd jääb teha veel saidipõhine autentimis- ja sessioonilahendus. Väga lihtne näide, kuidas ilma sertifikaadi aegumist kontrollimata lugeda aspx failis isikukood ja nimi:</p>
<p>if (Request.ClientCertificate["Subject"].Length == 0)<br />
        {<br />
            Response.Write(&#8220;Ei antud sertifikaate&#8221;);<br />
        }<br />
        else<br />
        {<br />
            String unparsed=Request.ClientCertificate["Subject"];<br />
            System.Text.RegularExpressions.Regex re = new Regex(&#8220;SERIALNUMBER=(\\d{11})&#8221;);<br />
            Response.Write(&#8220;&lt;br/&gt;unparsed:&#8221; + unparsed + &#8220;&lt;br/&gt;&#8221;);<br />
            if (re.IsMatch(unparsed))<br />
            {<br />
                String idcode = re.Match(unparsed).Groups[1].Value;<br />
                Response.Write(&#8220;Su isikukood on:&#8221; + idcode + &#8220;&lt;br/&gt;&#8221;);<br />
            }<br />
            System.Text.RegularExpressions.Regex rename = new Regex(&#8220;SN=(.*?),\\s+G=(.*?),&#8221;);<br />
            if (rename.IsMatch(unparsed))<br />
            {<br />
                String eesnimi = rename.Match(unparsed).Groups[1].Value;<br />
                String perenimi = rename.Match(unparsed).Groups[2].Value;<br />
                Response.Write(&#8220;Su nimi on: &#8220;+eesnimi+&#8221; &#8221; +perenimi+&#8221;&lt;br/&gt;&#8221;);<br />
            }<br />
        }</p>
<p> </p>
<p> </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/neemevool.wordpress.com/3/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/neemevool.wordpress.com/3/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/neemevool.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/neemevool.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/neemevool.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/neemevool.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/neemevool.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/neemevool.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/neemevool.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/neemevool.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/neemevool.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/neemevool.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/neemevool.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/neemevool.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/neemevool.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/neemevool.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=neemevool.wordpress.com&amp;blog=3487776&amp;post=3&amp;subd=neemevool&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://neemevool.wordpress.com/2008/04/15/id-kaardi-pohise-autentimise-seadistamine-iis-60-s/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b701928efb475985e5d9e3d83512adc9?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">neemevool</media:title>
		</media:content>
	</item>
	</channel>
</rss>
