You are here:   Blogs
  
Author: SUF Created: 2008.11.26. 10:28
SUF Blog

27.-én volt a kicsi fiam második születésnapja. A nagycsalád összegyűlt délután a fiatalurat ünnepelni. Gyártattunk neki egy porszívó alakú tortát, mert mostanában nagyon rá van csatlakozva a nevezett eszközre.

A délután eltelt, sőt az este is. 10 óra magasságában hazafuvaroztam az anyósomat. Nem picit fáradtan az egész napi rohangálás után hazaérek és próbálnék behaladni a kertkapun.

Na ez nem jön össze, mert valami okos BMW-s (ki más) teljesen beállt a kapuba (azt ugye mondanom se kell, hogy az utcán természetesen öt méterrel arrébb volt olyan hely, ahol nem zavart volna senkit.

Elkezdtem dudálni, hogy hátha valaki észreveszi. Hát nem. Mintegy 15 perc alatt majdnem az összes szomszéd kijött az ablakba, hogy ki az a barom, aki dudál. Ebből arra következtettem, hogy nem a mi házunkban található a tulaj.

Nagyon berágtam. Beálltam az okostojás elé két centire. Majd elindultam fel a lakásba a párom autókulcsáért. Be akartam állni mögé két centire a másik autoval.

A párommal a lépcsőn találkoztunk, mert ő közben rájött, hogy én vagyok az az őrült, aki esztelenül dudál. Neki még volt egy ötlete, hogy hátha a barátnőjénél van valaki.

Felhívta.

Nyert.

Fickó előkerült, még volt hozzá néhány keresetlen szavam, melyben tudattam vele, hogy ha most nem jön, akkor lett volna még három perce addig amíg már nem tud mozogni az autójával.

Távozott.

Úgy döntöttem a nagy idegbetegségemre, hogy erre inni kell. Feljöttünk a lakásba így hárman (a barátnő, a párom és én). Megkínáltuk a barátnőt a fiam tortájából. A hölgy elkezdett gondolkozni. Majd a következővel állt elő:

A fickó, akinek az előbb leharaptam a fejét cukrász. Abban a cukrászdában ahol a tortát rendeltem és mesélte neki, hogy csinált ma egy porszívó alakú tortát...

Eddig a DotNetNuke-al kapcsolatban csak a problémáimról számoltam be. Most álljon itt az első megoldás.

Van Full-Text RSS !!!

Ezzel a dologgal három bajom volt:

1. A jövőbeni működésemhez saját magamnak is, és másoknak is statisztikákat kell produkálnom a működésemről. Ez az egyik oka annak, hogy egyáltalán belekezdtem az önálló oldal gyártása című projectbe. Azt gondoltam, hogyha nem csinálok full-text RSS-t akkor az olvasót ráveszem, hogy ellátogasson az oldalra, javítva ezzel a statisztikámat (egyelőre fogalmam sincs, hogyan lehetne a feed olvasást statisztikázni). Közben többen jelezték, hogy legyek olyan kedves és csináljak full-text feedet. Átgondoltam. Ám legyen.

2. Már az elején gondot okozott, hogy annak ellenére, hogy a dokumentáció ezt írja nem generál automatikusan summary-t.

3. Ugyan megtaláltam, hogyan lehet full-text feedet csinálni, de ez a 2. pontból következik, így meg vagyok lőve. Nincs automata summary - nincs full-text feed.

Akkor a megoldás:

Automata summary azért nincs, mert az FCK Editor magától bepakol valamit az üres szöveges mezőbe, a blog motor ebből azt érzékeli, hogy írtam summary-t tehát nem generál.
Ezt két módon lehet rendbetenni. A kézi hajtány mód, hogy basic text-re kapcsolom a formot és kitörlöm, amit az FCK belerakott. Az automata megoldás, hogy kicsit reszelgetek az FCK konfigján. Ezt:

FCKConfig.FillEmptyBlocks    = false ;

kell két fájlban javítani. Ezekben:

[dnnroot]\Providers\HtmlEditorProviders\Fck\FCKeditor\fckconfig.js
[dnnroot]\Providers\HtmlEditorProviders\Fck\Custom\fckconfig.js

Na nem én vagyok ilyen okos, hanem itt találtam a megoldást.

Ha ezzel megvagyunk, akkor teljes summary-t gyártani már nem nagy kaland, összesen a blog modul konfigjában a "Limit Auto-Generated Entry Summary To" című beállítást kell 0-ra állítani.

Na ezt se magamtól tudom, hanem innen szedtem.

Plusz megjegyzés. A 0 nem jó, mert akkor nincs link a teljes bejegyzésre. -1 lett a megoldás, ez már saját felfedezés.

Már korábban írtam róla, hogy elkövettem egy ingyenes vírusirtót az Exchange 2007-hez. Most elkészült ennek az Exchange 2003-al vagy IIS SMTP szerverrel használható változata. Mind a kettő megtalálható a http://www.clamagent.org -on.

További kalandozások következnek a DotNetNuke világában.

Tegnap beharangoztam, hogy a blogom költözik ide. Rögtön kaptam is megjegyzést hozzá, hogy

1. Nem lehet kommentet írni.

2. Ha azt akarom, hogy olvassák, csináljak full text rss-t.

Az elsőhöz annyit, hogy lehet kommentet írni, de csak bejelentkezve. Ezen nem is nagyon szeretnék változtatni, mert kíváncsi vagyok, hogy ki jár erre. Kiraktam egy szöveget, ami tájékoztat erről. A másodikon egyrészről sokat gondolkozom, hogy szeretném-e. Valószínűleg meg fogom csinálni. Másrészről, még nem sikerült kibogarásznom, hogyan lehet megcsinálni.

Az egyéb bajom viszont kínos. Elkezdtem a Downloads szekcióba átköltöztetni a saját honlapomon, valamint a skydrive-on található fájlokat. Ezek egy része viszonylag méretes. A beépített korlátokat sikerült átlépnem a web.config szerkesztgetésével, de változatlanul nem tudom a 40MB fölötti fájljaimat feltölteni, mert egy 404-es hibát kapok. A korlát valahol 30 és 40 mega között lehet.

Egyenlőre küzdök.

Kicseréltem a logót, de ennél több kellene. Kéne valami design-t elkövetni, amihez nem értek. Se design, se DNN skinning oldalról.

A lokalizációval jó lenne még tenni valamit, mert jelenleg elég korlátozott a több nyelv használata.

Folyt. köv.

Az elmúlt hónapjaim nagyrészt a Microsoft Dynamics CRM bevezetésünkkel töltöm. Ennek kapcsán be kellene tölteni a partnertörzset. Az ügyviteli rendszerünkből származó adathalmaz mára többszörös tisztításon esett át. Ma rendbe akartam rakni az országkódokat, ugyanis az eredeti rendszerben sok külföldi partnerünk magyar országkóddal szerepelt.

A CRM alapvetően a címzésnél nem használ országkódokat. A saját ügyviteli rendszerünk kódjait pedig nem akaródzott használni, tekintve, hogy a kiadás sorrendjében generálódik, így nem kötődik semmihez.

Kiadó vállalat lévén, adódott, hogy a Magyar Posta országkódjait használjam. Kaptam is egy listát, ma nekiugrottam a munkának.

Az első dolog, ami szembejött, hogy Magyarország nincs rajta. Ám legyen, 0-ás nincs, önkényesen Magyarország fogja kapni a 0-át. Amint tüzetesebben nézem a listát, mit találok...

 

Édes arany bogaraim, 2008-at írunk.

Elkészült a legújabb elkövetményem. Ezt most remegő kézzel adom közkézre, mert ilyet még nem csináltam. Mit is? Portált. Pontosabban írtam egy programocskát (ilyen már volt) és ehhez készítettem egy web portált (ilyen még nem volt).
Ha valakit érdekel, hogyan lehet az Exchange 2007-hez ingyenesen vírusirtót fabrikálni, akkor az itt talál megoldást:
http://www.clamagent.org

Egyenlőre küzdök. Próbálok kihozni valamit a DotNetNuke-ból. Még neki sem álltam, hogy a kinézetet testreszabjam. Egyenlőre van néhány bajom van vele:

Nem találtam meg, hogy cikk jellegű információt melyik modullal tudnék kényelmesen elhelyezni. Egyenlőre sötétben tapogatózom és a Blog, a Wiki, és a külön lapokra feltett html content között vacillálok.

A lokalizáció még nem egészen tiszta nekem. Szeretném az oldal bizonyos részeit angolul és magyarul is elérhetővé tenni. Az alap rendszerben nem igazán találom ennek az értelmes megoldását. Találtam ingyenes lokalizált modulokat, fel is tettem őket, de sajnos csak nagyon korlátozottan használhatóak.

Nem találtam meg, hogy a blog motornál, hogyan lehetne elérni azt, hogy a teljes tartalom kerüljön ki mind az oldalra, mind az rss feedbe.

Addig amíg nem tudok valami értelmeset a főlapra kirakni, kiraktam annak a blognak a feedjét amit írni szoktam.

Eredetileg nem írtam ide semmit, mert a motor azt mondta, hogy "(The summary is optional, if you choose to not supply one, a short summary will be generated from your entry.)". Hittem neki. Nem kellett volna, üres lett. Szóval itt írok az okokról, hogy miért kezdtem ebbe bele.

Read More »

Most jön egy cikk arról, amihez nem értek.
Már néhányszor utaltam rá, hogy cégünknél Microsoft Dynamics CRM 4.0 bevezetés zajlik. A munkálatok nagy sebességgel zajlanak, én pedig próbálom üzemeltetési szempontból (na jó kicsit üzleti szempontból is) megfelelő mederben tartani a dolgot.
Hetekkel ezelőtt elkezdtünk vitatkozni a valutaárfolyamok kezeléséről. Nem volt tiszta, hogy a CRM hogyan kezeli, nekünk pedig nem volt kritikus az egész ügy, mert a számlák nem a CRMből, hanem a korábban már emlegetett php-s alkalmazásból kerülnek kiállításra.
A napokban a dolog begyűrűzött, mert kiderült, hogy egyre több külföldi számlát állítunk ki, és a CRM riportokban ezeket ugye jó magyar forintban kellene látnunk. Végül az derült ki, hogy ugyan a CRM csak egyetlen árfolyamot tárol valutánként, de a lezárt megrendelésekbe bekerül a lezáráskor (számlázáskor) az árfolyam.
Ez nagyon szép, de ahhoz, hogy a történet működni tudjon valahogy, biztosítani kellene, hogy a rendszerbe rögzítésre kerüljenek az árfolyamok.
Erre két módszerem lehet:
1. A titkárnő naponta végigmegy az árfolyamokon és kijavítja őket. (Broáf)
2. Valahogy automatizálva történik ez meg.
Természetesen a másodikat választottam. Nemrég volt az IT4Business rendezvény, ahol Soós Attila kollégám elpöttyentette, hogy az MNB web szolgáltatás formájában napi szinten szolgáltatja az árfolyamokat.
Feldobtam a CRM-et bevezető cégnek, hogy nem akarnak-e gyártani egy automatizmust, ami lekéri az MNB árfolyamokat és beletolja a CRM-be. Nem nagyon hajlottak rá, hogy saját szakállukra megcsinálják (megértem őket, bár szerintem ez más ügyfélnél is elsüthető lenne). Én pedig nem igazán akartam fizetni érte, mert ezekben a recessziós időkben nem szívesen növelném tovább a project költségeit.
Elhatároztam, hogy megpróbálkozom a feladat megoldásával. Két dolgot használtam fel hozzá. Megtaláltam Kővári Attila cikkét az MNB web szolgáltatásról (http://www.biprojekt.hu/blog/MNB_arfolyamok_letoltese-Kozvetlenul_az_MNB-tol.htm), valamint elővettem azt a CRM könyvet, amit az áprilisi Seattle-i úton szereztem be Budai Peti jóvoltából (http://www.amazon.com/Microsoft-Dynamics-CRM-4-0-Unleashed/dp/0672329700).
Ezek alapján elkövettem egy programot, ami megoldja a feladatot. Naponta egyszer déli 12 óra után kell futtatni, mert addigra kerülnek publikálásra a napi árfolyamok.
A futtatható állomány innen. A forráskód pedig innen tölthető le.
Néhány gondolat a konfigurációról. A konfiguráció a MNBGetRate.exe.config fájlban található.
A következő paramétereket lehet állítani:
MNBGetRate_MNB_MNBArfolyamService
Ez határozza meg az MNB web szolgáltatás helyét. Alapértéke: http://www.mnb.hu/arfolyamok.asmx. Ezt nem szabad piszkálni mindaddig, amíg az MNB el nem költözteti valahova.
MNBGetRate_CrmSdk_Discovery_CrmDiscoveryService
A CRM Discovery web szolgáltatás helye. Értéke: http://crm szerver név/MSCRMServices/2007/AD/CrmDiscoveryService.asmx. A crm szerver nevét be kell helyettesíteni.
MNBGetRate_CrmSdk_CrmService
A CRM Data web szolgáltatás helye. Értéke: http://crm szerver név/MSCrmServices/2007/CrmService.asmx. Ezt a paramétert tudtommal nem használja semmire a program, mert a Discovery-től kérdezi le a Data web szolgáltatás elérhetőségét. Nem mertem kigyomlálni, mert a web service designer követte el.
Organization
A szervezet (cég) CRM-ben beállított neve.
Auth_Type
Az authentikáció típusa a CRM-hez. Lehetséges értékei:
Integrated:
A bejelentkezett felhasználó jogosultságait használja.
Password:
Ebben az esetben a megadott Auth_User, Auth_Password, Auth_Domain alapján jelentkezik be a CRM-be
 
A programkód rendelkezik néhány hiányossággal amit, ha időm engedi, pótolni fogok:
- Hibakezelés
- Logolás
- Több szervezet kezelése

Valamikor tavaly december végén előjött egy nagyon kemény Exchange-es feladat. Meg kell oldani, hogy egy disztribúciós lista levelező listaként működjön. Ebben annyi a feladat, hogy minden levélbe amit a disztribúciós listára küldünk, bele kell rakni egy Reply-To  mezőt, hogy a válaszlevelek is a disztribúciós listára menjenek vissza. Meg is csináltam a dolgot, el is kezdtük használni, amikor kiderült, hogy az Exchange 2003-at 2007-re cseréljük és a 2003-hoz megírt sink nem jó a 2007-hez.

Nekiálltam és megcsináltam a 2007-es Transport Agentet. Ma mind a két verzió hibátlanul működik egy-egy szerveren.

Az elmúlt hónapokban valahogy sosem volt időm arra, hogy a fentiekhez kapcsolódó cikkeket megírjam és publikáljam az egészet. Ma vettem észre ezt:

http://www.microsoft.com/hun/technet/default.aspx?article=266802d4-92c0-42ad-836b-91bff94e8711

Lelőtték a poénomat. Így jártam.

Így utólag azt hiszem, hogy most rá fogom szánni az időt, kicsit gatyába rázom a cuccot és publikálom.

Jó eséllyel ezért a bejegyzésért kapni fogok a fejemre, de nem állom meg, hogy le ne írjam. Egyszerűen bosszant amikor engem mint vásárlót ennyire hülyének néznek. Már vagy két hete érlelődik bennem a gondolat, hogy megírjam, de ma jött egy e-mail ami katalizálta a folyamatot.
Alapszituáció:
Szombat este van, olyan 7 óra körül és nekem valahonnan, akár föld alól is kerítenem kell egy kicsi otthoni ADSL routert (Van egy lakás ahol korábban volt net, az ADSL modem most is ott van, nem tudom hol, de az adott lakásban eredetileg használt routert elhagytam és hirtelen kellett ott net).
Irány a Media Markt.
Kerestem valami 5eFt körüli eldobható darabot, elvégre semmi mást nem kell tudnia, mint minimális tűzfalat játszani, meg DHCP-t produkálni a kliens felé. Ilyet nem találtam, maradt az, hogy veszek valami olyat amit a későbbiekben akár másra is tudok használni. A választásom a Linksys WRT-54GL-re esett, mert ebbe akár szabadon összerakható linux firmware-t is tehetek (http://openwrt.org). Az ára 26 990 Ft volt. Ha véletlenül nem tudtam volna csuklóból, hogy átvernek (ezt a routert nagykerben 12-17eFt nettó áron szoktam venni), a vevőszolgálat az orrom alá is dörgölte azzal, hogy a nagykerből (AlphaSonic) származó garanciajegyet dugott az orrom alá.
Az e-mail, amit ma kaptam az AlphaSonic-tól jött és hirdeti, hogy akcióban 11 900 Ft nettó áron kapható a fent említett router.
Számoljunk egy picit. A 11 900 Ft-os nettó ár forgalmi adóval növelten 14 280 Ft lesz. Visszaosztva ez a Media Markt-nál 89%-os árrést jelent. Ahogy én látom, egy normális informatikával foglalkozó kiskereskedő 5-15%-os árréssel tud dolgozni. Hmmm. Erre szokták mondani, hogy ügyes.
Ez még nem volt elég. Izgatja a fantáziámat, hogy legyen otthon egy Blu-Ray lejátszó. Ki is választottam egy szimpatikus típust:
Samsung BD-P1000
Körülnéztem az interneten és 153 000 Ft-os, valamint 164 000 Ft-os áron találtam meg különböző webáruházakban. Ez az eszköz a Media Markt-ban valami 330 000 Ft körüli áron kapható (nem jegyeztem meg a pontos összeget).
Ha ehhez az egész történethez hozzáteszem azt, hogy a Media Markt és a Saturn nevű két egymást a reklámokon keresztül folyamatosan piszkáló áruházlánc háborúja tulajdonképpen álháború, ugyanis a két cég gyakorlatilag egy tulajdonban van, akkor saját magam számára újra kell értelmeznem a "Hülye aki nem ünnepel" reklámmondatot.

Nagyjából két éve írtam egy cikket "Bevezetés az SMTP EventSink világába rendszergazdáknak" címmel itt a honlapomon. Ez a cikk alapvetően a script író, programozó kedvű rendszergazdákat célozta meg akik a Microsoft Exchnage 2000/2003 környezetben (ide értendő a Microsoft Windows 2000/2003 IIS SMTP szervere is) valamilyen okból bele akartak nyúlni a rendszeren áthaladó e-mailekbe. Azóta a világ sokat változott és benne én is. Megjelent az Exchange 2007, ami teljesen új alapokra helyezi a Windowsos világ üzenetkezelését, valamint én is sokat tanultam, fejlődtem ebben a témakörben amit szeretnék itt és most közzétenni.
Ez a cikk tekinthető a fent említett darab 2.0-ás változatának. Tartalmazza az összes információt ami abban a cikkben megtalálható volt, továbbá sok pontosítást és kiegészítést amire az évek során jöttem rá, szedtem össze információmorzsákból. Ezen túl az Exchange 2003 oldalán átvezet a .NET világba betekintést nyújtva abba a lehetőségbe, hogy script nyelvek helyett .NET-ben írjunk SMTP eseménykezelőket, valamint átvezet az Exchange 2007 ide vonatkozó technológiai (Transport Rule-ok és a Transport Agentek) világába.
1. Bevezetés az SMTP EventSink világába
A Microsoft Exchange Server 2000/2003 és az alatta található Windows Server komponensei (IIS SMTP szerver) lehetőséget kínálnak arra, hogy a rajtuk áthaladó levelekhez programozottan hozzá tudjunk nyúlni. Ezt különböző bonyolultsággal és ebből következően különböző lehetőségekkel tehetjük meg.
Ezek közül a lehetőségek közül, először azt szeretném bemutatni ahol egy egyszerű VBScript vagy JScript kódból bele tudunk nyúlni a rendszerünkbe beérkező és onnan kimenő levelekbe.
Ehhez az Exchange által használt SMTP szerverhez kell egy beépülő modult írnunk és regisztrálnunk. Ez a modul lesz az úgy nevezett SMTP EventSink. Az SMTP levélküldés folyamatába több ponton lehet beavatkozni. Ezek közül most csak azzal az egy pontal foglalkozunk amihez script nyelven is hozzá lehet férni. Az összes pont COM eseménykezelőként érhető el, ezek közül egyhez (OnTransportSubmission vagy más néven OnArrival) készült egy script host (CDO.SS_SMTPOnArrivalSink), amit regisztrálni tudunk a saját scriptünk helyett és ennek a script hostnak adjuk meg paraméterként a végrehajtandó script nevét.
A scriptünk így fog kinézni:

eventsink.vbs

<SCRIPT LANGUAGE="VBSCRIPT">
    Sub ISMTPOnArrival_OnArrival(ByVal Msg, EventStatus)
        ' Ide kerül az EventSink kódja
 End Sub
</SCRIPT>

eventsink.js

<SCRIPT LANGUAGE="JSCRIPT">
    function ISMTPOnArrival::OnArrival(Msg, EventStatus)
    {
        // Ide kerül az EventSink kódja
    }
</SCRIPT>

Az eseménykezelőnk két paramétert kap. Az egyik egy CDO.Message objektum ami tartalmazza a teljes e-mailt. Leírása itt található: CDOEX IMessage Interface. A másik egy EventStatus nevű változó, amin keresztül jelezhetjük a rendszernek, hogy a mi eseménykezelőnk lefuttatása után a hátralévő még sorban lévő eseménykezelőket lefutassa e.
Azzal, hogy megírtuk az eseménykezelő scriptünket még nem vagyunk kész, ugyanis ezt regisztrálnunk kell az általunk kiválasztott SMTP Virtual Serveren. Erre a regisztrációra a Microsoft által írt SMTPREG.VBS script használható. Ebből a scriptből az évek során alapvetően két verzió készült. Az egyik (egyszerűbb) kiadás része az Exchange SDK Documentation And Samples csomagnak, telepítés után a C:\Program Files\Exchange SDK\SDK\Support\CDO\Scripts könyvtárban található (Ha valaki nem akar bíbelődni az egész SDK-val akkor csak magát a scriptet letöltheti innen). Ez a verzió jól használható azok számára akik kizárólag script nyelven írnak eseménykezelőt, ugyanis ezzel, csak a korábban már említett OnArrival eseményre lehet feliratkozni, ugyanakkor könnyebbséget jelent, hogy a regisztrációk listázásánál nem kapjuk meg feleslegesen az egyéb eseményekre regisztrált számtalan Exchange eseménykezelő listáját. A másik verzió ami teljes funkcionalitással használható itt érhető el, valamint a teljesség kedvéért a saját oldalamra is kiraktam ide. Abban az esetben, ha nem script nyelven írunk eseménykezelőt és nem az OnArrival eseményre szeretnénk feliratkozni mindenképp ez utóbbit kell használnunk.

Most néhány példán keresztül bemutatom az smtpreg.vbs használatát.

Meg tudjuk vele nézni, hogy jelenleg milyen eseménykezelők vannak regisztrálva:

cscript smtpreg.vbs /enum

Tudunk regisztrálni eseménykezelőt:

cscript smtpreg.vbs /add 

Nézzük meg, hogy mit is jelentenek ezek a paraméterek:

<Virtual Server> Az SMTP Virtual Server azonosítója. Ez az azonosító egy szám, a Default Virtual Server esetén 1.
<Sink> Az eseménykezelő interfész neve, script esetén mindíg onarrival
<Név> Az eseménykezelőnk saját neve. Ez teljesen szabadon választott, ezzel a névvel tudunk hivatkozni az eseménykezelőnkre.
<Eseménykezelő> A regisztrálandó COM Event handler neve. Ha scriptet akarunk használni, akkor a scripting host neve. Esetünkben mindíg CDO.SS_SMTPOmArrivalSink.
<Protokol szűrő> Az SMTP protokolban használt küldőre (mail from=) és címzettre (rcpt to=) használható szűrő. Ezzel a szűrővel tudjuk meghatározni, hogy mely levelekre hajtódjon végre az eseménykezelő (pl. az összes levélre: "mail from=*").


Tudunk eseménykezelőt törölni:

cscript smtpreg.vbs /remove 

Tudunk az eseménykezelőnkhöz különböző plusz paramétereket adni:

cscript smtpreg.vbs /add <Virtual Server> <Sink>
	<Név> <Eseménykezelő> <Protokol szűrő>

Ezekről a paraméterekről két fontos dolgot kell még tudnunk. Sajnos az itt beállított paraméterek lekérdezésére az általunk írt scriptekből nincs lehetőségünk (A Microsoft által írt scripting host ezeket a paramétereket nem adja át a scriptünknek). Fontos ugyanakkor tudnunk, hogy nekünk a scriptünk regisztrációjakor meg kell adnunk egy paramétert, ami a scripting host-nak mondja meg, hogy hol találja a végrehajtandó scriptet.

<paraméter neve> A COM eseménykezelőnek átadandó paraméter neve. Script regisztráció esetén kötelező a script nevét átadni. Esetünkben ez ScriptName lesz.
<paraméter értéke> A COM eseménykezelőnek átadandó paraméter értéke. Script regisztráció esetén kötelező a script nevét átadni. Esetünkben az értéke a scriptünk neve lesz, teljes elérési úttal.


Minden további magyarázat helyett lássunk egy példát:

cscript smtpreg.vbs /add 1 OnArrival Disclaimer
	CDO.SS_SMTPOnArrivalSink "mail from=*"
cscript smtpreg.vbs /setprop 1 OnArrival Disclaimer
	Sink ScriptName "c:\Scripts\SMTP\disclaimer\disclaimer.js"

Ha regisztráció után elkezdjük használni az első eseménykezelőnket, meglepetten fogjuk tapasztalni, hogy az csak a bejövő leveleinkre hajtódik végre. Sem a kimenő leveleinken, sem a belső Exchange felhasználók közötti leveleken nem hajtódik végre. Ez ugye azon kliens programokból küldött levelekre vonatkozik melyek nem SMTP-t vagy Pickup könyvtárat használnak küldésre, hanem natív MAPI kapcsolaton keresztül küldik a leveleket (Outlook, OWA, OMA, stb.).
Mi ennek az oka? A jelenség ismert a Mcrosoft KB 273233 cikk foglalkozik vele részletesen. Saját tapasztalataim ugyanakkor azt mutatják, hogy az említett cikk hiányos.
Először is szeretnék eloszlatni egy tévhitet (saját magam is rosszul gondoltam jó ideig):
Az általános vélekedéssel ellentétben azok a levelek amiket egy Exchange felhasználó küld egy másik Exchange felhasználónak még abban az esetben is amikor azonos adatbázisban található a mailboxuk áthaladnak az SMTP Transporton. Ha ez így van, tehát minden levél áthalad az SMTP Transporton, akkor az eseménykezelőnk miért nem hajtódik végre a kimenő és az átmenő leveleken?
Ennak alapvetően két oka van:
1. Ezek a levelek az SMTP Szervernek csak a transport részén haladnak át és a protokol részén nem. Ezzel alapvetően még nem is lenne baj, mert az eseménykezelőnk nem az SMTP protokol utasításait figyeli, hanem azokat a leveleket amiket az SMTP szerver már teljesen átvett, tehát a transport fázisba jutottak. A gond az eseménykezelőnk regisztrációjánál van. Azokon a leveleken amik nem haladtak át a protokol szakaszon nem található meg az SMTP boríték, ezért ezeken a leveleken nem tudjuk érvényesíteni a regsztrációnál megadott protokol szabályt (pl. "mail from=*"). Sebaj mondhatnánk, akkor regisztráljunk szabály nélkül, vagy üres szabállyal. Ez nem fog működni. Az első esetben az smtpreg.vbs hibát ad, a második esetben viszont létrehozza a regisztrációt, de benne lesz a szabály (rule) üresen, így változatlanul nem hajtódik végre az eseménykezelőnk az említett leveleken. Hogyan lehet ezt kikerülni? Egyszerűen. Kicsit bele kell javítani az eredeti smtpreg.vbs-be például úgy, hogy ha üres szabályt adunk meg akkor ne is regisztrálja azt. Nem kell megijedni, nem kell megkeresni az smtpreg.vbs kódjában, hogy mibe is kellene belenyúlni, mert én ezt már megtettem. A módosított verzió letölthető innen. Ha ennek a változatnak üres rule-t adunk meg akkor nem fog rule-t regisztrálni.
2. A második probléma már keményebb dió. Itt jön be először is amit a KB cikk ír, az, hogy a rendszer eldobja azt az üzenet példányt amit nekünk mint eseménykezelőnek átadott, így a módosításaink elvesznek. A helyzet sajnos ennél sokkal rosszabb. Nem is tudunk mit kezdeni az átadott levéllel, ugyanis a levéltovábbításnak ebben a szakaszában még nem történt meg a TNEF/MIME konverzió (a TNEF az Exchange által használt belső formátum) és eszközünk sincs arra, hogy ezt scriptből megtegyük.
Ezt a problémát kétféleképpen tudjuk áthidalni. Az egyik megoldás, hogy maradunk a script nyelveknél és az SMTP Virtual Serverekkel trükközünk, a másik, hogy elhagyjuk a script nyelveket és C/C++-ban, vagy .NET-ben írjuk meg az eseménykezelőnket és azt az OnArrival helyett az OnPostCategorize eseményre regisztráljuk.
Először nézzük meg, hogyan tudjuk a kérdést megoldani az SMTP Virtual Serverek konfigurációjával. Előre kell bocsátanom, hogy ilyen módon a belső leveleket nem fogjuk tudni kezelni, csak azokat amik az Exchange-ből kifelé haladnak.
Az elv az, hogy létre kell hoznunk egy második SMTP virtual server-t és át kell irányítanunk minden levelet az első virtual server-ről a másodikra. Ezek után az eseménykezelőnket a második SMTP virtual server-re telepítjük. Ez biztosítja, hogy mire az eseménykezelőnk végrehajtódik a levél MIME formátumú legyen.
A következő lépésekben létre fogunk hozni egy második SMTP virtual servert ami a szabványos 25-ös TCP port helyett egy másik porton figyel (pl. a 26-oson) és a szabványos 25-ös porton küldi a leveleket. A default SMTP virtual server pedig a 25-ös TCP porton figyel és a 26-os TCP porton küldi ki a leveleket, amit a második SMTP virutal server fog átvenni. Alapvetően bármilyen levél halad át, annak a default SMTP virtual server-re kell megérkeznie. Ha a levél belső címre irányul akkor azt a default SMTP virtual server kézbesíti és nem halad át a második SMTP virtual serveren. Ha a levelet kifelé kell kézbesíteni akkor a default SMTP virtual server átaja a második SMTP virtual servernek.
1. Nyissuk ki az Exchange System Manager-t és navigáljunk az SMTP mappához. Ez a mappa a First Administrative Group/Servers/szerver neve/Protocols/SMTP.
2. Kattintsunk a jobb egérgombbal a mappára, majd a New menüpontra, majd az SMTP Virtual Server menüpontra.
3. Írjuk be az új virtual server nevét és nyomjuk meg a Next gombot. IP címnek adjuk meg az All Unassigned bejegyzést és nyomjuk meg a Finish gombot. Egy figyelmeztető ablakot fogunk kapni arról, hogy a szerver nem fog elindulni az ütköző IP címek és portok miatt. Ezt a figyelmeztetést figyelmen kívül hagyhatjuk. Nyomjuk meg a Yes gombot.
4. Kattintsunk jobb egérgombbal egyenként a virtual server-ekre és utána válasszuk ki a Stop menüpontot.
5. Kattintsunk jobb egérgombbal a default SMTP virtual server-re és válasszuk ki a Properties menüpontot.
6. A Delivery fülön kattintsunk az Advanced gombra. A Smart host szövegdobozba írjuk be a gépnek azt a teljes domain nevét ami pontosan a Smart host szövegdoboz fölött található, vagy a szerver IP címét szögletes zárójelbe foglalva, majd kattinsunk az OK gombra. A Delivery fülön kattinsunk az Outbound connections gombra. A TCP szövegdobozba írjuk be a 26-ot és kattintsunk az OK gombra. Kattintsunk az OK gombra a párbeszédablak becsukásához.
7. Kattintsunk jobb egérgombbal a másik SMTP virtual server-re és válasszuk ki a Properties menüpontot. A General fülön kattintsunk az Advanced gombra válaszuk ki az All Unassigned sort. Kattintsunk az Edit gombra, változtassuk meg a TCP portot 26-ra és kattintsunk az OK gombra. Kattintsunk mégegyszer az OK gombra.
8. Kattintsunk az Access fülre, majd a Relay gombra, majd adjuk hozzá az engedélyezett gépek listájához a gépünk IP címét és a 127.0.0.1-es címet. Kattintsunk az OK gombra majd mégegyszer az OK a párbeszédablak bezárásához.
9. Kattintsunk jobb egérgombbal egyenként a virtual server-ekre és utána válasszuk ki a Start menüpontot.
10. Regisztráljuk az eseménykezelőnket a második SMTP virtual serverre. Használjuk a következő parancsot:

cscript smtpreg.vbs /add 2 OnArrival PeldaOnArrivalEsemeny
	PeldaSMTPEsemeny.EsemenyInterface "mail from=*"

Vegyük észre, hogy egy 2-es áll az "/add" után ami megmondja a scriptnek, hogy a második SMTP virtual server-re regisztrálja az eseményt. Normál esetben ez 1 az első (default) SMTP virtual server-re.
Ennek a módszernek két szépséghibája van. Az egyik, hogy abban az esetben ha az Exchange szervezetben több szerver is szerepel, akkor a fenti beállítások nem elégségesek és nem is megfelelőek. Ez esetben a beállítások az Exchange routing alapos elméleti szintű ismeretét ígénylik. A másik gond, hogy ez a megoldás az eredeti Microsoft leírások szerint nem üzembiztos, ugyanis az Exchange szerver nem a Default Virtual Serveren keresztül küldi ki a leveleket, hanem azon keresztül amelyik egy rendszerindításnál, vagy a Virtual Serverek kézi indításánál/leállításánál először elindul. Zárójelben jegyezem, hogy nagyjából 5-6 éve használok ilyen módon felépített rendszert és miután a kézi indításnál/leállításnál mindíg kínosan ügyeltem arra, hogy a Default Virtual Servert indítsam el először, soha nem volt problémám abból, hogy esetleg az Exchange rossz Virtual Serveren keresztül küldte volna ki a leveleket.
folyt. köv...

Átmenetileg kiraktam az internetre a tegnapi webcast anyagát. Nem sokára a Microsoft oldalán is meg fognak jelenni ezek a fájlok.
 
Powerpoint Prezentáció:
http://www.it-pro.hu/Default.aspx?tabid=95&id=60
Powerpoint Demo:
http://www.it-pro.hu/Default.aspx?tabid=95&id=61
Előadói megjegyzések (pdf):
http://www.it-pro.hu/Default.aspx?tabid=95&id=62

Lassan jönnek a scriptek is, csak az egyiken még kicsit fényezek.
 
[Update 2006/09/22 16:53]
Kiraktam a scripteket is végre:
http://www.it-pro.hu/Default.aspx?tabid=95&id=63 
[Update 2006/09/25 16:16]
Kikerültek az anyagok a Microsoft weboldalára. Mostmár a Webcast felvétele is kint van:
http://www.microsoft.com/hun/webcast/default.aspx?id=07c01307-e5b7-4918-bd40-d6e6a6d16011

Tegnap megtartottam a mentésről és visszaállításról szóló webcastomat. A visszajelzések szerint nem volt csúfos bukás a dolog ugyanakkor én nem vagyok elégedett magammal.
Ma reggel megint bejött: egy Murphy nevezetű alak összes fel és lemenőinek folyamatos emlegetésével kezdtem a napot.
Előzmény:
Úgy két hete az egyik szerverünk RAID-jében kikönyökölt az egyik vinyó. Ki is cseréltem valamire amit épp a fiókban találtam, újra is építette, de a fiókból berakott disk-et nem akartam véglegesen bennehagyni, ráadásul némi kapacitás bővítés is ráférne az egyedre így megrendeltem egy teljes garnitúra új vinyót, melyek meg is jöttek.
Ma reggel 9 körül:
Lementem a szerver szobába, hogy elkezdjem egyesével kicserélni a disk-eket amit ugyebár on-line meg tudok tenni. Valamit meg akartam nézni a gépben belül ezért kihúztam a rackből. Figyelmetlen voltam, túl rövid volt a 230-as kábel így a gépet sikerült áramtalanítani. Amikor visszakapcsoltam egy kék képernyős nemindulással fogadott (gratula Murphy).
Na boldog vagyok, kipróbálhatom, hogy én mennyire vagyok jó abban amiről tegnap dumáltam.
9:23:
Először is ASR kilőve. Az előadásban sem beszéltem róla, mert nem használom és időm sem volt foglalkozni vele (úgy látom mindenképp utána kell néznem)
Gép boot CD-ről, Recovery Console elindít. Ez az a dolog amit a büdös életben nem használtam. Rájöttem, hogy ma sem fogom. Se az AD Admin jelszavát, se az AD Recovery Admin jelszót nem fogadja el (ja nem mondtam még, a gép hogy könnyítsünk a helyzeten egy DC).
9:46:
Megpróbálom a CD-ről a telepítsünk és reparáljunk opciót. Sok bizodalmam nincs benne, mert nekem még sosem működött (nagy gáz persze nincs, mert legrosszabb esetben újratelepít az egész és mentésből visszatölt. Ez sem tarthat sokáig, mert ugye disk nem sérült és éles szerveren mindig külön tartom a boot partíciót, így csak a c-t kéne visszatölteni).
10:18:
Csoda történt. Egyszer az életben működött a repair. Elindult az egész.
10:32:
Települnek újra a biztonsági hotfixek.
11:06:
Hotfixek fenn, újraindulunk.
11:16:
Működik a dolog. Most nekikezdek a vinyócserének.

Előre szólok, csak az olvassa el akinek van türelme hozzá. Eléggé hosszúra sikeredett. Én részemről sokat tanultam ebből a történetből.
 
Alapvetés:
Van egy kedves felhasználónk akinek kézen-közön eltűnt a mailboxa. Vissza kéne állítani, de..
1. Összesen valami 3 hetes mentés van róla (a köztes 3 hétről nem is beszélünk mert az kategórikusan nincs meg)
2. Az egész dolog nem olyan kritikus, hogy bármi módon hajlandó lennék az éles szervert veszélyeztetni miatta.
3. Sérti az önérzetemet, ha nem tudom megcsinálni.
4. A kollégái mostanában többször hívtak, hogy próbáljam megoldani (az eset mintegy másfél hónapja kezdődött)
 
Előzmények:
Természetesen az Exchange rendszergazdák szokásos bajával küzdök, hogy cég szinten nem lehet kemény limitet beállítani a felhasználóknak a mailbox méretére, a 16GB-os korlát be van vasalva az Exchange 2003 Standard Editionbe (ebben az időpillanatban az SP2 még nem létezett). Annak idején írtam egy scriptet ami hetente egyszer elküldi a felhasználóknak, hogy túllépték a limitet és töröljenek, de sajnos ez egyre inkább hatástalan.
Egy költözés előkészületei zajlottak éppen aminek kapcsán a szóban forgó Exchange szerverre néhány plusz mailboxot át kellett költöztetni és akárhogy számoltam nem volt ehhez elég hely (az Enterprise Edition beszerzése szóba sem jöhetett anyagi okokból).
Ide tartozik még, hogy a helyszűkére való tekintettel levettem a dumpster törlési idejét egy napra, valamint a törölt mailboxok megtartását is egy napra (mint később kiderült ez utóbbi hiba volt).
Ráadásul a gépnek volt némi Exchange adatbázis hibája is egy valamikori hibás rendszerleállítás miatt (az adott cég előző rendszergazdájának műve).
Ezekből következően két feladat várt rám:
1. Adatbázis reszelés
2. A felesleges mailboxok (elment dolgozók) törlése
Miután nem divat tudatni az informatikával, ha valaki kilép (azért, hogy belépett és legyen mindene azonnal természetesen verjük az asztalt, de nem takarítunk magunk után), elég nehéz kideríteni, hogy ki az aki már nincs. Csináltam egy szép hosszú listát arról, hogy ki van a rendszerben és kiadtam az illetékeseknek, hogy mondják meg ki az aki már nem dolgozik itt. Megkaptam a választ a listámra, arra a kérdésemre, hogy a törlésre kijelölt mailboxokat meddig kell még megtartanom, egy határozott "azonnal törlendő" választ kaptam.
 
A történet itt kezdődik:
Megpróbálom időrendben, dátum szerint felidézni az eseményeket, bár a kezdetek már az idő homályába vesznek.
 
Egy szombat reggel
Észreveszem, hogy az egyik Exchange szerver adatbázisában pici hibák vannak. Ezt valamikor reparálni kellene, de mostanában esélytelen. Költözés lesz, stb. Csinálok egy gyors ExMerge exportot a pst-kről, majd ha lesz rá lehetőség a költözés után, akkor mehet a repair.
Ezt az ExMerge-es dolgot megismétlem a következő hetekben néhányszor, hogy ne legyen gáz.
 
Egy későbbi szombat reggel.
Mennyivel jobb is Exchange-t reszelni, mint az ágyban fetrengeni még néhány órát  
ExMerge Mailbox exporttal indítunk.
Valamikor délelőtt Exchange Store leállít.
Repair.
Elmegyek ebédelni.
Kapok egy hisztis telefont az egyik kollégától, hogy nem tud dolgozni (meg kell jegyeznem, hogy a szombat nem munkanap nálunk). Megegyezünk, hogy valamikor délutánra lesz szerver.
Minden sikerül, béke van.
Kitörlöm a megegyezett felhasználókat. (ezek ugye hétfőre nyomtalanul eltűnnek a már említett egy napos beállítások miatt)
 
Következő hétfő este
Este csinálok még egy ExMerge-es backupot, majd a meglévő korábbi hasonló mentés fájljait felülírom az újonnan keletkezettekkel. Na itt csúszik el a dolog. Volt egy felhasználó akinek nem kellett volna megszüntetni a hozzáférését (láthatóan pontos listát csináltak nekem). Ezt a felhasználót a kedves kollégám ennek a hétfőnek a reggelén újra létrehozta. Én pedig este felülírtam az üres pst fájlal a telit (ez ugye nem fordult elő a megszüntetett és újra létre nem hozott felhasználókkal, hiszen nekik ezen az estén nem keletkezett pst fájljuk)
 
Néhány nappal később
Kiderül, hogy gáz van. El kezdek gondolkozni, hogy mit lehet tenni. Miután a mentésünk rotációs jelleggel diszkre zajlik, már nem volt meg olyan mentés amiben még meg lett volna a keresett adat. Pontosabban valamikor szeptember végén lecseréletem a mentésre szolgáló vasat és van 2db 250GB-os vinyóm amin rajta lehet valami korábbi mentés. Rajta is volt. Leszedtem a fájlokat. Ezt ugyanakkor az éles rendszerre még Recovery Storage Groupba sem merem visszatölteni.
 
2005.11.14
Végre nekiállok a visszatöltésnek. Telepítek egy virtuális gépet, exchange rá, próbáljuk visszatölteni.
1. Sima restore. Nem ment. 9635-ös hibát kapok rá, merthogy nem találja az AD-ben az azonos GUID-ű Storage Groupot.
2. Recovery Storage Group létrehoz. Override RS bekapcsol. A hiba változatlan
3. ADSI Edit, storage group létrehoz, GUID beír, nem megy, közli, hogy az attributum tulajdonosa a rendszer
4. ADSI Edit elindít rendszer joggal (AT parancs), változatlanul nem engedi a GUID-ot módosítani.
Feldobom az ügyet a levlistára, keresgélek a guglin semmi értelmes válasz.
Egyenlőre tanácstalan vagyok.
Kapok egy telefont a törölt mailbox tulajdonosának egy kolléganőjétől, hogy nagyon kellenének az adatok (ez eddig nem volt ennyire fontos, mindegy). Mondom neki, hogy dolgozom rajta de nem sok esélyt látok.
 
2005.11.16
A Microsoft termékbejelentésén vagyok amikor jön egy telefon a mailboxtulajdonos főnökétől, hogy mi a helyzet. Neki is elmondom, hogy megteszek mindent, de eléggé esélytelen az ügy.
 
Néhány napig nem volt időm foglalkozni vele, majd ...
 
2005.11.21.
Megint volt egy kis időm nekikezdeni a dolognak. Feltelepítettem újra a virtuális gépet. Egy cikkben a neten találtam valami halvány utalást arra, hogy a gép nevének, stb. azonosnak kell lennie a restore-hoz. Nosza, csináltam egy olyan környezetet amiben a domain, a gép neve, az Exchange org neve, az Administrative group neve (ez utóbbi trükkös, mert az első admin group nem nevezhető el egyszerűen. System manager feltelepít az Exchange előtt, Administratice Group létrehoz, majd Exchange telepít) azonos az eredetivel.
Bentről magammal hoztam haza az adatbázis backupot
Nekiáltam visszatölteni az adatbázist (Recovery Storage Group nélkül, registry buhera nélkül) és láss csodát elkezdte visszarakni. Gőzerővel visszatöltöttem az adatbázist.
Miután be voltam sózva, SSH-n elkezdtem letölteni bentről a log backupok egy részét.
 
2005.11.22.
Innen már órára bontva megy a történet
05:51 - Felkeltem.
Reggelre lejött bentről még néhány log backup elkezdem visszatölteni őket. Sikerül is azokat amik itt vannak márt, a többit majd bent a munkahelyemen.
08:37 - Beértem
Folytattam a logok visszatöltését.
10:47
Elérek az utolsó backup set-ig, erre közli, hogy sérült, on media catalog kikapcsol, backup set újrakatalogizál, visszatölt, a visszatöltés végénél közli, hogy kéri a set második felét, lelövöm, elkezdi visszajátszani a logokat és ...
elszáll.
Kapok egy 412-es ESE hibát melyben közli, hogy nem tud olvasni egy log fájlt. Naná, a sérült mentés utolsó fájlját.
Letörlöm a hibás fájlt, visszatöltöm az utolsó előtti mentést újra. Elkezdi visszajátszani a logot. Megint elszáll.
Most egy 904-es ESE Backup hiba. Közli, hogy nem talál egy fájlt. Persze azt amit letöröltem.
Na mindegy, ha idáig egyszer már eljutottam, nem adom fel könnyen (nincs sok kedvem újrakezdeni). Fel akarom mountolni a Store-t. 619-es ESE hiba, nem fejezte be a restore-t. Irány a KB. 810099 -es cikk. Kell egy eseutil /cc annak a könyvtárnak a nevével ahol a restore.env található.
Elindítom az eseutilt, ugyanúgy közli, hogy nem talál egy logfájlt és kiírja, hogy E000296b.log -tól E0002F51.log -ig akarta visszatölteni. Hümm. Feltételezem, hogy ezeket az adatokat a restore.env-ből vette. Nekiugrottam ez utóbbinak egy hexeditorral, megkerestem a kérdéses bejegyzést, kijavítottam a 2F51 hex-át 2F50 hex-ára, mert ugye ezt az utolsó fájlt töröltem.
11:34
Eseutil /cc másodszor. Most elindul... várunk. Nézem az Event Logot. Átlag 3 percenként dolgoz fel egy új logfájlt. Kiszámoltam a cirka 10 gigányi logot mintegy 5 nap alatt fogja feldolgozni. Vicces lesz...
15:30
Elindulok a tanfolyam irányába (Év eleje óta egy Informatikai Biztonsági Szakértő című tanfolyamra járok. A mai az utolsó alkalom, majd valamikor decemberben vizsga). Természetesen az eseutil még nem végzett, de gyorsabban halad mint számítottam.
19:30 körül
Visszaérek a tanfolyamról (mint sokszor most sem bírtam végigülni)
Kiderül, hogy az eseutil közben elszállt egy -567 -es hibával. Semmi okosat sem találok rás a KB-ben, egyszerűen csak feltételezem, hogy rászaladt valami hibára az adatbázisban (elvégre az adatbázis mentés amiből dolgozom egy hibás darabról készült). Ez most nem izgat. Sikerült visszatöltenie a logok jó felét.
19:42
Teszek még egy ványatag kísérletet arra, hogy visszajátszam a hibás log utániakat (Hex editor a restore.env-en, eseutil /cc) de ez természetesen nem sikerül.
19:50
Megpróbálom elindítani az adatbázst, természetesen nem megy. Közli, hogy nem volt hard recovery.
19:55
Adatbázis reparálás eseutil /p elindul
20:30 körül
Lelövöm a virtuális gépet, hazamegyek
20:55
Hazaérek, virtuális gép elindít eseutil folytatja (mekkora találmány ez a save state dolog, nem kell kivárni a dolgokat, bárhol bármikor megszakítható és folytatható). Ma már nem foglalkozom vele, majd holnap.
 
2005.11.23
 
02:10 - Felébredtem
Megint azon hülye napok egyike amikor nem tudom rendesen kialudni magam.
Folytassuk az Exchange reszelést. Ránézek a gépre: eseutil befejezte. Indítsunk adatbázist. Nem megy 1088-as hiba az Event Logban. Nem lepődök meg, erre számítottam. Tegnap este még kinyomtattam egy rakás KB cikket és köztük a 324606 -ost ami erről szól. Letöltöm a LegacyDN.exe -t játszom vele egy kicsit. A doksi zavaros. Sikerül gyártanom egy logot amiből kiderül, hogy mely pontokon kell megváltoztatnom a LegacyDN értékét, de megcsinálnom nem sikerül vele. Nem baj. ADSI Edit elővesz, LegacyDN-ek átír (7 helyen).
02:59
Exchnage szolgáltatások újraindítása. Nem indítja el a Public store-t (erre számítottam, mert ugye most a Public Store LegacyDN értéke rossz), de nélküle megleszek. Elindul a Mailbox Store. Hurrá, célegyenes!
Látom a mailbox-okat a System Managerben.
03:12
ExMerge elindít, nem látja a mailboxokat. Ok, ez rendben van. A mailboxok alapvetően disconnected állapotban vannak, csak én ezt nem látom a System Managerben így nem tudom felhasználóhoz csatolni (a Reconnect Mailbox szürke). Ha megvárnám az Exchange rendes napi nagytakarítását akkor látnám az eredményt, de nem akarok erre várni. Irány a KB. A 261142 -es cikkből kiderül, hogy a Run CleanUp Agent az én barátom. Létrehozom a felhasználót, hozzácsatolom a mailboxot.
03:24
ExMerge újra, elkészül a pst. Végeztünk.
Írom a cikket. Kiszedtem minden adatot a virtuális gépből ami kellett.
04:50
Ünnepélyes shutdown. Virtuális gép megy a levesbe.
 
Remélem nem túl zavaros a dolog. Darabokban írtam az elmúlt másfél napban.

A hét eleje óta napja nem megy a weboldalam. Csak most vettem észre mert az elmúlt időszakban se web oldalt reszelni, se fejleszteni nem volt időm. Ma átraktuk Subicz Peti segédletével egy másik szerverre, remélem, hogy működni fog. Egyenlőre azt várom, hogy a DNS bejegyzés replikálódjon.

Eddig MSDN Enterprise előfizető voltam. Azt tudom már egy ideje, hogy az MSDN Enterprise megszűnik és helyette a Visual Studio 2005 Team Edition for SW Developers with MSDN Premium-ot fogom kapni. A váltás novemberben történik és már előre dörzsültem a markom (főleg az MSDN Premiumra. Szerettem volna belőle ezt-azt hivatalosan tesztkörnyezetnek). Gondoltam, majd valamikor november végén történni fog valami. Meglepetésként ért, hogy ma reggel megtaláltam az első MSDN Premium DVD csomagot az asztalomon. Hurrá!
Gyorsan felmentem a Subscriber Downloads-ra. Itt ugyan még azt írja a fejlécben, hogy MSDN Enterprise, de a tartalom már a bővített.

Az elmúlt hetekben nem írtam. Miért is? Nem csináltam semmi olyat amiről tudtam volna írni. Van egy kupac félbehagyott projectem. Remélem be tudom fejezeni őket és akkor lesz miről írni.
Addig is a ma reggeli küzdésről:
Reggel nyolckor amikor épp indulnék dolgozni, csörög a telefonom és az egyik cégünk egy megfelelően agilis dolgozója hív. Természetesen nem kéne tudnia a telefonszámom és természetesen nem én vagyok az adott cég rendszergazdája.
Az a baja, mint a múltkor amikor hétvégén nem tudott dolgozni (épp Exchange karbantartottam, mert a Store repülni tanult. Szeretem az Exchange JET motort). Gyorsan eltanácsoltam az illetékes rendszergazda kartársnőhöz. Persze közben beindult a gyomorideg, hogy mi lehet a gáz.
Beérek. Az egyik kedves kartárs közben újraindította a szervert, az Exchange már megy, de levél se be, se ki. Belenézek az Application logba, egy rakás hibaüzenet. Kicsit csodálkozom, mert a System Attendant és a Metabase Update hisztizik, a storenak semmi baja. Ilyet nem szokott.
Rákeresek a neten az Event ID-kra. Nem találok semmi értékelhetőt. Csontideg.
Intermezzo: Elmegyek tárgyalásra, mert ez akkor is fontosabb ha az egész rendszer áll.
Óra múlva vissza.
Valami hátsó gondolattól vezérelve bele nézek a Directory Service logba (egy hete költözött a szóbanforgó site, miután a bérelt vonal nem készült el kénytelen voltam VPN-t csinálni. Hátha az okozza a gondot). KCC hiszti hegyek. Nyomon vagyok, ez okozhatja az Exchange bajait.
Mióta is tart ez a dolog? Pénteken volt egy tervezett leállás egy bejelentett áramszünet miatt, azóta nem megy. Persze azóta nem tudtam ránézni a gépre, mert szerda este óta vidéken voltam.
Miután volt némi DCOM jellegű gond az aktuális biztonsági frissítésekkel, elkezdem kérdezni a rendszergazdákat, hogy nem rakták-e fel őket az újraindítás kapcsán. Mindenki tagad.
Megnézem a gépet, nem kerültek fel.
AD Sites & Services, replikáljunk kézzel. Csúnya hibaüzenet arról, hogy az endpoint mapper betelt (ez RPC gond lehet). Lehet, hogy a másik oldalon lévő DC amivel replikálni próbál okozza a problémát (ráadásul ez utóbbi veszi át a netről a leveleket is, a levelezés meg ugye nem megy). Nem gondolkozunk, újraindítjuk ez utóbbit. Meggyógyul a levelezés. Hurrá!
Vagy mégsem? A KCC hibák maradnak.
Na gondolkozzunk. Annak idején korlátoztam és máshova raktam az RPC portjait, hogy legalább valamennyire kezelni lehessen a cégek közötti tűzfalon. Ezzel minden rendben?
Belenézek a gép registry-jébe. Nini, hiányoznak az RPC bejegyzéseim. Bepakolom őket, restart, működik. Hurrá!
Mostmár csak azt szeretném tudni, hogy:
1. Én voltam annak idején olyan hülye, hogy ezek a bejegyzések kimaradtak ennek a gépnek a konfigjából, vagy azóta tüntek el?
2. Ha én voltam a hülye, akkor hogy lehet az, hogy egyáltalán működik ez? Április óta megy és egy hangja nem volt ami RPC problémákra utal.
 
Na mindegy. Mázlistának érzem magam, gyorsan sikerült megoldani.

Sok más egyéb mellett elkezdtem belepiszkálni némi statisztika gyártásba az Exchange Store-ra vonatkozóan. Miután levelekre, csatolmányokra időpontokra vonatkozó adatokra van szükségem, kénytelen vagyok beleolvasni a mailboxokba. Ezt tehetném WebDav-al, vagy az Exchange OLE DB providerrel ADO-n keresztül. Ez utóbbit választottam, mert ezzel már játszottam korábban. Úgy gondoltam, hogy tesztelgetni egyszerűbb a kliens oldalon, így elindítottam az első kis tesztprogramomat, ami valami ilyesmi volt:
BaseURLStr = "http://mail1/exchange/zoli/";
Folder = "Inbox"; 

var SelectStr; 
var ExchConn = new ActiveXObject("ADODB.Connection"); 
var ExchRS = new ActiveXObject("ADODB.Recordset"); 

SelectStr = "SELECT \"DAV:displayname\", "+
	"FROM SCOPE('SHALLOW TRAVERSAL OF \"" +
	encodeURI(BaseURLStr + Folder) + "\"') "+
	"WHERE \"DAV:ishidden\" = false"; 
ExchConn.Provider = "ExOLEDB.DataSource"; 
ExchConn.Open(BaseURLStr); 
ExchRS.Open(SelectStr, ExchConn); 
for(;!ExchRS.EOF;ExchRS.MoveNext()) 
{ 
    WScript.Echo(ExchRS.Fields("DAV:displayname").Value); 
} 
ExchRS.Close(); 
ExchConn.Close();
Meglepetten tapasztaltam a következő hibaüzenetet:
ADODB.Connection: Provider cannot be found. It may not be properly installed.
 
Hoppá, ezek szerint az ExOLEDB provider csak az Exchange szerveren van telepítve. Elkezdtem túrkálni a neten, hogyan lehetne felrakni ezt a kliensre. Arra jutottam, hogy sehogy. Helyette az MSDAIPP providert lehet használni. Ezek után a fenti kód egyetlen sorában módosul:
 
ExchConn.Provider = "ExOLEDB.DataSource";
helyett
ExchConn.Provider = "msdaipp.dso";
 
Ezzel a kliens oldalról is el lehet érni a szervert, mindösszesen arra kell odafogyelni, hogy csak a http:// uri-t szabad használni a file:// uri-t nem.
 
Infók hozzá:
 

Ilyet nem szoktam írni, de mostmár piszokul bosszant. Ismét rájöttem, hogy az internet szolgáltatónk a T-Offline (http://www.domain.hu/domain/domainsearch/?domain=t-offline&tld=hu). Megint nincs netünk, bérelt vonalon rengeteg pénzért. Unom. (Ezt a PDAmról írom)

Egy régi problémám volt az, hogy hogyan találjunk meg egy felhsználót az Active Directoryban az e-mail címe alapján. Volt erről egy hosszú thread a technetklub levlistán (http://listmanager.technetklub.hu/read/messages?id=122959) amiből az derült ki, hogy valamelyik proxyAddress alapján nehéz megtalálni a felhasználót, ráadásul lassú is. A probléma alapja, hogy azt gondoltom (gondoltuk többen), hogy a proxyAddresses propertyben nem lehet keresni mert az egy multivalue property. Már tervezgettem, hogy írok valami szolgáltatást a dologra. Egy progi megadott időközönként végigtúrja az AD-t épít belőle egy adatbázist amiben utána én tudok gyorsan keresni.
Ma megint kellet volna ez a dolog így tüzetesebben utánnanéztem a Windows 2000 Scripting Guide-ban (http://www.microsoft.com/technet/scriptcenter/guide/default.mspx). Olvasva az ADSI keresésre vonatkozó részt egy mondatra figyeltem fel (itt: http://www.microsoft.com/technet/scriptcenter/guide/sas_ads_jgtf.mspx):
...use objectCategory rather than objectClass because objectCategory is single-valued and ideal for servicing search requests...
 
Várjunk csak, ezek szerint lehet multivalue propertyben keresni. Kipróbáltam. Íme az eredmény:
var SearchMail = "test@domain.hu"; 
var ADConnect = new ActiveXObject("ADODB.Connection"); 
var ADCommand = new ActiveXObject("ADODB.Command"); 
var rootDSE, ForestRoot, ADRS; 
rootDSE = GetObject("LDAP://rootDSE"); 
ForestRoot = rootDSE.Get("rootDomainNamingContext"); 
ADConnect.Open("Provider=ADsDSOObject;"); 
ADCommand.ActiveConnection = ADConnect; 
ADCommand.CommandText = "

Az elmúlt két hétben szabadidőmben leginkább a már korábban emlegetett listaszerverrel kapcsolatos kódokat, adatbázist reszelgettem. Sikerült összehoznom egy egész jó kis storage engine-t (kidobálja a duplikált csatolmányokat, opcionálisan tömörít, opcionálisan fájlban, vagy az adatbázisban tárolja a levelet). Most elkezdtem játszani a levél fogadással és küldéssel. Ennek kapcsán az egyik igen érdekes probléma, hogy hogyan kezeljük a válaszleveleket, a thread-hierarchiát. Azt látom, hogy a lyris hol megtalálja az összetartozó darabokat, hol nem. Én szeretném elérni, hogy ez a dolog ne legyen ennyire esetleges. Egyenlőre a következő ötleteim voltak:
1. A levél fejlécében lévő Reply-To: mezőbe nem az adott levlista címét írom, hanem valamit amivel azonosítani tudom a levelet. Ilyesmire gondoltam a_levél_adatbázisbeli_guid-ja@lista_domainneve . Ez ugye reply esetén egész pontosan azonosítja az eredeti levelet, ugyanakkor ha valaki normál levél küldéshez véletlenül ezt a címet használja akkor az alaposan összekavarhatja a dolgokat. Ezt az ügyet egyenlőre félretettem, arra az esetre ha nem lesz más megoldás.
2. Használom az RFC-ben megadott Message-ID:, In-Reply-To:, References: mezőket. Az RFC-822 -ben úgy tűnik, hogy ez opcionális az RFC-2822 -ben mintha kötelező lenne. Biztos az én angol tudásommal van baj, de ebből nem tudom eldönteni (23.oldal 3.6.4-es pont):
Though optional, every message SHOULD have a "Message-ID:" field.   Furthermore, reply messages SHOULD have "In-Reply-To:" and   "References:" fields as appropriate, as described below. ...
Azt értem, hogy igazából ezt kellene használni, de megnézve a lyris-es leveleket igen kevésben találtam meg az In-Reply-To: mezőben a szülő levél azonosítóját, ráadásul az Exchange 2003 / Outlook 2003 páros sem teszi bele a levélbe.  (Valaki megmondhatná, hogy valójában ezt kötelező-e megcsinálni és ha igen akkor az Exchange/Outlook miért nem teszi? Vagy ha teszi akkor nekem miért nem?)
3. Találni valami olyan fejlécmezőt ami a levél továbbítását nem befolyásolja, viszont reply esetén benne marad. Ezt kipróbáltam egy általam kreált X- mezővel, de nem működött.
4. Belegenerálok valamit a levél szövegébe és amikor visszajött akkor megkeresem benne. Ezzel több bajom is van. Mi van akkor, ha több ilyen van benne? Mi van a digitálisan aláírt levelekkel (ugye ezeket nem szabad módosítani, ezt sajnos nem minden listaszerver tartja be).
 
Egyenlőre tanácstalan vagyok, keresem tovább a megoldást.

Ma elszórakoztam egy rég problémám megoldásával. Az oldalamon két helyen is használtam a WMI repositoryba fordított mof fájl olyan eseménykezelőkhöz amik a rendszer újraindítása után is tovább működnek:
http://www.gomori.hu/elog_db_hu.htm
http://www.gomori.hu/storesize_hu.htm
Felmerült az a kérdés, hogy mi van akkor, ha el szeretnénk távolítani az így regisztrált eseménykezelőt. Eddig csak egy Microsoft WMI adminisztrációs eszközzel, kézzel tudtam eltávolítani. Most elkövettem egy eszközt ami képes ezt eltávolítani. Majd később az oldalra is ki fogom rakni. Ez a fentiek közül az elsőhöz készült.
A kód innen tölthető le

Pár napja írtam már a fenti címről. Akkor úgy gondoltam, hogy egy JScript példa elég lesz. Közben rájöttem, hogy .Net környezetben ez kevés (a típusosság miatt jóval több dolgot meg kell adni). Ezért most itt egy C# metódusként megírt példa (a referenciák közé fel kell venni az ADO és a CDO COM Objektumokat):
public static CDO.Message LoadMsgFile(string FileName) 
{ 
    CDO.Message Msg = new CDO.MessageClass(); 
    ADODB.Stream MsgStream = new ADODB.Stream(); 
    MsgStream.Type = ADODB.StreamTypeEnum.adTypeBinary; 
    MsgStream.Open((object)System.Type.Missing, 
        ADODB.ConnectModeEnum.adModeUnknown, 
        ADODB.StreamOpenOptionsEnum.adOpenStreamUnspecified, 
        "",""); 
    MsgStream.LoadFromFile(FileName); 
    Msg.DataSource.OpenObject(MsgStream,"_Stream"); 
    return Msg; 
}

 Megjegyzés

Ahhoz, hogy megjegyzést tégy a bejegyzésekhez, regisztrálnod szükséges. Egyszerűen válaszd ki a regisztráció linket a jobb felső sarokban és add meg a szükséges információkat. Ha bejelentkeztél, fűzhetsz megjegyzést a bejegyzésekhet. 

Már regisztráltál? Kattints ide a bejelentkezéshez. 

 

 Keresés