Skip to Content

IT nieuczesane.
category

Category: article

windows backup, bootwanie z vhd i dużo czasu

podczas MTS jedna z osób zapytała się, czy to prawda, że kiedy wykona się backup Windows 7, można z tego backupu uruchomić komputer? dla niewtajemniczonych [są tacy?] jest to złożenie dwóch funkcjonalności, które pojawiły się odpowiednio w Vista i w7:

  • Windows Backup w postaci image’u robiony do pliq VHD
  • możliwość bootowania w7 z vhd

mówiąc bardzo w skrócie: tak, da się zbootować system z backupu [w7].

rzeczywistość jest mniej przyjemna i walczyłem 3 dni, żeby to udowodnić – przebijanie się głową przez kolejne ściany praw Murphiego jest bolesne. w efekcie osiągnąłem 95% sukcesu.

warunki początkowe
warunkiem aby taka operacja zadziałała jest bootowanie dysq vhd na takim samym [bardzo zbliżonym] kompie. testowałem na maszynie nieco odbiegającej od oryginału, ale w zasadzie ten sam model. z ciekawości odpaliłem ten sam image na sprzęcie w żadnym stopniu nie przypominającym oryginalnego i…. *wstał bez problemów* (SIC!). to pozytywna wiadomość, bo to otwiera drogę do dość prostej migracji komputerów – backup > kopia pliq na drugi komp > odpalanie systemu z vhd > instalacja nowych sterowników.
w końcu znalazłem zastosowanie dla Windows Backup – którego osobiście bardzo nie lubię, i do tej pory wieszałem na nim psy. jak się okazuje – są scenariusze, do których się przydaje [szkoda, że nie jest to po prostu backup (; ].

dla czego 3 dni?
podstawowym problemem zabierający godziny jest czas operacji wykonywanych na dyskach vhd i kopiowania via USB – nie ma to takiego znaczenia, kiedy się bawi 8-1oGB plikami, ale backupowany dysk miał 16oGB. dysk, z którego uruchamia się system musi być typu „FIXED”, backup oczywiście robi „DYNAMIC”. konwersja następuje podczas uruchomienia systemu, a więc trzeba mieć odpowiednią ilość miejsca – w innym wypadq jedyne co się zobaczy to bluescreen.
no i zaczyna się zabawa… w jaki sposób zmniejszyć dysk vhd? zadanie w zasadzie trywialne:

  • należy podmountować vhd
  • zmniejszyć partycję [shrink]
  • użyć vhd resize do zmniejszenia dysq i konwersji na FIXED

każdy z kroków okazał się zabójczo czasochłonny i niósł ze sobą ograniczenia… a każda pomyłka to kilka h w plecy.
punkty 1 i 2 należy wykonać z w7 – vhd mount z virtual servera nie rozumie vhd z w7. nie ma problemu – wystarczy płyta instalacyjna w7. tutaj pojawia się jednak następne ograniczenie – pomimo dużej ilości wolnego miejsca w vhd, dysk da się zmniejszyć tylko o kilka procent… dla czego? pliki są sfragmentowane, a WBackup robi image dysq – a więc odzwierciedla fragmentację wewnątrz vhd. należy więc najpierw zrobić defraga. żeby go zrobić trzeba podmountować vhd jako partycja albo pamiętać o tym przed wykonaniem backupu. żeby podmountować vhd i zrobić defrag trzeba już mieć żywy w7 [na płycie instalacyjnej defraga nie ma ): ], do którego możemy go podpiąć. defrag wykonuje się kolejne kilka h…
zakładając że dysk był zdefragmentowany i możemy pomniejszyć partycję pozostaje zmiana wielkości partycji. być może miałem zbyt mało cierpliwości ale kiedy próbowałem zeshrinkować partycję na dysq dynamicznym – operacja zawieszała się i w efekcie nie dało się potem użyć vhd resize. a więc najpierw trzeba wykonać vhd resize modyfikację do FIXED [ilość miejsca: wielkość backupu + wielkość dysku oryginalnego] – kolejne kilka godzin [zostawiłem na noc q: ]. kiedy miałem już dysk FIXED, bez problemu udało mi się wykonać SHRINK [chociaż też sporo to trwało – koło godziny?]… no i teraz można użyć VHD Resize do zmniejszenia wielkości – znów ładnych parę godzin czekania. fuh.

ale kiedy już po prostu ma się odpowiednie vhd i odpowiednią ilość miejsca cała operacja jest dość prosta q:
a czemu tylko 95% sukcesu? bo dla mnie ostatnia ściana Murphiego okazała się nie do przebicia. całym celem tych wszystkich manewrów było uruchomienie starego lapa, żeby dostać się do książki adresowej outlooka. nie wiedzieć czemu outlook poczęstował mnie komunikatem, że nie ma wszystkich folderów ani połączenia z serwerem i żebym poszedł na szczaw.

na koniec kilka instrukcji

zmniejszenie partycji na dysq vhd
potrzebne: system z w7 lub płyta instalacyjna w7
założenie: vhd jest zdefragmentowany

  • jeśli uruchamia się z płyty, wystarczy na pierwszym ekranie nacisnąć shift-F1o i mamy konsolę. jeśli jesteśmy w żywym systemie – cmd.exe [z trybie administratora]
  • diskpart
  • select vdisk file=”X:DIRmojbackup.vhd” – tutaj dwie uwagi. po pierwsze nazwy plików z backupu sa bardzo nieprzyjemne, więc dobrze sobie taką nazwę zmienić na coś zapamiętywalnego, po drugie jeśli mamy owe vhd na dysq USB, to jaką ma literkę? na szczęście konsola – również z płyty instalacyjnej – ma wmic’a: „wmic logicaldisk get caption,description” pomoże sprawdzić literki dysqw
  • attach vdisk
  • list disk
  • select disk 2 – oczywiście numerek sczytany z poprzedniego listingu
  • list part
  • select partition 1
  • shrink querymax – to trwa kilka minut ale będzie wiadomo o ile można pomniejszyć partycję
  • shrink desired=60000 minimum=60000 – zmniejszenie o 6oGB… no i teraz czekać, czekać, czekać
  • detach vdisk

jak to zrobić spod XP
xp to pasqdztwo. ale cóż – nie miałem wyjścia, więc przy okazji sprawdziłem. podstawowym problemem jest instalacja bootloadera z w7. zastosowałem sposób opisywany tutaj – z żywego w7 skopiowałem katalog WindowsBoot a potem użyłem EasyBCD. ten totalnie rozwala wpisy [bo jest pisany na viste a nie na xp] a więc w pierwszej kolejności trzeba naprawić wpis dotyczący bootowania XP.
podczas zabawy z bcdedit mam wrażenie, że to działa niedeterministycznie – używanie aliasów ID często kończy się w zupełnie nieprzewidywalny sposób. ciekawe jest też to, że niektóre wpisy nie są pokazywane – np. wpis {ntldr}:

  • jeśli wykona się bcdedit /create {ntldr} /d „gowniany XP” – skończy się to komunikatem, że taki wpis już jest – pomimo, że /v go nie pokazuje. no więc najpierw trzeba go usunąć [z opcją force]
  • bcdedit /delete {ntldr} /f
  • bcdedit /create {ntldr} /d „gowniany XP” – teraz zadziała (;
  • bcdedit /set {ntldr} device partition=D: – tutaj to d: jest sporą ciekawostką. w zasadzie to przecież vhd powinno być gdzieś dalej… to jedna z zagadek: ‚czy da się tą wartość deterministycznie wyliczyć?’
  • bcdedit /set {ntldr} path ntldr
  • bcdedit /displayorder {ntldr} /addlast – dopiero po tej komendzie, wpis pokazuje się na liście przy parametrze /v

i tyle. xp się uruchamia. oczywiście trzeba jeszcze dodać samo vhd do listy bootowania ale tutaj już sobie wygooglujcie sami q:

wszystko takie proste… w teorii.

n. [w lekkim pośpiechu. sory za tempo ale cały czas braqje mi czasu… mam nadzieję że *cokolwiek* z tego textu jest zrozumiałe. kiedy czytałem go drugi raz sam niewiele zrozumiałem, więc postanowiłem dodać na końcu tegoż-oto disclaimera (; ]

SCCM Console Extensions – WOL nie działa na WS2008

Ostatnio mocno zainteresowałem się rozszerzeniami konsoli SCCMa. Ogólnie polegają one na fajnym wykorzystaniu przestrzeni nazw WMI, którą daje ConfigMgr. Ale żeby nie malować trawy na zielono najpierw zainstalowałem 2 pakiety wtyczek – SCCM Right Click Tools oraz SCCM Console Extensions. Po ich przetestowaniu muszę powiedzieć, że można robić niezłe cuda w MMC przy użyciu hta i vbs ;)

Tyle, że jedna funkcjonalność mi nie działała – Wake On Lan. Wiem, że komputery mają uruchomiony remote wake up i są podłączone do sieci (1 warstwa) mam możliwość directed broadcast (2. warstwa), więc problem musi być z działaniem samej wtyczki. Po kliknięciu tutaj:

image

Mamy śliczny komunikat, że wszystko się udało.

image

grzebiąc w kodzie znajdujemy coś takiego:

errReturn = WshShell.Run(chr(34) & strCurrentPath & "WOL.exe" & chr(34) & " " & strWOLAddress,0)
If errReturn <> 0 Then
   
LogArea.Value = LogArea.Value & "ERROR!" & vbCrLf
   
LogArea.Value = LogArea.Value & " " & Err.Description & vbCrLf
   
LogFile.WriteLine(Date & " " & Time & vbTab & "Send Wakeup: ERROR!" & vbTab & Err.Description)
   
LogArea.scrollTop = LogArea.scrollHeight
Else
   
WolSuccess = 1
   
LogArea.Value = LogArea.Value & "Wakeup sent to " & strMACAddress & vbCrLf
   
LogArea.scrollTop = LogArea.scrollHeight
   
LogFile.WriteLine(Date & " " & Time & vbTab & arrComputers(iList) & ": Wakeup sent to " & strMACAddress)
End If

Widać, że to nic innego niż wywołanie wol.exe z katalogu z rozszerzeniami. Sprawdzamy co się dzieje z tym programikiem. Po wpisaniu w CMD – "c:Program FilesSCCMConsoleExtensionsWOL.exe" 00219B7B80CD też działa… ale ale – brakuje adresu IP i maski do kierunkowego bradcastu. Patrzymy wol.exe /? można podać tylko IP :/ niedobrze. sieci z nie klasowymi maskami odpadają. po chwili szperan
ia w bingu znalazłem narzędzie wolcmd.exe. Usage: wolcmd [mac address] [ipaddress] [subnet mask] [port number]. No i pięknie teraz tylko wrzucić je do odpowiedniego katalogu i podmienić kawałęk skryptu na coś takiego:

strNetmask = inputbox("Provide netmask")
For Each instance in colMACAddress
   
strMACAddress = instance.MACAddress
   
strWOLAddress = (Replace(instance.MACAddress,":",""))
   
strIPAddress = instance.IPAddress
   
LogArea.Value = LogArea.Value & arrComputers(iList) & ": "
   
LogArea.scrollTop = LogArea.scrollHeight
   
errReturn = WshShell.Run(chr(34) & strCurrentPath & "wolcmd.exe" & chr(34) & " " & strWOLAddress & " " & strIPAddress & " " & strNetmask & " 7",0)
    
   
If errReturn <> 0 Then
       
LogArea.Value = LogArea.Value & "ERROR!" & vbCrLf
       
LogArea.Value = LogArea.Value & " " & Err.Description & vbCrLf
       
LogFile.WriteLine(Date & " " & Time & vbTab & "Send Wakeup: ERROR!" & vbTab & Err.Description)
       
LogArea.scrollTop = LogArea.scrollHeight
   
Else
       
WolSuccess = 1
       
LogArea.Value = LogArea.Value & "Wakeup sent to " & strMACAddress & "" & strIPAddress & vbCrLf< font color="#808080">
        LogArea.scrollTop = LogArea.scrollHeight
       
LogFile.WriteLine(Date & " " & Time & vbTab & arrComputers(iList) & ": Wakeup sent to " & strMACAddress)
   
End If
Next

No i wtedy działa :) Jeszcze jedna uwaga – w czasie szukania pól do skryptów niezastąpione jest narzędzie WMI CIM Studio. tylko należy pamiętać, żeby wybrać do przeglądania namespace \Srv1rootSMSsite_LAB gdzie Srv1 to nazwa serwera SCCM, a LAB to trzyliterowy kod site’u. Najciekawsze klasy są w gałęzi – SMS_GroupSMS_G_System_Current*

Ciekawe czasy

„Obyś żył w ciekawych czasach” – chińskie przekleństwo, które nie wydaje mi się aż takie złe. Gdy byłem mały, po wielu książkach sf i pierwszych gwiezdnych wojnach w kinie, marzyłem sobie, że w końcu odkryjemy (a w zasadzie zostaniemy odkryci) całe sprzymierzenie kosmicznych ras i włączy ono nas do swojego ugrupowania. Dzięki czemu posiądziemy niewyobrażalną wiedzę, technologię i możliwości i będzie można latać po wszechświecie jak w gwiezdnych wojnach. Choć statystycznie wypada, że gdzieś tam żyją ufoludki, szansa, że ktoś przyleci do nas, i odpali nam w gatisie napęd nadświetlny jest wg mnie stosunkowo nikła. Musimy zatem rozwijać się sami.
Gdy spojrzymy na rozwój technologii IT, choć i tak powstrzymywany usilnie przez marketing (fałszywe prawa Moora itp), to w zasadzie bierzemy udział w giantynczym rozwoju technologicznym. Nie będę nawijał tu o komórkach czy GPS’ie, ale skupmy się chociaż o elektronicznej rozrywce. Gram od ponad 15 lat. Pomijając fakt, że całe granie, które kiedyś było przeznaczone dla dzieci (tak jak komiksy), a teraz stało się gigantycznym rynkiem i biznesem. Powoli przestają dziwić grający dorośli, powoli zaczyna być to traktowane z większa powagą, choć może do uzyskania miana sztuki czeka nas jeszcze trochę czasu (przypomnę, że kiedyś zabraniano młodzieży czytać książek, z uwagi na destrukcyjny – jak to wówczas sądzono – wpływ na młodą psychikę). Każdy z nas widzi rozwój tej branży, każdy pamięta automaty, tetrisa czy boulder dasha. Nie chodzi nawet o kolosalny rozwój grafiki, ale uświadomiłem sobie, że kolejne produkcje, będą tylko lepsze. Lepsze niż niektóre filmy czy książki. Produkcje takie jak „Mass Effect”, czy „Call of duty 4 – Modern Warefare”, biją na głowę większość filmów sensacyjnych, czy kiepskich książek sf. A będzie tego coraz więcej i robionego z większymi budżetami. Zastanawiam się jaki będzie następny krok po takim Modern Warfere 2 (październik 2009), bo że będzie to interaktywny film wojenno – sensacyjny, nie ma żadnych wątpliwości. Nie ma co biadolić nad spadkiem jakości większości produkcji. Tak jak w kinie będzie mainstream dla każuali i hardkorowe produkcje dla hardkorowców. A to że chwilowo wszystkim odbiła szajba na punkcie braku optymalizacji kodów, bo 4GB karty graficzne uciągną wszystko – coż – koszt postepu.
Pozostaje nam czekać, na kolejne epickie produkcje, oraz zastanawiać się, co będzie następne po pseudo 3D. Bo hełmy do VR i „Cretive Smellblaster” (to naprawdę istniało, choć na googlu nie ma nawet zdjęcia!) jakoś się nie przyjęły. Ja na pewno czekam na MW2 i wiem, że nie będzie to gorsze od filmu który ostatnio widziałem.

Krok ku zarządzaniu

 Żeby nie było tak całkiem lajcikowo na tym blogu dodam kilka konkretów na temat uporządkowania działu IT. Nie będę rozpisywał się na temat metodologii ani sposobu tworzenia procesów, serwisów itp., opowiem wam tylko, co zrobiłem u siebie i w ogóle po co to komu. To dopiero początek drogi, ale warto go przebrnąć.

W każdej organizacji nadchodzi moment masy krytycznej, czyli takiego momentu kiedy spraw jest tak dużo, że przestajemy nadążać z ich bieżącym załatwianiem a sposób doboru specjalistów na zasadzie „wszyscy wiedzą wszystko” przestaje się sprawdzać. W takich sytuacjach pomocne może być zgłębienie podstaw jakieś metodologii zarządzania procesami IT (np.. ITIL), zakasanie rękawów i zrobienie LISTY. Przykowa lista zanjduję się tutaj.

Lista serwisów

  1. Nie zrobimy od razu dobrej i kompletnej listy serwisów, a jeśli się to komuś uda, to albo zajmuje się tylko uzupełnianiem tonera w drukarkach, albo jest kolejną implementacją T1000. Sugeruję więc zacząć od spisania wszystkiego, do czego dotyka się dział IT (np.. Meble ustawiam, żarówki wymieniam, komputery instaluje …) Wszystko co nam przyjdzie do głowy. Im tego więcej tym lepiej.
  2. Kolejny krok to mapowanie listy na konkretne serwisy jakie świadczy dział IT. Serwisy muszą być zorientowane na użytkownika! To najtrudniejsza część, bo musimy się postawić w roli przeciętnego usera. Żaden zarząd, dział księgowy czy inne elementy decyzyjne w firmie nie wie, co znaczy „Modernizacja mechanizmów aktywnych zapór ogniowych, poprzez upgdrade MS ISA Server 2006 oraz GFI 12”, natomiast szybciej znajdzie się kasa na „Zapewnienie bezpiecznego korzystania z internetu i ochorny wrażliwych informacji firmowych…”. Czy coś w tym stylu … Czujecie różnicę. Lista serwisów musi być zrozumiała dla wszystkich. Nie tylko dla IT.

 

Przykłady:

  • Bezpieczny dostęp do Internetu
  • Współdzielona przestrzeń dyskowa
  • Współdzielony dostęp do drukarek A4
  • Widekonferencja pomiędzy siedzibami firmy

 

 

  1. Serwisy należy oczywiście opisać, ale zwróćcie uwagę, że nie używamy tutaj nazw sprzętu, systemów itp.. Taka wiedza jest potrzebna tylko IT, dla pozostałych ma zostać przezroczysta. Informacje techniczne możemy zebrać dla siebie, ułatwi to na pewno pracę i pomoże w optymalnym zarządzaniu procesami.

 

Co nam to ułatwia?

 Zaczynamy rozmawiać u zestawach czynności. Serwis współdzielonego wydruku, to dla usera „drukarna nie działa”, dla nas to bardziej skomplikowany mechanizm, bo to składowa urządzenia, tonera, papieru, kabla sieciowego, swicha, serwera wydruku, sterownika, kolejki, znowu kabla, komputera, stacji roboczej i na końcu interfejsu białkowego.  Nie ucieszymy użytkownika stwierdzeniem „… to coś z VLANem drukarek”, drukarka ma działać! Więc potrzebujemy opiekuna serwisu, by to wszystko ogarnął.

 

  1. Potrzebujemy odpowiedzialnej osoby, a jak takiej nie znajdziemy, to musimy wyznaczyć osobę odpowiedzialną ;). Osoba opowiedziana za serwis, nie musi oczywiście samodzielnie wykonywać wszystkich zadań, ale ma być interfejsem, opiekunem i koordynatorem prac, nad przywróceniem działania serwisu (np.. Może wezwać serwis, przeprowadzić testy i poinformować o tym, że awaria została usunięta). Taka osoba musi mieć oczywiście backup na wypadek chociażby urlopu lub innej alokacji.

 

Mamy już podstawowe elementy listy, teraz możemy ją rozbudowywać o kolejne elementy, wedle własnych potrzeb. W przykładowym pliku, dołączyłem elementy, jakie są przydatne dla mnie, opiszę je w dużym skrócie:

  • Service Level – Czyli określenie, czy dany serwis należy się każdemu, czy jest świadczony ale za dodatkową „opłatą”
  • Service Scope – przy kilku biurach, są serwisy globalne (np.. Tylko w centrali) oraz lokalne (tylko w oddziale) np.. Dostęp WiFi

 

Na tym oczywiście lista się nie kończy, ale aby nie zaciemniać obrazu, na tym poprzestanę.  Kolejnymi krokami może być oczywiście dopisanie dostępności serwisów (SLA) i wielu innych rzeczy o które chcemy rozbudować swoją listę. Mój przykład wygląda tak … nie chce mi się tego tłumaczyć, więc pozostaje w lengłydżu.

Daro powraca – troche żółci nie zaszkodzi

Nie ma to jak wylać swoje żale publicznie, ku uciesze gawiedzi. Zapraszam na głośny powrót.
http://www.w-files.pl/coztymit/

AD DS Recycle Bin – poprawione

technetowy art dotyczący AD DS Recycle Bin został znacznie poprawiony i rozszerzony o sposób wykorzystania z “GUI” czyli ldp.exe. o dziwo opcja z commandline jest dużo prostsza – i należy się zacząć przyzwyczajać do takiego podejścia w nowych produkcjach emesa (;

n.

regexp – wyrażenia regularne na prostym przykładzie

odkąd poświęciłem kilka godzin na przegryzienie się przez regexpy zakochałem się w tym wynalzq. możliwość matematycznej reprezentacji zapisu słownego – taki revers języków formalnych – to potężna rzecz.

teraz też się przydało. zadanko: jak z sieczki generowanej przez net view wyciągnąć dyski i literki tak, żeby łatwo było potem je obrabiać?

set re = new RegExp
re.pattern="^([a-zA-Z]:) (\\(?:[a-zA-Z0-9.]+\?)+)"
re.ignoreCase=true

to najważniejsza część całego rozwiązania – regexp definiujący zapis typu “X: \serverjakassciezka a potem cokolwiek”. to “cokolwiek” to dopisywaliśmy jako komentarz do pliq, bo nie przywidywaliśmy, że będzie potrzeba późniejszej modyfikacji/sczytywania. geniusz regexpa polega m.in. na tym, że kiedy coś znajdzie, łatwo to wyciągnąć. wyjaśnienie:

^([a-zA-Z]:)[spacja](\\(?:[a-zA-Z0-9.]+\?)+) – każdy znak ma znaczenie:

  • ^ [dash] – oznacza początek linii. jeśli komentarze dawalibyśmy również na początq – wystarczy usunąć
  • () [nawiasy okrągłe]- oznaczają, że to co będzie pasowało do wyrażenia, zostanie zwrócone jako zmienna, z którą można coś później zrobić. w tym przykładzie będzie to literka dysku z dwukropkiem, która będzie przechowywana – dzięki temu mogę to potem wypisać ją lub przerobić jak chcę [np. zamienić na inną]
  • [] [nawiasy kwadratowe] – oznaczają że chodzi o znak z określonego zakresu. tutaj zakresem jest…
  • a-zA-Z – czyli dowolna litera mała lub duża z zakresu a-z
  • : [dwukropek]– po prostu znak. w sumie całe wyrażenie oznacza dowolny ciąg typu “a:”, “M:” itepe
  • [spacja] – podobnie jak w przypadq dwukropka – wszystko co nie jest poprzedzone znakiem specjalnym jest po prostu tym, czym jest – znakiem. a więc spacja to spacja – ta “[spacja]” z przykaładu
  • () – znów nawias, który oznacza, że będzie zwrócona kolejna zmienna [aka $2] – jak się z nich korzysta będzie później
  • \\ [4 backslashe] – backslash to znak specjalny, który eliminuje specjalność znaków specjalnych (; jeśli np. “+” jest znakiem specjalnym ale chodzi nam o znak a nie o jego funkcję, to trzeba poprzedzić go backslashem “+” – i nie będzie interpretowany. znakiem specjalnym jest również backslash, a więc 4 bcks oznacza ciąg “\”
  • (?:) [pytajnik i dwukropek w nawiasach okrągłych] – potem są znów nawiasy, ale tym razem od razu po nawiasie jest pytajnik i dwukropek. zmiennych zwracanych z regexpa może być 9. przy skomplikowanych dopasowaniach może się okazać, że po prostu chcemy coś zgrupować [np,. po to, żeby powiedzieć, że dany ciąg ma wystąpić X razy] ale nie interesuje nas wynik -  nie będzie przydatny do późniejszej obróbki [ma wyłącznie charakter dopasowania]. wtedy dodaje się “?:” oznaczające “nie zapamiętuj tego dopasowania”
  • [a-zA-Z0-9.]+ – część w nawiasie oznacza dowolny znak z zakresu a-z lub A-Z lub 0-9 lub kropkę. plusik na końcu oznacza od 1 do więcej powtórzeń a więc przykładami dopasowania byłyby “aaa”, “10.20.30”, “asd.kjs.d00.00”
  • \? [2backslashe pytajnik] – jak widać z wcześniejszego przykładu, tak i tutaj znak sterujący jest na końcu – tak to jakoś właśnie w regexpach jest. pytajnik oznacza zero lub jedno wystąpienie tego, co stoi przed nim. a przed nim są 2 backslashe, co oznacza ciąg “” który może być albo nie. a to dla tego że w ścieżce dysq jest: “\server12share” – co odpowiada regexpowi, który można by przeczytać “dwa slashe, potem jedno lub więcej wystąpień ciągu składającego się ze ze znaków alfabetu, cyfr lub kropek, po którym jest lub nie pojedyńczy slash”. no tak jest – jedno wystąpienie “server12” i drugie “share”.

teraz jak to wykorzystać w kodzie:

      set file=fso.OpenTextFile(file) 
      fileBody=split(file.ReadAll,VBCrLf)
      for each line in fileBody
        if re.test(line) then 
         set matches = re.execute(line)
'          for each match in matches
'            wscript.echo match.value
'          next
' same-same but different (: 
          wscript.echo matches(0).submatches(0)&" "&matches(0).submatches(1)
        end if
      next 

zmienna ‘file’ to gdzieś tam zdefiniowana nazwa pliq – nieważne. generalnie otwierany jest plik, powstały przy pomocy ‚net view >> somefile.log’, wczytywany do tablicy, w której kolejny wiersz to linia pliq. no i teraz zaczyna się wykorzystanie wyrażeń regularnych.

  • re.test(line) zwraca true/false – czyli czy znalazł dopasowanie czy nie. a więc jeśli linia zaczyna się ciągiem typu “x: \servershare” to o to chodziło. jak nie – olej.
  • set matches = re.execute(line) – sam test niewiele daje. dla tego tworzony jest obiekt, do którego przypisywany jest wynik [kolekcja] z faktycznego ‘uruchomienia’ wyrażenia – trochę to redundantne bo niby sam test to już zrobił, ale trochę konieczne – to takie zabezpieczenie w stylu ochroną przed dzieleniem przez zero. można nie robić testu i po prostu wykonać execute i zobaczyć co zwraca matches.count – czyli ile jest trafień. do wyboru, do koloru
  • potem jest kilka wykomentowanych linijek, a to dla tego, że dalsza część kodu robi to samo, tylko bardziej uniwersalnie. ale zostawiłem, ponieważ to dwa sposoby wyświetlenia wyników – pierwszy ogólny:
  • for each match in matches – jak pisałem, zwracana jest kolekcja, a więc ‘dla każdego dopasowania w kolekcji’
  • wscript.echo match.value –  match.value to wartość dopasowania – całego – i dla tego ciężko coś z tym zrobić później.
  • wscript.echo matches(0).submatches(0)&" "&matches(0).submatches(1) – w tym konkretnym przypadq wynik na ekranie będzie dokładnie taki sam, ale możliwości są zupełnie inne. wyjaśnia się też tajemnica ‘zapamiętywanych zmiennych’ – które wyszuqje się za pomocą nawiasów (). w przykładzie w nawiasach były dwa dopasowania – litera dysku z dwukropkiem oraz sama ścieżka. i dokładnie to jest wypisywane – matches(0), ponieważ to pierwszy element kolekcji [i w tym przypadq jedyny – dokładnie ten, który był w powyżej wypisany jako całość] – a potem występuje ‘submatches(X)’ – co jest adekwatne do $1, $2 etc – oznacza numer ‘zapamiętaj zmiennej’ liczony od zera. a więc submatches(0) to np. ‘M:’ a submatches(1) to np. “\servershare” dzięki temu można je wykorzystać w dowolnym momencie – choćby zamienić ich kolejność, wykonać operację na jednym z nich [np. uppercase]

regexpy mają wiele fajnych zastosowań – wszędzie tam, gdzie trzebaby w kodzie zrobić pierdylion if’ów, case’ów i innych wynalazków – które średnio się nadają do operacji na niezbyt przewidywalnych stringach. dzięki wyrażeniom regularnym można zdefiniować to w lu
dzkim języq.. chociaż wygląda totalnie nieludzko i mało podobnie do języka (; przykładem zastosowania są zasady normalizacji numerów telefonów – czy ktoś wpisze +48 czy 22 czy +4822 czy tylko numer telefonu, a może potem jest jakiś numer wewnętrzny? a jak firma jest w kilq lokalizacjach to prefixy będą inne, a czy numer telefonu ktoś wpisał jako 345-67-89 czy może 3456789 a może ze spacjami?… i tak dalej. a na wyjściu musi zawsze być znormalizowany numer telefonu dla danej lokalizacji. zapisuje się to bardzo prostymi wyrażeniami regularnymi w stylu “^((00|+)48)?(d{3}.?d{2}.?d{2})(d{4})?” q: pisząc to mam na myśli OCS, i tak na prawdę to wygląda tam dużo prościej.

reasumując – niewiarygodnie wygodne narzędzie, które może nie przydaje się na co dzień ale kiedy jest dla niego zastosowanie, robienie tego innymi metodami jest strzałem w kolana.

linki

ps. czemu nie w powerShell? bo siedzę tam, gdzie się teren jeszcze renderuje, i musiałem skleić coś na szybko. ale uh… trzeba będzie usiąść i do poweshella

n.

MDT

jutro będę prezentował MDT – pierwsza część prezentacji jest już dostępna w postaci artykułu (:

n.

UAC vs RunAs

w UAC dla w7 wprowadzono kilka zmian, które powodują, że na prawdę jest bardziej przyjazny [czyt. mniej wqrzający] – wyświetla dużo mniej komunikatów, dzięki czemu da się z nim lepiej żyć. osobiście, na swoim systemie i tak nie przekonałem się do tego mechanizmu, ale wynika to ze specyfiki tego, co na nim robię. na komputerze domowym, na którym pracuje end-user [ (; ] UAC jest włączony [Vista] i przy “normalnej” pracy fatycznie nie jest zbyt częstym gościem na ekranie.

UAC vs Run As

od zarania dziejów mam sporo pretensji do Microsoft o kilka decyzji – imho kluczowych, dotyczących kilku mechanizmów, które mogły być wprowadzone wraz wersją w2k – kiedy wprowadzane były tak drastyczne zmiany w całej koncepcji systemu. jedną z takich decyzji jest to, iż pierwszy zakładany użytkownik standardowo dodawany jest do grupy administratorów. pomimo wielkiego halo wokół bezpieczeństwa, zmiany myślenia przez emes i tak dalej… nie zmieniło się to w Vista [gdzie znów była szansa to zmienić] ani nie zmieni się to w w7. drogi były [co najmniej] dwie:

  • pierwszy użytkownik jest zwykłym userem, interfejs powinien być zmodyfikowany tak, aby tak gdzie dziś pojawia się “run as administrator” był faktycznie tym, co znaczy – linkiem do ‘run as’ z parametrem aplikacji. dzięki temu każdy użytkownik byłby standardowo wyizolowany, a niezbędne aplikacje uruchamiałyby się we własnym środowisku z maksymalnymi uprawnieniami dla komputera lokalnego
  • drugim scenariuszem jest wprowadzenie User Account Control. pokrótce czym jest UAC: mechanizm ten dodaje w całym systemie dodatkowy poziom bezpieczeństwa tzw. “integrity level” – zarówno dla plików, kluczy rejestrów czy procesów. dzięki temu dodawany jest dodatkowy poziom zabezpieczenia – poza autoryzacją niezbędny jest odpowiedni poziom integralności. pomimo, że poziomów takich jest więcej, wykorzystywane są 3 podstawowe – low,midim,high. System – pliki i procesy działają w “high”, użytkownik w “mid” a część aplikacji [np. przeglądarka w trybie IESC] w “low”. dzięki prostej zasadzie “nie masz praw do kogoś nadrzędnego” użytkownik – pomimo, że ma odpowiednie uprawnienia bo należy do grupy administratorów [a co za tym idzie – aplikacje z których korzysta], nie ma możliwości interakcji bezpośrednio z procesami/plikami systemowymi. jeśli proces próbuje się do nich dostać – pojawia się komunikat UAC z prośbą o autoryzację.

to tak w dużym skrócie, bo artów na temat UAC jest całkiem sporo – chociaż jeszcze kilka kwestii technicznych będę próbował poruszyć. pozostaje pytanie – które rozwiązanie jest lepsze, i dla czego emes zdecydował się na UAC?

Zalety i Wady RunAs

podstawową zaletą jest to, że nie wymagałoby to ingerencji w architekturę systemu – wykorzystanie tego mechanizmu sprowadzałoby się do dobrego zaprojektowania interfejsu [np. dodania możliwości zapamiętywania hasła, wygodnego zarządzania które aplikacje można tak uruchomić etc]. drugą zaletą – bardzo istotną ze względu na ogólne bezpieczeństwo jest fakt, że użytkownicy byliby realnie zmuszeni do wpisania jakiegoś hasła. z jednej strony mało wygodne, z drugiej strony dzięki temu każdy realnie by odczuł, że nie powinien czegoś robić, i musi wpisać jakieś hasło, a więc jest to faktycznie “coś niebezpiecznego”.

Wadą takiego rozwiązania jest trochę skomplikowania życia użytkownikowi – np. podczas instalacji systemu jest proszony o wprowadzenie hasła, a potem o założenie jeszcze jednego użytkownika. to jednak kwestia edukacji, odpowiedniej informacji i propagandy – która imho w przypadq UAC jest dużo trudniejsza i jak się okazuje – stała się jednym z bardziej znaczących gwoździ w trumnie dogorywającej “vista”.
jak się jednak okazuje poważniejszym problemem były same aplikacje. niestety liczna rzesza developerów nie dba o to dla kogo pisze aplikacje i nie jest świadoma faktu, iż od dawien dawna z komputera korzysta wielu userów, czy że system wprowadza pewne ograniczenia ze względu na bezpieczeństwo samego siebie – jak np. zakaz zapisywania w katalogu systemowym czy w program files. wiele aplikacji po prostu nie chce działać “na drugim” koncie. problemem w przeważającej mierze jest konieczność powtórnego uwierzytelnienia, działanie na innym tokenie, a w przypadq aplikacji np. wymagającej uprawnień w domenie, powstaje problem przekazania tokena zalogowanego usera. w końcu ‘run as’ to uruchomienie równoległej sesji, de facto zalogowanie się na innego użytkownika z innymi uprawnieniami – w tym przypadq, administratora lokalnego. tego aplikacje przeważnie nie przeżywają. żeby dobić ten pomysł pozostaje jeszcze fakt, iż podczas wykonywania ‘run as’ nie jest to dokładnie to samo, co zalogowanie się obok – nie jest ładowany/generowany pełny profil użytkownika, w kontekście którego uruchomiona zostanie aplikacja, i tego również część aplikacji nie przeżywa.

Zalety i Wady UAC

podstawową wadą UAC jest jego mała skuteczność – UAC wyświetla krótkie pytanie tak/nie i w zasadzie obserwując userów i rozmawiając z nimi – większość kieruje się zasadą “pozbądź się tego przerażającego okienka z pytaniem jak najszybciej” – co ono oznacza, o co pytało, o czym informowało? mało kogo obchodzi. użytkownicy i tak będą zatwierdzać “byle szybciej zniknęło”. jaki to daje poziom bezpieczeństwa?

pozostawiając jednak dylematy psychologiczne osobom, które się tym zajmują i prowadzą na pewno jakieś statystyki [których niestety nie znam – mogę tylko oceniać to, co sam obserwuję], warto się zastanowić nad potęgą jaką od strony technicznej, czyli przynajmniej teoretycznie, daje UAC.
podstawową działania mechanizmu jest przyznanie użytkownikowi dwóch tokenów – jego własnego, oraz administracyjnego. oczywiście dzieje się tak jeśli:

  • użytkownik należy do grupy administratorów
  • jest włączony UAC

dzięki temu user może pracować w poziomie integracyjnym “mid”, gdzie wszystko spokojnie działa i nie może nic popsuć w systemie, który “jest piętro wyżej”. jeśli natomiast uruchamia się coś, co w system musi zaingerować – np. źle napisana aplikacja, która próbuje coś pisać w katalogu systemowym, rejestruje jakieś biblioteki etc – wyświetla się okno z prośbą o świadome potwierdzenie, że aplikacja ta ma do tego prawo. po wyrażeniu zgody, przekazywany jest aplikacji token administracyjny, dzięki któremu może uruchomić się na wyższym poziomie integracyjnym. dzięki temu obchodzi się problem podwójnego uwierzytelnienia, ponieważ aplikacja de facto będzie mieć uprawnienia użytkownika ORAZ uprawnienia administratora lokalnego. do tego nie będzie generowany dodatkowy profil, nie będzie dodatkowego logowania w systemie.

aby zabezpieczyć się przed takimi aplikacjami, mechanizm wprowadza dodatkowe zabezpieczenie, które jest częścią UAC – wirtualizacja kluczy rejestru oraz aplikacji. jeśli aplikacja uruchamia się z podwyższonymi uprawnieniami, nie oznacza to, że może robić niedozwolone rzeczy, do których należy pisanie po kluczach HKLM, katalogu “program files” czy systemowym “windows”. dla tego system automatycznie przekierowuje takie żądania do wirtualnych odpowiedników – aplikacja myśli, że zapisała tam, gdzie chciała, dane są przechowywane obok – “wilk syty i owca cała”:

  • dla rejestru jest to klucz “HKEY_USERS< User SID >_ClassesVirtualStore
  • dla systemu jest to katalog "$env:USERPROFILEappdataLocalVirtualStore

uwaga! trzeba pamiętać, że po wyłączeniu
UAC aplikacje znów będą pisać/czytać z realnych katalogów i kluczy – może się więc okazać, że skonfigurowana i działająca aplikacja po włączeniu/wyłączeniu nagle jest ‘zresestowana’. należy wtedy ręcznie przenieść konfigurację ze/do wskazanych miejsc.

Dodatkowo “konto administratora” jest traktowane inaczej niż “konto z uprawnieniami administratora” – dzięki czemu po zalogowaniu się na administratora, ekrany UAC nie zatruwają pracy. zachowanie mechanizmu UAC można skonfigurować za pomocą GPO.

Płaszczyzna działania

ponieważ UAC był pod bardzo mocnym ostrzałem warto zastanowić się, jaki jest realny target tego mechanizmu, czyli “dla kogo ten pomysł”:

  • dotyczy to kont z uprawnieniami administratora a więc standardowo stacji domowych, nie należących do domeny
  • mechanizm ten jest łatwo wyłączyć jeśli przeszkadza – na prawdę nie rozumiem czemu duża część ludzi tak agresywnie reagowała. nie pasuje – wyłącz.
  • w kontekście sieci korporacyjnej jego zastosowanie jest dość niszowe – w końcu jeśli jakaś aplikacja bussiness-critical nie chce działać, wtedy można dodać usera do grupy administratorów lokalnych. czy to dobrze, że w ogóle można pozostaje kwestią sporną – z punktu widzenia bezpieczeństwa i wszelkich best-practices, to developer/firma powinna w swoim dobrym interesie aplikację poprawić. rzeczywistość jednak zmusza do kompromisów.

o co więc ten raban? cóż… nowości bolą, no i fajnie jest kopnąć giganta w kostkę q:

whoami

poziom integralności w jakim się działa, można sprawdzić wykorzystując polecenie “whoami /groups”. przy wyłączonym UAC lub po uruchomieniu konsoli ‘as administrator’ na liście pojawi się:

Mandatory LabelHigh Mandatory Level Label    S-1-16-12288

jeśli zaloguje się jako zwykły user, lub należący do grupy administracyjnej z włączonym UAC:

Mandatory LabelMedium Mandatory Level    S-1-16-8192

jeśli użytkownik zaloguje się jako “power user”:

<brak nazwy> S-1-16-8448

to właśnie jest różnica pomiędzy tokenami. jakie prawa systemowe ma user można sprawdzić przy pomocy “whoami /priv”.

ps. w Vista doszła jeszcze jedna zmiana – każda usługa ma własny SID dzięki czemu jest identyfikowalna w systemie. żeby sprawdzić SID usługi należy wykonać polecenie “sc showsid <service_name>”. bardzo ciekawie polecenie zachowuje się, kiedy poda się złą/nieistniejącą nazwę…

n.

Songbird

Jako posiadasz kilkudziesięciu gigabajtów muzyki na swoim dysku od dawna szukałem programu/biblioteki/odtwarzacza który pomoże mi tym wszystkim zarządzać. Testowałem sporo aplikacji (aimp2, winamp, foobar, jetplayer) i żadna nie przypadła mi do gustu pod względem zarządzania multimediami. Głównym powododem jest pewnie fakt, że powyższe aplikacje są/były pisane w pierwszej kolejności jako „grajki” z dodaną funkcją biblioteki. A ja potrzebowałem dokładnie czegoś odwrotnego.

Najbliższą aplikacją ideałowi był dla mnie Itunes (używam na Macu na PC nie testowałem) ze względu na prostotę, łatwość odnajdywania tego czego się chce oraz kwestię podejścia do multimediów. Niestety Itunes ma swoje wady a głowną z nich jest „siłowa” integracja z własnym sklepem.

Tak oto trafiłem na wyrób „itunsopodobny” czyli Songbird zrobiony przez ekipę Mozilla ze wsparciem byłych twórców Winampa.

Jak daje się od razu zauważyć cały interfejs jest wręcz klonem Itunsa (co jest zaletą) z możliwością rozszerzania możliwości programu za pomocą addonów (jak to w produktach Mozilli). I od razu muszę napisać, że to jest to czego szukałem – czyli w pierwszej kolejności jest to biblioteka plików audio a później player do nich.

Oczywiście przy korzystaniu z takiego programu trzeba zmienić zupełnie podejście do swojej kolekcji audio (przynajmniej ja musiałem zmienić) – wcześniej operowałem na katalogach a teraz na tagach – i muszę przyznać, że po około dwóch miesiącach używania nie wyobrażam sobie jak mógłbym już wrócić do archaicznego poruszania się po katalogach zamiast tagach.

Kilka słów o addonach:

Tak jak w przypadku Firefoxa tak i Songbird w „gołej” postaci oferuje podstawową funkcjonalność. Z addonów które wg mnie należy posiadać to:

Customize Filter Pane – do dodawania dodatkowych filtrów w głownym oknie (np chcemy przesortować tylko minimale które wyszły np. w 2009)

More of the Same –  słuchamy jakiegoś pojedynczego kawałka który nam się podoba – prawy klik i wybieramy czy chcemy  „więcej tego samego” z punktu widzenia płyty, artysty itp.

ShoutCast Radio – rewelacja! jak dla mnie nie można tego lepiej zrobić – cały shoutcast jest zorganizowany jak reszta biblioteki (wybieramy gatunek z listy i voila!)

Te trzy powyższe są wg mnie obowiązkowe – jest mnóstwo innych pluginów które można używać wg własnch potrzeb.

Oczywiście Songbird nie jest programem bez wad – główną wadą dla mnie jest brak globalnej normalizacji – można tylko z punktu widzenia albumu bądź pliku – nie ma globalnej. Kolejną wadą  jest brak odczytu plików .cue – można jeszcze parę mniej istotnych wad wymienić ale i tak ogólny obraz jest taki, że dla mnie jest to obecnie najlepszy program stworzony dokładnie do tego czego potrzebuję.