Pokazywanie postów oznaczonych etykietą script. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą script. Pokaż wszystkie posty

piątek, grudnia 21, 2007

Vista i WiFi - workaround

z niewiadomych powodow vista ma problemy z wifi podczas zmiany sieci. zwlaszcza jesli sie komputer zhibernuje/standby i otworzy sie w innej lokalizacji. zauwazylem, ze nie ma takiego problemu jesli sieciowke sie wylaczy i wlaczy - momentalnie wykrywa siec i w kilka seqnd sie laczy. dla tego mozna zastosowac taki prosty myk:

a). stworzylem sobie skrypcik wifiOnOff.cmd:

@echo off
echo wylaczam wifi....
netsh interface set interface "WiFi" DISABLED
echo wlaczam wifi...
netsh interface set interface "WiFi" Enabled


b)skrypcik mozna umiescic na pulpicie aby uruchamiac manualnie. probowalem zautomatyzowac, przy uzyciu genialnego schedulera jaki jest w vista, jednak jego geniusz nie obejmuje takich opcji jak zdarzenie 'recover from standby'. jest mozliwosc zalozenia triggerow na rozne eventy sytemowe - mozna zalozyc pulapke na pojawienie sie zdarzenia w dowolnym logu... jedyne rozwiazanie 'mniej-wiecej' mozna by zalozyc na loga security - po hibernacji/stanby stacja jest zawsze zalockowana, wiec trzeba sie zautentykowac... ale fajnie by bylo, gdyby ta operacja wykonala sie przed logowaniem.

by bylo.

tak czy inaczej do jednej z najprzyjemniejszych zmian w systemie vista vs xp zaliczam podejscie do eventloga i nowy scheduler. nie pisze 'nowy eventlog' bo z zasadzie w xp rowniez mozna bylo tworzyc wiele logow dla poszczegolnych komponentow, przy czym nie byo to niestety robione. a pomysl jest na prawde swietny i ulatwia debugowanie.

piątek, listopada 09, 2007

cala masa skryptow

noise umiescil bardzo ciekawa informacje: z okazji 3ciej rocznicy scripting guys, udostepniona dostala paczka skryptow August 2004 - September 2007 - 8oo skryptow!!
i pomimo, ze w nazwie jest 'volume 2' to jakos nie moge znalezc vol.1...

piątek, sierpnia 10, 2007

WSH 5.7!

tego sie nie spodziewalem ... nowy engine WSH dla w2k+.
a myslalem, ze juz tylko PowerShell...

piątek, czerwca 01, 2007

migracja vbs -> powershell

ta migracja to oczywscie lekki zart - ale osoby, ktore do VBS [tak jak ja] sa mocno przywiazane, a przyszlosc nieuchronnie zbliza sie [czyt. powershell] - trzeba sie zbroic.
ten link moze okazac sie iscie przydatny

piątek, maja 18, 2007

wtorek, maja 15, 2007

jak zmienic "fullname"

proste zadanko dla skrypciazy - jak zmienic fullname czyli 'cn' obiektu AD? metoda:

set oUser=getObject(ADsPath)
oUser.cn="nazwisko imie"
oUser.setInfo

zwroci blad - wartosc RDN nie moze byc modyfikowana. w skrocie - RDN czyli Relative Distinguished Name - jest wartoscia wyliczana, wiec nie mozna jej modyfikowac. szczegolowy opis mozna znalezc na stronach script center.
na tej podstawie wersja pozwalajaca na szybka modyfikacje wszystkich userow w calej galezi OU:

'*******************************************************************************
'* skrypt robi pozadek w nazwach 'fullname' czyli w cn uzytkwnikow *
'* warunek: user musi miec prawidlowo wypelnone pola imie i nazwisko *
'* parametr wywolania: relatywna nazwa jednosktki org. od ktorej ma sie rozpo-*
'* czac wyszukiwanie uzytkownikow do zmiany *
'* Przygotowane przez: ISCG sp z o.o. *
'* autor: nexor@iscg.pl *
'* last change 15.v.2oo7 *
'* *
'*******************************************************************************

'OPTION EXPLICIT
ON ERROR RESUME NEXT
Dim adoConnection, adoCmd, adoRecordSet
dim t, oDom, domDNS
dim record

if wscript.arguments.count<>1 then
wscript.echo "zle uzycie skryptu. nalezy podac jeden argument - nazwe OU od ktorego zaczenie sie zamiana."
wscript.echo "przyklad: "&wscript.scriptname&" ""OU=ksiegowosc,OU=do zmiany"""
wscript.quit
end if

set oDom=getObject("LDAP://RootDSE")
domDNS=oDom.dnshostname
namingContext=oDom.defaultNamingContext

domDNS=join( split( right(namingContext, len(namingContext)-3),",DC="),"." )
'stdout.writeline domDNS
namingContext=wscript.arguments(0)&","&namingContext
wscript.echo namingContext

Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"

adoCOnnection.Open ""
If adoConnection.State <> 1 Then
locateUser="Creating ADO connection: Authentication Failed."
wscript.quit
End If
Set adoCmd = CreateObject("ADODB.Command")
Set adoCmd.ActiveConnection = adoConnection
adoCmd.Properties("Page Size") = 4000
adoCmd.CommandText = ";(&(ObjectCategory=Person)(ObjectClass=User));ADsPath,sn,GivenName;SubTree"
Set adoRecordset = adoCmd.Execute
'if adoRecordSet.Fields.Count = 0 then
while not adoRecordSet.EOF
sn=adoRecordset.Fields("sn").value
gn=adoRecordset.Fields("GivenName").value
path=adoRecordset.Fields("ADsPath").value
wscript.echo "imie: "&gn&" nazwisko: "&sn&" dn: "&path
if isNull(gn) or isEmpty(gn) or isNull(sn) or isEmpty(sn) or len(gn)<2 or len(sn)<2 then
wscript.echo "imie lub nazwisko puste. nie zmieniam."
else
wscript.echo "zmieniam cn..."
oupath="LDAP://"&right(path,len(path)-instr(path,","))
wscript.echo oupath
set oOU=GetObject(oupath)
oOU.moveHere path,"cn="&sn&" "&gn
if err.number <>0 then
wscript.echo "blad "&cstr(hex(err.number))&" "&err.description
err.clear
else
wscript.echo "ok."
end if
end if
wscript.echo vbcrlf
adoRecordset.moveNext
wend

środa, kwietnia 25, 2007

masowe wlaczenie dostepu dial-in

konfiguracja z ISA - jak wlaczyc wszystkim userom dostep do VPN?

ON ERROR RESUME NEXT
Dim adoConnection, adoCmd, adoRecordSet
dim t, oDom, domDNS
dim record

if wscript.arguments.count<1 then
wscript.echo "podaj ou, np 'ou=test'."
wscript.quit
end if
set oDom=getObject("LDAP://RootDSE")
domDNS=oDom.dnshostname
namingContext=oDom.defaultNamingContext
domDNS=join( split( right(namingContext, len(namingContext)-3),",DC="),"." )

Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"

'open on privided credentials
adoCOnnection.Open ""
If adoConnection.State <> 1 Then
wscript.echo "Creating ADO connection: Authentication Failed."
wscript.quit
End If
Set adoCmd = CreateObject("ADODB.Command")
Set adoCmd.ActiveConnection = adoConnection
adoCmd.Properties("Page Size") = 4000
adoCmd.CommandText = "<LDAP://"&domDNS&"/"&wscript.arguments(0)&","&namingContext&_
">;(ObjectCategory=Person);ADsPath;SubTree"
Set adoRecordset = adoCmd.Execute
'if adoRecordSet.Fields.Count = 0 then
while not adoRecordSet.EOF
set oUser=getObject( adoRecordset.Fields(0).value )
oUser.put "msNPAllowDialin",TRUE
oUser.put "userParameters","m:"&space(20)&"d"&VBTab&space(24)

oUser.setInfo

adoRecordSet.moveNext
wend


wyszukiwanie ado - standard, to co tutaj tak na prawde najwazniejsze, to ostatnie linijki. za wlaczenie dial-in odpowiedzialne sa dwa pola - msNPAllowDialin oraz userParameters. co oznacza wpisana wartosc? nie wiem - ale dziala. sensownego opisu poza tym, ze sa tam zapisane opcje, nie znalazlem.

a bardziej prawidlowy sposob - kiedy poziom lasu podniesiony jest do w2k3 [byc moze rowniez do w2k ale na pewno nie mixed], dla uzytkownikow defaultowym ustawieniem jest 'control by remote policy' - ktora jest wyszazona dla w2k. 'remote policy' to nic innego jak udostepnienie na IAS lub ISA.

piątek, kwietnia 06, 2007

enumeracja atrybotow obiektu AD cz.2

poprzednie rozwiazanie ma wade, jesli chce sie potem wylistowane atrybuty np. pchnac do innego obiektu. po pierwsze jest ich za duzo, po drugie nie wszystkie sa modyfikowalne. wzorujac sie na opisie gibona udalo mi sie napisac troche poprawiona [kwestia tego co sie chce osiagnac - byc moze 'zuobozona'] wersje skryptu, listujacego atrybuty, do ktorych ma sie prawo zapisu:

OPTION EXPLICIT
ON ERROR RESUME NEXT
CONST objectCN = "test test"
CONST objectOU = "OU=test"

Dim oDom, domDNS, namingContext, oObj
Dim allowedAttributes,strAttribute,strValues, strItem

'*******************************************************************************
set oDom=getObject("LDAP://RootDSE")
domDNS=oDom.dnshostname
namingContext=oDom.defaultNamingContext
domDNS=join( split( right(namingContext, len(namingContext)-3),",DC="),"." )

Set oObj = GetObject("LDAP://cn=" & objectCN & "," & ObjectOU & "," & namingContext)
oObj.getInfoEx array("allowedAttributesEffective"),0
allowedAttributes=oObj.getEx("allowedAttributesEffective")

For Each strAttribute in allowedAttributes
strValues = oObj.GetEx(strAttribute)
if err.number=0 then
For Each strItem in strValues
err.clear
Wscript.Echo strAttribute & " -- " & strItem
if err.number<>0 then
wscript.echo "ERROR getting "&strAttribute&": "&cstr(hex(err.number))&" "&err.description
err.clear
end if
Next
else
'wscript.echo strAttribute&" skipped"
err.clear
end if
Next


[oba skrypty - i ten i poprzedni, wypisuja tylko atrybuty, ktore da sie wypisac jako ciag, wywalajac blad przy np. atrybutach binarnych. ale to tylko ogolny przyklad a nie komplexowe rozwiazanie]
podstwowa roznica jest to, ze zmiast laczyc sie do schematu i zczytywac 'jakie sa dostepne atrybuty dla obiektu typu "user"' tym razem po dolaczeniu sie do obiektu sprawdzam atrybut 'allowedAttrbutesEffective' i z tej listy probuje je odczytac.

warto zwrocic uwage na zastosowanie getInfoEx - przypominajacym, ze wartosci sa de facto odczytywane z cachu AD, ktory nie zawiera pewnych wartosci wyliczanych. pominiecie tej linijki zwroci blad 'property not found in the cache'.

czwartek, kwietnia 05, 2007

enumeracja atrybotow obiektu AD aka LDIFDE

ciekawy problem - w jaki sposob zrobic zrzut obiektu AD do pliq, ze wszystkimi mozliwymi wartosciami atrybutow? odpowiedzia prawidlowa jest oczywiscie LDIFDE lub CSVDE ale wiadomo - co wlasny skrypt, to walsny skrypt. pojedynczy mechanizm mozna zlozyc w calosciowe rozwiazanie - np. do odtworzenia srodowiska produkcyjnego w labie.
najpierw metody ktore wydawaly mi sie intuicyjne a nie zadzialaly, poniewaz - jak to czesto bywa, intuicja zawiodla. nie uda sie wylistowac atrybutow ani poprzez trywialna probe enumeracji:

set oUser=getObject("LDAP://dc=test,dc=com")
for each attribute in oUser
wscript.echo attribute.name &" "&attribute.value
next

nie uda sie rowniez zastosowac zapytania ADODB, wstawiajac '*' w miejsce odpytywanych atrybutow:

[...]
adoCmd.CommandText = "<LDAP://"&domDNS&"/"&namingContext&_
">;(&(ObjectCategory=Person)(samAccountName="&toFind&"));*;SubTree"
[...]

o dziwo taka operacja zawsze zwraca parametr ADsPath [ciekawe jak to jest zdefiniowane, ze aqrat ten]. gibon nakierowal mnie na wlasciwy tor podsylajac linka do skryptu enumerujacego atrybuty. skrypt jednak jest dla ADAM a nie AD, ale to juz nieduzy krok i tak po poprawkach mozna uzyskac takie rozwiazanie:

OPTION EXPLICIT
ON ERROR RESUME NEXT
CONST objectCN = "test test"
CONST objectOU = "OU=test"
CONST strObjectType = "user" 'ie "organizationalunit", "group", "user"

Dim oDom, domDNS, namingContext
Dim oObj, oObjectProperties
Dim strAttribute,strValues, strItem
Dim strObjectDN

'*******************************************************************************
set oDom=getObject("LDAP://RootDSE")
domDNS=oDom.dnshostname
namingContext=oDom.defaultNamingContext
domDNS=join( split( right(namingContext, len(namingContext)-3),",DC="),"." )

Set oObj = GetObject("LDAP://cn=" & objectCN & "," & ObjectOU & "," & namingContext)
Set oObjectProperties = GetObject("LDAP://"&domDNS &"/schema/" & strObjectType)

For Each strAttribute in oObjectProperties.MandatoryProperties
strValues = oObj.GetEx(strAttribute)
For Each strItem in strValues
err.clear
Wscript.Echo strAttribute & " -- " & strItem
if err.number<>0 then
wscript.echo "ERROR getting "&strAttribute&": "&cstr(hex(err.number))&" "&err.description
err.clear
end if
Next
Next

For Each strAttribute in oObjectProperties.OptionalProperties
strValues = oObj.GetEx(strAttribute)
If Err = 0 Then
For Each strItem in strValues
Wscript.Echo strAttribute & " -- " & strItem
Next
Else
'Wscript.Echo strAttribute & " -- No value set"
Err.Clear
End If
Next


to co jest najwazniejsze to fakt, iz aby wylistowac wszystkie atrybuty... nalezy miec ich liste! to jest wlasnie to, czego nie moglem przeskoczyc. najpierw skrypt laczy sie do obiektu, nastepnie do obiektu wlasciwosci w schemacie dla danego typu obiektu - lub bardziej po ludzku, do listy zawierajacej spis dostepnych atrybutow dla danego typu obiektu.
nastepnie dla kazdego obiektu z listy, sprawdzane jest czy zadany obiekt ma go ustawionego czy nie - innymi slowy dzialanie od tzw. d*py strony.

niedziela, marca 25, 2007

tworzenie gadzetow

przy okazji konqsu 'gotowy na nowy dzien' mozna natrafic na bardzo fajne stronki z opisami howto. polecam zajrzec na informacje o tworzeniu gadzetow - co okazuje sie byc proste, lub trywialne dla wszystkich, ktorzy maja pojecie o hta.

czwartek, marca 22, 2007

ADS_PROPERTY_OPERATION_ENUM - sprostowanie

jakis czas temu pisalem o hurtowym dodawaniu do grupy. niestety po testach okazuje sie, ze troche sie mylilem, wiec sprosotwanie:

w opisie dostepnych parametrow dla rodzaju operacji przy wykonywaniu putEx dla obiektu AD, znalezc mozna 4 parametry:
ADS_PROPERTY_CLEAR = 1,
ADS_PROPERTY_UPDATE = 2
ADS_PROPERTY_APPEND = 3
ADS_PROPERTY_DELETE = 4

krotki opis baj mła:
DELETE jest jedyna opcja na usuniecie parametru obiektu w AD. generalnie putEx jest uzywany dla modyfikacji parmetrow bedacych tablica [array-type], jednak jesli sie chce usunac parametr [a to duza roznica pomiedzy wstawieniem do parametru null, "" oraz jego usunieciem - kazda z 3 operacji to inna operacja], nalezy uzyc putEx z wartoscia 4 - dla dowolnego typu parametru.

CLEAR - tu nie bede komentowal bo nie testowalem. wedle opisu: "Instructs the directory service to remove all the property value(s) from the object" wynikalo by, ze obiekt jest 'resetowany'. co ciekawe - caly obiekt a nie pojedyncza wartosc. to troche dziwne, wyjasnienia nie znam.

UPDATE - wymienia wartosci na nowe. i to jest wlasnie blad, ktory poplenilem we wczesniejszym opisie. jak to dziala, na przykladzie czlonkow grupy:
parametr 'members' obiektu grupa zawiera tablice ADsPath, gdzie poszczegolne wartsoci to sciezka LDAP uzytkownika/grupy np:

array("LDAP://cn=user1,dc=domain,dc=com","LDAP://cn=user2,dc=domain,dc=com")

jesli zrobie putEx z parametrem UPDATE i wstawie tam inne wartosci:

oGrp.putEx ADS_PROPERTY_UPDATE, "member", array("LDAP://cn=user1,dc=domain,dc=com","LDAP://cn=anotheruser,dc=domain,dc=com")

to nowymi czlonkami beda userzy z tej ostatniej operacji - czyli wypadnie user2. zaleta taka, ze nie wywali bledu z powodu tego, ze user1 byl juz wczesniej czlonkiem.

APPEND - dodaje nowe wartosci. tutaj problem polega na tym, ze jesli zrobi sie append, dla przykladu takiego jak powyzej, skrypt wygeneruje blad, ze taki user juz jest, i nie doda nikogo, nawet jesli w tablicy jest 23 innych userow.

reasumujac, zeby dodac wielu userow mozna:
- dodawac ich jeden po drugim
- najpierw zczytac obecne czlonkowstwo, zsumowac z tymi, ktorych sie chce dodac, i dopiero ta sume pchnac z parametrem UPDATE

czwartek, marca 15, 2007

CIPA msi

a co... czemu nie? cipa.msi

hurtowe dodawanie czlonkow do grupy

czlonkow do grupy mozna dodac pojedynczo:
oGrp.add("LDAP://CN=user,CN=users,[...]")
albo hurtowo za pomoca putEx:

oGRP.PutEx ADS_PROPERTY_VALUE, "member", ARRAY_OF_USERS


ADS_PROPERTY_VALUE to wartosc okreslajaca zachowanie metody putEx - dodaj, usun, update, wyczysc. dzieki putEx m.in. mozna usunac wartosc. w przypadq dodawania do grupy istotne sa dwa szczegoly:
- uzycie ADS_PROPERTY_APPEND spowoduje wywalenie sie jesli w grupie jest juz czlonek, ktorego probujemy dodac. w efekcie nikt nie zostanie dodany. trzeba uzyc ADS_PROPERTY_UPDATE, ktory zachowuje sie w pozadany sposob - dodaje tych co moze.
- ARRAY_OF_USERS musi zawierac tablice Distinguished Names uzytkownikow. jest to dziwne bo przy oGrp.add podaje sie ADsPath czyli dla putEx tablica bedzie skladac sie z np. "CN=user,CN=users,DC=domena,DC=com" a przy 'add' poprawna wartoscia bedzie "LDAP://CN=user,CN=users,DC=domena,DC=com"

doawanie hurtowe ma drobna wade - nie ma mozliwosci outputu do zdebudowania, pozwalajacego okreslic czy wszystkie obiekty zostaly dodane [i ktore nie]. po prostu 'succes' lub 'error'. jednak ze wzgledu na wydajnosc - jest to metoda najbardziej efektywna, zwlaszcza jesli dodaje sie kilka set/kilka tysiecy membersow

trywialne? huh.. niemozliwe

wydawalo by sie, ze sprawa prosta - zalozyc ze skryptu grupe domenowa lokalna. konkretnie w domenie NT4.o, chociaz to znaczenia nie ma. problem polega na tym, ze wywolanie tworzenia grupy to:

set oDomain=getObject("WinNT://DOMAIN") 'lub LDAP://....
set oGrp=oDomain.create("group","groupname")
oGrp.setInfo

automatycznie tworzy to grupe globalna (security - w przypadq w2k+). ale jak zalozyc grupe domenowa lokalna [albo universalna czy dystrybucyjna w przypadq w2k+]?
co prawda ADSI definiuje obiekt 'LocalGroup', ale jest on typu IADsGroup, ktory tworzy sie 'create("group","groupname")'... i kolko sie zamyka.

*****UPDATE 16.o3.2oo7
dzieki jednemu z czytelnikow jest rozwizanie! dzieki arturze!
rozwiazaniem jest parametr groupType ktorego nie znalalzlem, pomimo usilnych poszukiwan. i rozwiazanie, zaiste, staje sie trywialne [i dziala na NT4.o - co bylo mi potrzebne!]:

Set oDom=GetObject("WinNT://DOMAIN")

Set oGrp = oDom.create("group","grupatestowa")
oGrp.put "groupType",&H4
oGrp.setInfo

środa, marca 07, 2007

CIPA o.51

kosmetyczne zmiany - m.in. dodany MACaddr.

niedziela, marca 04, 2007

arty, ktore trzeba znac

wumik - jeden z czlonkow ekipy longhornowej nie pochwalil sie, ale i tak wyszperalem q:
dwa arty warte polecenia, zwlaszcza dla srednio-zaawansowanych skrypterow:
zdalne odpytywanie kompow
skryptowanie eventloga

środa, lutego 28, 2007

CIPA v o.5

nowa wersja skrypciq Change IP Address
- 'obsluga' vista [polegajaca na niewyswietlaniu IPv6 (; ]
- liczne zmiany w logice skryptu
- dodana mozliwosc usuwania favsa bez koniecznosci grzebania w pliq
- dodane ustawienie IE Proxy

wszelkie informacje o bug'ach mile widziane (:

poniedziałek, stycznia 08, 2007

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 dotyczaca 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:

czwartek, listopada 23, 2006

powershell 1.o

oficjalnie zostal wydane i zaprezentowany na IT Forum w barcelonie.
ciekawe, ze link mowi o PS na vista podczas, gdy mozna znalesc informacje, ze wersja dla vista bedzie dopiero pod koniec stycznia.
hmmm...

czwartek, listopada 02, 2006

logFile lib

drobna zmiana w bibliotece logFile.lib
zbyt czesto potrzeba bylo przekierowac output na ekran i do pliq. dopisana jest funkcja echo i zmienna okreslajaca zachowanie.