zimowe igrzyska skryptowe
od jutra zaczynaja sie igrzyska scripting guys – 3 jezyki, po 3 poziomy – perl, PowerShell, VBS. w tym roq przewidziane sa nawet nagrody [do tej pory byly to dyplomy]
od jutra zaczynaja sie igrzyska scripting guys – 3 jezyki, po 3 poziomy – perl, PowerShell, VBS. w tym roq przewidziane sa nawet nagrody [do tej pory byly to dyplomy]
tego sie nie spodziewalem … nowy engine WSH dla w2k+.
a myslalem, ze juz tylko PowerShell…
darmowy podrecznik do powershell wraz z plikami demo – czas na nauke (:
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 = "
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
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.
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.
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.