Skip to Content

IT nieuczesane.
category

Category: DevOps/Scripting

skrypty, programy, command line i inne

shutdown zdalnego kompa

niby nic skomplikowanego i jest masa różnych tooli do tego celu. podstawowym ograniczeniem w większości jakie testowałem był brak możliwości podania user/pass. czyżby było to niemożliwe? eeee tam… oczywiście, że się da. Oto skrypcik, który pokazuje jak stworzyć moniker WMI tak, aby podać odpowiednie credsy i wykonać restart:

CONST SH_LOGOFF = 0
CONST SH_FLOGOFF = 4
CONST SH_SHUTDOWN = 1
CONST SH_FSHUTDOWN= 5
CONST SH_REBOOT = 2
CONST SH_FREBOOT = 6
CONST SH_POWEROFF = 8
CONST SH_FPOWEROFF=12

strComputer = "192.168.1.123"

'tak to sie robi normalnie:
'Set OpSysSet = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}//"&strComputer&"/root/cimv2")

'a tak jest to samo, podajac credsy:
set objLocator = CreateObject("WbemScripting.SWbemLocator")
set objWMI = objLocator.ConnectServer(strComputer, "rootcimv2", "nexor", "PASSWORD")
objWMI.Security_.ImpersonationLevel = 3
objWMI.Security_.Privileges.AddAsString "SeShutdownPrivilege", True

Set colOperatingSystems = objWMI.ExecQuery("SELECT * FROM " & "Win32_OperatingSystem WHERE Primary = true")

For Each objOperatingSystem in colOperatingSystems
ObjOperatingSystem.Win32Shutdown(SH_FSHUTDOWN)
Next

jak widać cały myk jest w zamianie standardowego monikera na złożony, poprzez utworzenie obiektu SWbemLocator a potem.. no właśnie – zalezienie sposobu na definicje obiektu security i specjalnych uprawnień – wypisane w skrypcie „seShutdownPrivilege” wyszperałem w necie bo te natechnecie są jakby na odwrót – metoda AddAsString przyjmuje najwyrazniej wartości opisane w kolumnie ‚descritpion’ a nie ‚Wbemdisp.tlb Constant’ co wydawałoby się logiczniejsze.

procedury składowane z vbs

q pamięci – bardzo przydatny link

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]

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.

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…

WSH 5.7!

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

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

powerShell e-book + demo

darmowy podrecznik do powershell wraz z plikami demo – czas na nauke (:

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

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.