vista delayed start

w vista pojawila sie nowa funkcjonalnosc – opozniony start uslug. spodziwalem sie, ze bedzie mozna ustawic np 'uruchamiaj sie po 2 min’. mechanizm jednak dziala inaczej. jak mozna znalezc na msdn’ie z opisu funkcji, opozniony start uruchamia uslugi oznaczone flaga opoznienia sekwencyjnie, nie dajac zadnej gwanrancji konkretnego przedzialu czasowego. dziala to raczej jako 'mniej uprzywlejowany’.

konfiguracja uslugi do trybu opoznieniego jest trywialna – sprowadza sie do ustawienia trybu automatic (delayed start)

telnet w vista

standardowo w vista nie ma telnetu, a jest to drugie [po pingu] narzedzie, ktore przydaje sie do testowania, czy usluga nie dziala, czy aplikacja z ktorej sie korzysta. generalnie jest to narziedzie bardzo przydatne – o czym przekonalem sie, kiedy go zabraklo. pytty do takich celow wygodny nie jest.
telent pomimo, ze nie zainstalowany, pozostal jako 'windows feature’ i mozna go wlaczyc w 'Programs and features’ [czyli nowa nazwa dla 'add/remove programs’]-> 'windows features on/off’->telnet client.

"inteligetne" widoki

w windows vista [prawdopodobnie rowniez w XP – ale nie wiem, bo zawsze to wylaczalem] sa niejako „inteligentne widoki”, dostosowujace sie do rodzaju dokumentow. i tak korzystajac z exploratora, i wchodzac do katlaogu z obrazkami, zamiast standardowych „size”, „file date”, „type” pojawiaja sie kolumny „date taken”, „ratings” etc. inteligencja tego algorytmu jest jednak bardzo ograniczona a widokow „mieszanych” jakos nie wymoslono – i tak umieszczajac kilka obrazkow w katalogu z dokumentami nie ma ani mozliwosci posortowania po typie [bo ta kolumna znika] ani sensownego przegladania…
zmodyfikowac widok sie da oczywiscie. pytanie tylko – czemu mozna to zaliczyc do kategorii tips’n’tircks – jakby ciezko bylo dodac taka opcje do menu „view”. a zeby typ widoq zmienic nalezy:
– wyjsc katalog wyzej
– wlaczyc wlasciwosci katalogu
– i tu we wlasciwosciach jest zakladka 'customize’ pozwalajaca okreslic typ przechowywanych danych.

buehk!

export kontaktow outlook express do AD

trafil sie ostatnio taki problem – wdrozylismy AD+EX i klient poprosil o pomoc przy przeniesieniu kontatkow z outlook do AD. generalnie nic trudnego – mozna zalatwic to prostym skryptem, jest jednak pewien myk. oto kilka uwag dotyczacych takiej operacji:

najpierw sam skrypt. przy pelnym exportcie kontatow z outlooka dostaje sie plik excelowy z gigantyczna iloscia kolumn. najpier wiec definicja pol:

const X_SALUTATION=1
const X_GN=2
const X_SN=4
CONST X_COMPANY=6
CONST X_DEPT=7
CONST X_TITLE=8
CONST X_ADDR=9
CONST X_CITY=12
CONST X_STATE=13
CONST X_ZIP=14
CONST X_COUNTRY=15
CONST X_ASSISTANT=30
const X_FAX=31
CONST X_TEL=32
CONST X_TEL2=33
CONST X_MOBILE=41
CONST X_TEL3=43
CONST X_PAGER=44
CONST X_EMAIL=49
CONST X_ENAME=51
CONST X_NOTES=73
CONST X_WEBPAGE=85

skrypt jest dosc prymitywny – na szybko – zalozeniem jest wiec, ze jedno z pol – tu 'nazwisko’ – jest zawsze niepuste. skrypt bedzie przetwarzal arqsz excela az trafi na wiersz z pusta kolumna 'nazwisko’. przed przypisaniem kazdej wartosci do AD trzeba sprawdzic czy nie jest ona przypadkiem pusta:


Set objRoot = GetObject("LDAP://rootDSE")
strDNS = objRoot.Get("defaultNamingContext")
Set objDomain = GetObject("LDAP://" & strDNS)
Set objOU = GetObject("LDAP://OU=contacts," & strDNS)
set oExcel=createobject("Excel.Application")
oExcel.workbooks.open(left( WScript.ScriptFullname, instrRev(WScript.ScriptFullname,"") )&"kontakty-import.xls")

i=2
with oExcel.ActiveSheet
While .Cells(i,X_SN) <> ""
wscript.echo vbcrlf&"przetwazam wiersz: "&cstr(i)

tu jeszcze informacja – podczas importu kontaktow, trzeba pamietac o tym, ze aby pojawily sie one w ksiazce adresowej, musza byc uzupelnione wszystkie pola wymagane przez exchange – inaczej utworzonego contactu nie bedzie w GALach. czesc z atrybutow uzupelnia sie sama, ale czesc trzeba przypisac recznie – to jest glownie cn oraz mailnickname:


surname=.cells(i,X_SN).Value
givenname=.cells(i,X_GN).value
if not isNull(givenname) and not isEmpty(givenname) then
contactname=givenname&" "&surname
else
contactname=surname
end if
wscript.echo contactname

Set objContact = objOU.Create("contact", "cn="&contactname)

wscript.echo "nazwisko: "&.cells(i,X_SN).Value
objContact.put "sn",.cells(i,X_SN).Value
objContact.put "mailNickName", contactname
if not isNull(.cells(i,X_GN).Value) and not isEmpty(.cells(i,X_GN).Value) then
wscript.echo "imie: "&.cells(i,X_GN).Value
objContact.put "givenName",.cells(i,X_GN).Value
end if
if not isNull(.cells(i,X_SALUTATION).Value) and not isEmpty(.cells(i,X_SALUTATION).Value) then
wscript.echo "salut/desc: "&.cells(i,X_SALUTATION).Value
objContact.put "description",.cells(i,X_SALUTATION).Value
end if
if not isNull(.cells(i,X_COMPANY).Value) and not isEmpty(.cells(i,X_COMPANY).Value) then
wscript.echo "company: "&.cells(i,X_COMPANY).Value
objContact.put "company", .cells(i,X_COMPANY).Value
end if
if not isNull(.cells(i,X_DEPT).Value) and not isEmpty(.cells(i,X_DEPT).Value) then
wscript.echo "department: "&.cells(i,X_DEPT).Value
objContact.put "department", .cells(i,X_DEPT).Value
end if
if not isNull(.cells(i,X_TITLE).Value) and not isEmpty(.cells(i,X_TITLE).Value) then
wscript.echo "title: "&.cells(i,X_TITLE).Value
objContact.put "title", .cells(i,X_TITLE).Value
end if
if not isNull(.cells(i,X_ADDR).Value ) and not isEmpty(.cells(i,X_ADDR).Value ) then
wscript.echo "street: "&.cells(i,X_ADDR).Value
objContact.put "street",.cells(i,X_ADDR).Value
end if
if not isNull(.cells(i,X_CITY).Value ) and not isEmpty(.cells(i,X_CITY).Value ) then
wscript.echo "city: "&.cells(i,X_CITY).Value
objContact.put "l",.cells(i,X_CITY).Value
end if
if not isNull(.cells(i,X_STATE).Value ) and not isEmpty(.cells(i,X_STATE).Value ) then
wscript.echo "state: "&.cells(i,X_STATE).Value
objContact.put "st",.cells(i,X_STATE).Value
end if
if not isNull(.cells(i,X_ZIP).Value) and not isEmpty(.cells(i,X_ZIP).Value) then
wscript.echo "postal: "&.cells(i,X_ZIP).Value
objContact.put "postalCode",.cells(i,X_ZIP).Value
end if
'if not isNull(.cells(i,X_COUNTRY).Value) and not isEmpty(.cells(i,X_COUNTRY).Value) then
' wscript.echo .cells(i,X_COUNTRY).Value
' objContact.put "",
'end if
if not isNull(.cells(i,X_ASSISTANT).Value ) and not isEmpty(.cells(i,X_ASSISTANT).Value ) then
wscript.echo "asist/info: "&.cells(i,X_ASSISTANT).Value
info="telefon do asystenta: "&.cells(i,X_ASSISTANT).Value
end if
if not isNull(.cells(i,X_FAX).Value) and not isEmpty(.cells(i,X_FAX).Value) then
wscript.echo "fax: "&.cells(i,X_FAX).Value
objContact.put "facsimileTelephoneNumber",.cells(i,X_FAX).Value
end if
if not isNull(.cells(i,X_TEL).Value ) and not isEmpty(.cells(i,X_TEL).Value ) then
wscript.echo "telefon: "&.cells(i,X_TEL).Value
objContact.put "telephoneNumber",.cells(i,X_TEL).Value
end if
if not isNull(.cells(i,X_TEL2).Value) and not isEmpty(.cells(i,X_TEL2).Value) then
wscript.echo "othertel1: "&.cells(i,X_TEL2).Value
othel=.cells(i,X_TEL2).Value
end if
if not isNull(.cells(i,X_MOBILE).Value) and not isEmpty(.cells(i,X_MOBILE).Value) then
wscript.echo "mobile: "&.cells(i,X_MOBILE).Value
objContact.put "mobile",.cells(i,X_MOBILE).Value
end if
if not isNull(.cells(i,X_TEL3).Value) and not isEmpty(.cells(i,X_TEL3).Value) then
wscript.echo "othertel2: "&.cells(i,X_TEL3).Value
if isNull(othel) or isEmpty(othel) then
othel=.cells(i,X_TEL3).Value
else
othel=othel&","&.cells(i,X_TEL3).Value
end if
end if
if not isNull(.cells(i,X_PAGER).Value) and not isEmpty(.cells(i,X_PAGER).Value) then
wscript.echo "pager: "&.cells(i,X_PAGER).Value
objContact.put "pager",.cells(i,X_PAGER).Value
end if
if not isNull(.cells(i,X_EMAIL).Value) and not isEmpty(.cells(i,X_EMAIL).Value) and instr(.cells(i,X_EMAIL).Value,"@")>1 then
wscript.echo "email: "&.cells(i,X_EMAIL).Value
objContact.put "mail",.cells(i,X_EMAIL).Value
end if
if not isNull(.cells(i,X_ENAME).Value) and not isEmpty(.cells(i,X_ENAME).Value) then
wscript.echo "enote: "&.cells(i,X_ENAME).Value
'objContact.put "",
end if
if not isNull(.cells(i,X_NOTES).Value ) and not isEmpty(.cells(i,X_NOTES).Value ) then
wscript.echo "notes: "&.cells(i,X_NOTES).Value
info=info & vbCrLf & .cells(i,X_NOTES).Value
end if
if not isNull(.cells(i,X_WEBPAGE).Value) and not isEmpty(.cells(i,X_WEBPAGE).Value) then
wscript.echo "www: "&.cells(i,X_WEBPAGE).Value
objContact.put "wwwHomePage",.cells(i,X_WEBPAGE).Value
end if

if not isNull(info) and not isEmpty(info) then
objContact.put "info", info
end if
if not isNull(othel) and not isEmpty(othel) then
objContact.putex 2,"otherTelephone",split(othel,",")
end if
on error resume next
objContact.setInfo
if err.number<>0 then
wscript.echo "blad zakladania usera: "&contactname&" "&err.description
err.clear
else
wscript.echo "DONE."
end if
i=i+1
wend
end with

oExcel.Quit

czesc dotyc
zaca kraju zostala wyremowana, poniewaz kraj opisuje sie w AD countrycode wg numerkow ISO 3166 wiec trzba by stworzyc tabele realicji. nie przy tak prywmitywnym skrypciq.

to nie jest jednak koniec problemow – podczas importu kontaktow, RUS [recipient update service], automatycznie zaktualizajuje wszystkie kontakty. w rezultacie swierzo zaimportowane kontakty beda mialy maile.. firmowe. aby RUS nie podmienil kontkaktow mozna skorzystac z tego opisu lub z narzedzia admodify w zakladce ’email addr’ zaznaczajac jeden z dwoch checkboxow przy 'update recipient policy ….’. mozna tez, korzystajac z artykulu z ms dodac do skryptu update dodatkowego pola w AD:


objContact.put "msExchPoliciesExcluded","{3B6813EC-CE89-42BA-9442-D87D4AA30DBC}"

tego jednak nie testowalem, a w innym artykule podana jest nieco inna wartosc: „{26491CFC-9E50-4857-861B-0CB8DF22B5D7}” – taka tez wartosc znalazlem w AD po skorzystaniu z ADModify.

jesli zdarzy sie koniecznosc ponownego importu, na pewno to przetestuje q:

vista unattended – imagex

podziele sie ciekawostka, ktora mialem okazje ogladac w dzialaniu – imagex. jest to jeden z wazniejszych komponentow WDS [windows deployment services], ktory zatepuje w vista+ RISa. sluzy – jak nazwa wskazuje – do tworzenia obrazow dyskow NTFS. instalacja visty jest de facto spreparowanym imagem dysq systemowego.
z ciekawych funkcji, ktore wydaja sie bardzo przydatne:
– jest to narzedzie commandline’owe
– pozwala na podmountowanie wybranego obrazu pod katalog
– do takiego obrazu mozna wiec latwo dokladac/usuwac/wymieniac pliki [trzeba tylko pamietac, zeby odmountowac go z parametrem /commit]
– pozwala na zastosowanie hardlinkow aka SIS – czyli chcemy stworzyc z na jednej instalcje 3 wersje instalacji, to i tak 9o% plikow sie powtorzy. tworzy sie wiec 3 obrazy, a nastepnie wykonuje sie merge – dzieki temu mamy np. jeden 3G obraz, zamiast 3ech 2,5G. zysk oczywisty.

narzedzie w ramach licencji mozna uzywac jesli posiada sie licencje na vista. mozna tez dzieki niemu tworzyc image windows xp. oczywiscie obsluguje rowniez 2k, ale jest to juz poza licencja…