Blog (65)
Komentarze (803)
Recenzje (0)
@tflLeniwy jak administrator

Leniwy jak administrator

18.05.2011 19:38

Są dwa powody, dla których warto robić automaty. Po pierwsze automatowi nie zdarza się o czymś zapomnieć i przeoczyć, po drugie... zrobi coś za nas. Kierując się pierwszym i drugim pisze automaty jak się da i gdzie się da. Tak jak obiecałem w poprzednim wpisie, napisze w miarę szybko o moich najlepszych moim zdaniem automatach. Od razu zaznaczam, żeby potem nie było zgryzów - pracuję na windowsach w domenie. Nie interesują mnie shelle,

Bat na oprogramowanie

Gdy zaczynałem swoją pracę kilka lat temu sprowadzała się głównie do formatowania komputerów, instalowania na nich oprogramowania i wrzucaniu do domeny. Jakież to było nudne! A jakie żmudne! Nie znoszę takiej pracy. Więc zacząłem szukać rozwiązania. Na początek zacząłem pisać proste pliki bat, które jedna po drugiej instalowały mi programy znajdujące się w tym samym folderze. To rozwiązanie wystarczyło mi na dość długo. Potem, roku temu nieomal dokładnie, pow3r_shell na swoim blogu opisał aplikację NSIS i właśnie jego wpis natchnął mnie, żeby trochę rozruszać kości starego instalatora.

Założenia

1) Instalator musi się łatwo aktualizować A dokładniej jego komponenty trzeba łatwo aktualizować oraz dodawać nowe. To było dziecinnie proste. Każdy plik, który uruchamia instalator ma jedną prostą nazwę. skype.exe, firefox.exe, adobe_reader.exe etc. Składnia instalatora pozwala na proste dodanie kolejnego pliku (o składni za chwile).

2) Instalator musi mieć możliwość instalowania domyślnego zestawu aplikacji oraz dla konkretnego działu lub zespołu Tutaj sprawa już nie była tak prosta. Zrobienie prostego menu okazało się nieco... zaskakujące. Pracowałem już wtedy na windows 7 i w ciemno stworzyłem menu w oparciu o komendę choice

choice wstrzymuje wykonanie skryptu i czeka na odpowiedź od użytkownika. Następnie w superzmiennej ERRORLEVEL zwraca indeks odpowiedzi. Szczegóły komendy można poczytać po wydaniu komendy choice /?

Jakież było moje zdziwienie, gdy skrypt wykrzaczał się już na samym początku. Okazało się, że komenda, która była dostępna jeszcze windows 98 nagle znika w windows xp... Trzeba było wszystko przerobić na niekoszerne rozwiązanie set /p

set /p podobnie jak choice wstrzymuje wykonanie skryptu i czeka na akcję od użytkownika. Składnia jest następująca: set /p zmienna=Informacja dla użytkownika Po akcji od użytkownika zmienna przechowuje wartość którą podał użytkownik

3) Instalator musi informować o wykonaniu zadania Rozwiązanie, które wymyśliłem śmieszyło mnie kiedyś bardzo. Batch nie ma możliwości wysłania requestu http, windows 7 nie wspiera już net send. I tutaj na przeciw wyszedł mi linux... Przeglądałem wówczas skrypt do wysyłania smsów z informacjami o awariach (zupełnie nie moja bajka), który w getcie przesyłał parametry. Do działania używał wget. Dlatego ja otwieram internet explorer z parametrem, który jest po prostu odpowiednio spreparowanym linkiem. Link wskazuje na prosty skrypt, który wysyła mi maila.

4) Instalator musi wiedzieć, że skrypt zakończył się z sukcesem Nuda- sprawdzam czy plik exe dla każdej aplikacji istnieje.

Polecam if /? oraz dokładniej if exist

Realizacja

Nie będę ukrywał - najtrudniejszy fragmentem pracy było zdobycie odpowiednich parametrów dla aplikacji, które nie posiadają pakietów instalacyjnych w msi lub po prostu nie chciało mi się ich szukać (w końcu... jestem leniwy). Oto kilka przykładów:

Skype.exe /verysilent IE7‑WindowsXP-x86-plk.exe /quiet /norestart CuteWriter.exe /verysilent java.exe /s dotnet.exe /q /norestart office 2007/SETUP.EXE" /config config.xml

I o tym ostatnim parę słów. W pliku config.xml trzeba podać klucz instalacyjny, który działa. Oczywiście nie aktywujemy go, bo zaraz po instalacji dodajemy:

reg delete HKLM\SOFTWARE\Microsoft\Office\12.0\Registration\{91120000-0031-0000-0000-0000000FF1CE} /v DigitalProductID /f
	reg delete HKLM\SOFTWARE\Microsoft\Office\12.0\Registration\{91120000-0031-0000-0000-0000000FF1CE} /v ProductID /f

Co spowoduje usunięcie klucza, a office przy pierwszej okazji spyta nas o podanie nowego.

W przypadku pakietów msi wystarczy zrobić tak:

msiexec /i chrome.msi /quiet

Na samym końcu jeszcze dodaje:

shutdown /r /t 60 /c "Wykonuje restart komputera po instalacji programow!"

Co powoduje restart komputera po 60 sekundach.

Dlaczego właśnie bat?

Przede wszystkim dlatego, że dość sprawnie poruszam się po konsoli windows. Mogę też podpinać dowolnie zasoby, weryfikować poprawność w prosty sposób, odpalać procesy, wyłączać je, restartować komputer. Być można da się to zrobić w inny sposób. Ale ja jestem leniwy- nie chcę się dowiadywać jak.

Na marginesie: windows 7 bata trzeba uruchomić jako administrator

psexec -c na niesfornych użytkowników

psexec z parametrem -c (copy) kopiuje na zdalny komputer wskazany plik i uruchamia go na nim. Wyobrażacie sobie jaki to potencjał? Zamieszczam poniżej przykładowy plik do instalacji UltraVNC:

::podpinam dysk
net use b: \\192.168.xxx.xxx\instalki /user:host\user pass > nul
::kopiowanie do folderu programfiles
xcopy "b:\instalator\UltraVNC\*.*" "%programfiles%\UltraVNC\" /A /E /C /Q /H /Y > nul
::kopiowanie do folderu programfiles(x86) dla systemów 64 bitowych
xcopy "b:\instalator\UltraVNC\*.*" "%programfiles(x86)%\UltraVNC\" /A /E /C /Q /H /Y > nul
::wyłączam zapore systemu windows
net stop sharedaccess > nul
::dodaje wpisy do rejestru, które dodają ultravnc do zapory
regedit /s "b:\vnc.reg" > nul
::instaluje serwisy (jesli system jest 64 bitowy to wyrzuci blad w tej linii...)
"%programfiles%\UltraVNC\winvnc.exe" -install > nul
::... ale w tej nie
"%programfiles(x86)%\UltraVNC\winvnc.exe" -install > nul
::uruchamiam usługę (na wszelki wypadek)
net start uvnc_service > nul

To oczywiście tylko przykład. Ale pokazuje ile jest możliwości użycia psexec.

INWENTARYZACJA

Kilkaset komputerów, dwadzieścia parę serwerów, oprogramowania idące w setkach. Jak nad tym wszystkim zapanować?

WMI

Co to dokładnie jest WMI, jak to się je i z czym, to już jest temat na osobny (ogromny nawiasem mówiąc) post. Tutaj skupię się pokrótce na wyjaśnieniu, że dzięki WMI i WQL można o systemie dowiedzieć się bardzo dużo. Zasada jest prosta - wszystko czego możemy dowiedzieć się o parametrach komputera jest gdzieś zapisane. I właśnie dzięki WQL czyli SQL for WMI możemy się te parametry poznać. Krótki przykład:

strComputer = "."
i=0
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_NetworkAdapter where AdapterTypeID = 0 and NOT Manufacturer like 'Microsoft' and NOT ServiceName like 'DNE' and NOT MACAddress like '00:50:56:C0:00:01' and NOT MACAddress like '00:50:56:C0:00:08'",,48)
For Each objItem in colItems
               strLink = strLink & "&" & "mac[" & i & "]=" & Replace(objItem.MACAddress, "#", "")
                i = i +1
Next

Kod ten (napisany w vbs) odpyta nam WMI o adresy MAC spelniajace kryteria. Dlaczego właśnie takie kryteria będę opowiadał dalej. Bardzo dokładną dokumentację tego, co można dzięki WQL wyczytać znajdziecie tutaj. Powtarzanie tego nie ma sensu.

VBS

VBS to skryptowy język programowania dostępny w windows i obsługiwany na przykład przez program cscript.exe. Dla mnie przypomina troszkę C# i javascript, jest generalnie bardzo prosty. Ale jego największą zaletą jest to, że można go podpiąć w GPO do skryptów automatycznie uruchamianych wraz z logowaniem się użytkownika. Nie do przecenienia jest także możliwość wysyłana postów w protokole http. O wszystkim za chwilę.

PHP i MySQL

To będzie serce systemu. PHP obrabia dane przekazane przez VBS, MySQL robi to co należy do baz danych, czyli przechowuje dane.

Jak to wszystko zrobić, żeby zadziałało...

Po pierwsze - komputery należy w jakiś sposób identyfikować. Można oczywiście po hostname, który znajdziemy w classie Win32_ComputerSystem, ale to nie gwarantuje unikatowości. Łatwo wyobrazić sobie sytuacje, gdy komputer zmienia host i ponownie inwentaryzuje się jako nowy. Najlepszym rozwiązaniem jakie udało mi się opracować jest identyfikowanie komputerów po adresach MAC. Wcześniej podany kod pokazuje, jak zrobić to w miarę sprawnie - zostają wyeliminowane wszystkie niefizyczne interfejsy oraz te, które dorzuca VMVare na serwerach maszyn wirtualnych. Dostajemy więc tablicę, która zawiera adresy mac. Trzeba tylko pamiętać, że wyłączona karta nie zgłasza się adresem. W moim przypadku do identyfikacji wystarczy, że tylko jeden adres pokrywa się z tym, co już mam w bazie.

Z WMI wyciągam większość danych. Brakowało mi tylko informacji o monitorach. Tych szukałem w rejestrze, w gałęzi SYSTEM\CurrentControlSet\Enum\DISPLAY\. Do sczytania danych znów użyłem VBS. Na końcu klucze do systemów windows oraz do pakietów office. Znów wszystko z rejestru. Dla Windowsów będzie to gałąź: SOFTWARE\Microsoft\Windows NT\CurrentVersion, a dla office: SOFTWARE\Microsoft\Office\xx.x\Registration. Same klucze zakodowane są w base24, ale nie ma większego problemu, żeby przy pomocy vbs to rozkodować. Można jeszcze dodać zawartość klucza: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall i mamy cały zainstalowany soft w windows (w wersji 32 bity)

Mamy więc niezbędne informacje, teraz musimy je przesłać do naszego PHP. Ja robię to po prostu tak:

Function HTTPPost(sUrl, sRequest)
  set oHTTP = CreateObject("Microsoft.XMLHTTP")
  oHTTP.open "POST", sUrl,false
  oHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  oHTTP.setRequestHeader "Content-Length", Len(sRequest)
  oHTTP.send sRequest
  HTTPPost = oHTTP.responseText
 End Function

Gdzie sUrl to po prostu adres serwera z nasłuchującym PHP, a sRequest to treść posta w formacie zmienna=wartosc_zmiennej&zmienna2=wartosc_zmiennej2 itd.

Podsumowanie

No i to w zasadzie tyle. Niestety nie mogę ujawnić całego działającego kodu, ale mam nadzieję, iż pokazałem pewne możliwości i wskazałem szlaki. Miłego kodowania!

Wybrane dla Ciebie
Komentarze (6)