Blog (65)
Komentarze (803)
Recenzje (0)

Leniwy jak administrator

@tflLeniwy jak administrator18.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!

Szanowna Użytkowniczko! Szanowny Użytkowniku!
×
Aby dalej móc dostarczać coraz lepsze materiały redakcyjne i udostępniać coraz lepsze usługi, potrzebujemy zgody na dopasowanie treści marketingowych do Twojego zachowania. Twoje dane są u nas bezpieczne, a zgodę możesz wycofać w każdej chwili na podstronie polityka prywatności.

Kliknij "PRZECHODZĘ DO SERWISU" lub na symbol "X" w górnym rogu tej planszy, jeżeli zgadzasz się na przetwarzanie przez Wirtualną Polskę i naszych Zaufanych Partnerów Twoich danych osobowych, zbieranych w ramach korzystania przez Ciebie z usług, portali i serwisów internetowych Wirtualnej Polski (w tym danych zapisywanych w plikach cookies) w celach marketingowych realizowanych na zlecenie naszych Zaufanych Partnerów. Jeśli nie zgadzasz się na przetwarzanie Twoich danych osobowych skorzystaj z ustawień w polityce prywatności. Zgoda jest dobrowolna i możesz ją w dowolnym momencie wycofać zmieniając ustawienia w polityce prywatności (w której znajdziesz odpowiedzi na wszystkie pytania związane z przetwarzaniem Twoich danych osobowych).

Od 25 maja 2018 roku obowiązuje Rozporządzenie Parlamentu Europejskiego i Rady (UE) 2016/679 (określane jako "RODO"). W związku z tym chcielibyśmy poinformować o przetwarzaniu Twoich danych oraz zasadach, na jakich odbywa się to po dniu 25 maja 2018 roku.

Kto będzie administratorem Twoich danych?

Administratorami Twoich danych będzie Wirtualna Polska Media Spółka Akcyjna z siedzibą w Warszawie, oraz pozostałe spółki z grupy Wirtualna Polska, jak również nasi Zaufani Partnerzy, z którymi stale współpracujemy. Szczegółowe informacje dotyczące administratorów znajdują się w polityce prywatności.

O jakich danych mówimy?

Chodzi o dane osobowe, które są zbierane w ramach korzystania przez Ciebie z naszych usług, portali i serwisów internetowych udostępnianych przez Wirtualną Polskę, w tym zapisywanych w plikach cookies, które są instalowane na naszych stronach przez Wirtualną Polskę oraz naszych Zaufanych Partnerów.

Dlaczego chcemy przetwarzać Twoje dane?

Przetwarzamy je dostarczać coraz lepsze materiały redakcyjne, dopasować ich tematykę do Twoich zainteresowań, tworzyć portale i serwisy internetowe, z których będziesz korzystać z przyjemnością, zapewniać większe bezpieczeństwo usług, udoskonalać nasze usługi i maksymalnie dopasować je do Twoich zainteresowań, pokazywać reklamy dopasowane do Twoich potrzeb. Szczegółowe informacje dotyczące celów przetwarzania Twoich danych znajdują się w polityce prywatności.

Komu możemy przekazać dane?

Twoje dane możemy przekazywać podmiotom przetwarzającym je na nasze zlecenie oraz podmiotom uprawnionym do uzyskania danych na podstawie obowiązującego prawa – oczywiście tylko, gdy wystąpią z żądaniem w oparciu o stosowną podstawę prawną.

Jakie masz prawa w stosunku do Twoich danych?

Masz prawo żądania dostępu, sprostowania, usunięcia lub ograniczenia przetwarzania danych. Możesz wycofać zgodę na przetwarzanie, zgłosić sprzeciw oraz skorzystać z innych praw wymienionych szczegółowo w polityce prywatności.

Jakie są podstawy prawne przetwarzania Twoich danych?

Podstawą prawną przetwarzania Twoich danych w celu świadczenia usług jest niezbędność do wykonania umów o ich świadczenie (tymi umowami są zazwyczaj regulaminy). Podstawą prawną przetwarzania danych w celu pomiarów statystycznych i marketingu własnego administratorów jest tzw. uzasadniony interes administratora. Przetwarzanie Twoich danych w celach marketingowych realizowanych przez Wirtualną Polskę na zlecenie Zaufanych Partnerów i bezpośrednio przez Zaufanych Partnerów będzie odbywać się na podstawie Twojej dobrowolnej zgody.