skrypt audytujący

zadanie – jak zaudytować komputery poza domeną tak, aby stwierdzić jakie są na nich aplikacje i jakie licencje? prostym zapytaniem WMI można dowiedzieć się, że wersja systemu to np. WinXP pro – ale OEM czy VLK?

nie udało mi się dotrzeć do samych linków na MSDN ale udało mi się zebrać te informacje. kilka ogólnych:

  • MAP toola nie da się użyć często ze względu na niedostępność komputerów a czasem credentiali. niestety takie środowiska są i to wcale nie tak rzadkie jakby się mogło wydawać…
  • wersję licencji OEM/VLK/MAK można wyciągnąć np. przy pomocy slmgr.vbs … ale tego nie ma na XP. poza tym lepiej mieć to we własnym skrypcie. kluczem jest „HKLM\SYSTEM\Setup\Pid”. w skrypcie poniżej pokazuję konkretne wartości.
  • można nawet dowiedzieć się jaka to wersja na podstawie innego klucza – ale pełnej listy nie mam.
  • korzystanie z metody Win32_product nie jest wskazane ponieważ każde takie odpytanie automatycznie uruchamia proces weryfikacji. trwa długo i może doprowadzić do dziwnych komunikatów – ogólnie wysypać się. dodatkowo – klasa PRODUCT nie jest standardowo instalowana na wersji XP /: trzeba ją oddzielnie dodać. lepiej skorzystać z zapytania do rejestru.
  • odpytując rejestr na 64 bitowej maszynie musimy zrobić dwa zapytania, zmieniając providera – inaczej dostaniemy tylko małą część aplikacji zainstalowanych.
  • do bardziej skomplikowanych operacji oraz bardziej wymyślny skrypt -> open audit

a poniżej kod. oczywiście w VBS ponieważ to jedyny 'standard’ który zadziała na każdej wersji od w2k aż po dzisiejsze w8.1

ON ERROR RESUME NEXT

Sub GetApps
  ' Use ExecMethod to call the GetStringValue method
  Set Inparams = objStdRegProv.Methods_("EnumKey").Inparameters
  Inparams.Hdefkey = HKLM
  Inparams.Ssubkeyname = "Software\Microsoft\Windows\CurrentVersion\Uninstall\"

  set Outparams = objStdRegProv.ExecMethod_("EnumKey", Inparams,,objCtx)

  For Each strSubKey In Outparams.snames

    Set Inparams = objStdRegProv.Methods_("GetStringValue").Inparameters
    Inparams.Hdefkey = HKLM
    Inparams.Ssubkeyname = strKey & strSubKey

    Inparams.Svaluename = "DisplayName"
    rkDisplayName=""
    set Outparams = objStdRegProv.ExecMethod_("GetStringValue", Inparams,,objCtx)
    if ("" & Outparams.sValue) <> "" then
      rkDisplayName=Outparams.SValue
    End iF

    Inparams.Svaluename = "Publisher"
    rkPublisher=""
    set Outparams = objStdRegProv.ExecMethod_("GetStringValue", Inparams,,objCtx)
    if ("" & Outparams.sValue) <> "" then
      rkPublisher=Outparams.SValue
    End iF

    'Set Inparams = objStdRegProv.Methods_("GetDWORDValue").Inparameters
    Inparams.Svaluename = "VersionMajor"
    rkVersionMajor=""
    set Outparams = objStdRegProv.ExecMethod_("GetDWORDValue", Inparams,,objCtx)
    if ("" & Outparams.uValue) <> "" then
      rkVersionMajor=Outparams.uValue
    End iF

    Inparams.Svaluename = "VersionMinor"
    rkVersionMinor=""
    set Outparams = objStdRegProv.ExecMethod_("GetDWORDValue", Inparams,,objCtx)
    if ("" & Outparams.uValue) <> "" then
      rkVersionMinor=Outparams.uValue
    End iF

    if rkDisplayName<>"" and inStr(lcase(rkDisplayName),"update")=0 and inStr(lcase(rkDisplayName),"hotfix")=0 then
      logFile.writeLine rkDisplayName&";"&rkPublisher&";"&rkVersionMajor&"."&rkVersionMinor
    end if

  next
end sub

function getPID
  set licTypes=CreateObject("Scripting.Dictionary")
  licTypes.add "007","retail"
  licTypes.add "011","upgrade"
  licTypes.add "OEM","OEM"
  licTypes.add "270","Volume License"
  licTypes.add "335","Retail"
  licTypes.add "640","Volume License"
  licTypes.add "648","Academic"
  set productIDs=CreateObject("Scripting.Dictionary")
  productIDs.add "007","VLK MAK"
  productIDs.add "033","Retail Windows 7 Home Premium"
  productIDs.add "049","VLK MAK"
  productIDs.add "050","Technet Plus Enterprise MAK"
  productIDs.add "065","Technet/MSDN/Bizspark Windows 7 Ultimate"
  productIDs.add "066","Technet/MSDN/Bizspark Windows 7 Ultimate"
  productIDs.add "067","Technet/MSDN/Bizspark Windows 7 Ultimate"
  productIDs.add "074","Retail Windows 7 Ultimate"
  productIDs.add "112","Retail Windows 7 Home Premium (conflicting info says MSDN)"
  productIDs.add "177","Retail Windows 7 Professional"
  productIDs.add "220","Technet/MSDN/Bizspark Windows 7 Professional"
  productIDs.add "230","Technet/MSDN/Bizspark Windows 7 Home Premium"
  productIDs.add "231","Technet/MSDN/Bizspark Windows 7 Home Premium"
  productIDs.add "292","Retail Windows 7 Ultimate?"
  productIDs.add "293","Retail Windows 7 Ultimate? (maybe Academic)"
  productIDs.add "339","Retail Windows 7 Home Basic"
  productIDs.add "838","Technet/MSDN/Bizspark Windows 7 Professional"
  productIDs.add "896","Retail Windows 7 Home Basic N"
  productIDs.add "929","Retail Windows 7 Home Basic E"
  productIDs.add "956","Retail Windows 7 Ultimate"

  Set Inparams = objStdRegProv.Methods_("GetStringValue").Inparameters
  Inparams.Ssubkeyname = "SYSTEM\Setup\Pid\"
  Inparams.Hdefkey = HKLM
  Inparams.Svaluename = "Pid"
  set Outparams = objStdRegProv.ExecMethod_("GetStringValue", Inparams,,objCtx)
  if ("" & Outparams.sValue) <> "" then
    rkPID=Outparams.SValue
  else
    rkPID="ERROR GETTING LICENCE TYPE"
  End iF
  for each lt in licTypes
    if strcomp(right(rkPID,3),lt)=0 then
      rkPID=rkPID&" "&licTypes.item(lt)
    end if
  next
  getPID=rkPID
end Function

sub runAddonScript
  logFile.writeLine vBCRLF&"RUNNING ADD-ON scripts.vbs"
  logFile.Close
  INV_SCRIPT = tpath&"\inw.cmd"
  set invScript=fso.CreateTextFile(INV_SCRIPT)

  if not isNull(runVBS) then invScript.writeLine runVBS
  if not isNull(runOffice) then invScript.writeLine runOffice

  invScript.close
  oShell.run INV_SCRIPT,7,true
  fso.DeleteFile INV_SCRIPT
end sub

Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE
strComputer = "."
strKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"

set fso=CreateObject("Scripting.FileSystemObject")
set oShell=CreateObject("WScript.Shell")
set oEnv=oShell.environment("process")
set oNet=WScript.CreateObject("WScript.Network")
set computerInfo=CreateObject("Scripting.Dictionary")
set softwareInfo=CreateObject("Scripting.Dictionary")

'LOG FILE'
tpath=oEnv.item("userprofile")
LOGFILE_NAME = tpath&"\"&oNet.computerName&"-inventory.log"
set logFile=fso.CreateTextFile(LOGFILE_NAME)

logfile.writeLine "USER INFO"
logFile.writeLine oNet.userdomain&";"&oNet.username&vbCrLf

'INVENTARYZACJA hardware'
logFile.writeLine "HARDWARE INFO"&vbCrLf
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
if err.number<>0 then
  logFile.writeLine "error opening WMI "&cstr(hex(err.number))
  finish
end if

'get processor architecture
vArch=oEnv("PROCESSOR_ARCHITECTURE")
logFile.writeLine "Architecture;"&vArch
Set colItems = objWMIService.ExecQuery("Select caption, domain, manufacturer, model, name, numberofprocessors, roles, totalphysicalmemory from Win32_ComputerSystem",,48)
For Each objItem in colItems
    computerInfo.add "name", objItem.Name
    computerInfo.add "domain",objItem.Domain
    computerInfo.add "manufacturer",objItem.Manufacturer
    computerInfo.add "model",objItem.Model
    computerInfo.add "numberOfProcessors",objItem.NumberOfProcessors
    computerInfo.add "roles", join(objItem.roles,", ")
    computerInfo.add "totalPhysicalMemory",cstr( formatnumber( cdbl(objItem.TotalPhysicalMemory)/1024/1024,0) )&" MB"
Next
set colItems = objWMIService.ExecQuery("select SerialNumber from Win32_SystemEnclosure")
For Each objItem in colItems
  computerInfo.add "SerialNumber",objItem.SerialNumber
next
Set colItems = objWMIService.ExecQuery("select otherTypeDescription, buildnumber, caption, csdversion, systemdirectory, systemdrive from Win32_OperatingSystem")
For Each objItem in colItems
  computerInfo.add "caption",objItem.caption&" "&objItem.otherTypeDescription&" "&objItem.CSDVersion
  computerInfo.add "buildnumber",objItem.buildNumber
  computerInfo.add "SystemDrive",objItem.SystemDrive
  computerInfo.add "SystemDirectory",objItem.SystemDirectory
next

for each ci in computerInfo
  logFile.writeLine ci & ";" & computerInfo.item(ci)
next
logFile.writeLine

'INVENTARYZAJCA SOFTWARE'

logFile.writeline "Installed Applications" & VbCrLf
logFile.writeLine "Display Name;Publisher;Version"
err.clear
Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
objCtx.Add "__ProviderArchitecture", 32
objCtx.Add "__RequiredArchitecture", TRUE
Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
Set objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx)
Set objStdRegProv = objServices.Get("StdRegProv")
if err.number<>0 then
  logFile.writeLine "error getting registry "&cstr(hex(err.number))
  finish
end if

getApps

if instr(vArch,"64")>1 then
  objCtx.Add "__ProviderArchitecture", 64
  objCtx.Add "__RequiredArchitecture", TRUE
  Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
  Set objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx)
  Set objStdRegProv = objServices.Get("StdRegProv")
  getApps
end if

logFile.writeLine "WINDOWS LICENCE TYPE: "&getPID

'prepare to launch slmgr'
runOffice=null
runVBS=null
if fso.FileExists("C:\Windows\system32\slmgr.vbs") then runVBS="cscript C:\Windows\system32\slmgr.vbs /dlv >>"&LOGFILE_NAME

voffice="C:\Program Files (x86)\Microsoft Office\Office15\ospp.vbs"
if fso.FileExists(voffice) then
   runOffice= """"&voffice&""" /dstatus >>"&LOGFILE_NAME
end if
voffice="C:\Program Files\Microsoft Office\Office15\ospp.vbs"
if fso.FileExists(voffice) then
   runOffice= """"&voffice&""" /dstatus >>"&LOGFILE_NAME
end if
voffice="C:\Program Files (x86)\Microsoft Office\Office14\ospp.vbs"
if fso.FileExists(voffice) then
   runOffice= """"&voffice&""" /dstatus >>"&LOGFILE_NAME
end if
voffice="C:\Program Files\Microsoft Office\Office14\ospp.vbs"
if fso.FileExists(voffice) then
   runOffice= "cscript """&voffice&""" /dstatus >>"&LOGFILE_NAME
end if

if not isNull(runVBS) or not isNull(runOffice) then
  runAddonScript
end if

eN.

Przenieś/Kopiuj do folderu…

Opcja bardzo przydatna i niedostępna domyślnie w windowsach.

przen

Ku pamięci zapisuję, może ktoś jeszcze skorzysta :)

W drzewie HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\ContextMenuHandlers

Dla „kopiowania” dodajemy klucz o nazwie „kopiuj do” i wartości domyślnej

{C2FBB630-2971-11D1-A18C-00C04FD75D13}

Dla „przenoszenia dodajemy klucz o nazwie „przenies do” i wartości domyślnej

{C2FBB631-2971-11D1-A18C-00C04FD75D13}

Wartości przepisujemy/kopiujemy razem z nawiasami klamrowymi jako jeden ciąg znaków!

Załączam gotowe pliki .reg dla leniwych lub nietechnicznych -> copyto_moveto

Po rozpakowaniu wystarczy je uruchomić i zatwierdzić.

 

 

 

ograniczenia Storage Spaces

artykuły dotyczące funkcjonalności są zazwyczaj mieszaniną zachwytu oraz wizji jak to teraz będzie cudownie. można się z nich dowiedzieć że coś jest i mniej-więcej o co cho, niemniej pod względem wartości – są tylko wstępem do rzeczy całej. dla tego najbardziej lubię arty krytykanckie [ale nie hejterskie!], ponieważ to w nich odnajduje się ostrzeżenia, ograniczenia, potencjalne problemy czy nieobsługiwane scenariusze. nawiązując zatem do trendu kilka rzeczy, na które należy zwrócić uwagę przy korzystaniu z SS.

limity i inne takie

  • SS pozwala na założenie volumenu logicznego o wartości przekraczającej dostępną wielkość fizyczną. [nie testowałem, ale ponoć] jest w bug w SS, w wyniq którego przy osiąganiu górnych limitów zużycie CPU peakuje a dostęp się zawiesza. generalnie uważam, że tworzenie dysq logicznego większego niż fizyczna przestrzeń w produkcji, to strzał w kolano. zawsze można potem łatwo zrobić 'extend’ więc po co tak ryzykować? bo przecież…
  • …kiedy przestrzeń kończy się na dyskach fizycznych, volumen SS jest wyłączany.
  • po wybraniu trybu działania volumenu [single/mirror/parity] – ustawienia nie da się zmienić. w sumie to normalne dla każdego RAIDu… inne zasady dotyczące odzyskiwania/przenoszenia danych na fizycznych dyskach również obowiązują – nie da się wyjąć pojedynczego dysq i z niego coś odczytać. cały system działa na poziomie 'block level’ i dane są rozdystrybuowane na wszystkie dyski.
  • jeśli wybierze się tryb 'mirror’, a wielkości dysqw nie są takie same, to traci się całą pozostałą przestrzeń. mirror wymaga równych kawałków, a więc jeśli mamy pool z 3 dysqw – 5,1o i 2o GB, to fizycznie będzie to RAID na 3x5GB [no… trochę kłamię – szczegóły w FAQ]. dla użytkownika de facto będzie jeszcze mniej, bo odpadają parzystości. jedną z najistotniejszych rzeczy, o których należy pamiętać w pracy z SS jest właśnie fakt, że pod spodem działają normalne algorytmy wyliczania parzystości znane z RAID. w związq z tym ustalając maxymalną wielkość volumenu logicznego należy pamiętać o tym, że fizycznie to nie jest prosta suma dostępnych dysków fizycznych. IMHO to spory ból, że nie ma dostępnego jakiegoś kalqlatora podczas tworzenia volumenu [jest w w8 a nie ma w w12 /: ], który pokazuje max fizycznej dostępnej wielkości… szczerze powiedziawszy to nie wiem jak to w ogóle sprawdzić na serwerze O_o
  • minimalną wielkością dysq obsługiwaną przez SS jest 4GB
  • cluster nie obsługuje SS fizycznych RAIDów – pool musi być utworzony z fizycznie podłączonych dysków SAS, wyłącznie z fixed provisioning i tryb parzystości mirror lub simple [nie obsługuje parity]
  • braqje sensownego systemu notyfikacji…

kilka fajnych zmian pojawia się w wersji R2 – zwłaszcza Automatic Tiering. niemniej powyższe ograniczenia zostają.

ot taka ciekawostka na koniec – próba skopiowania pliq na volumen, który fizycznie już nie ma miejsca:

 

#REFS

eN.

the trust relationship between this workstation and the primary domain failed

dość standardowy komunikat – zwłaszcza na maszynach wirtualnych. snapshotowanie czy po prostu długo uśpione maszyny – w takich przypadkach hasła często desynchronizują się z a AD. do tej pory wykorzystywanym rozwiązaniem było wyrzucenie i dodanie maszyny z powrotem do domeny. ciekawostka, która mnie zawsze intrygowała to opcja 'reset password’ na obiekcie komputera w ADUaC. opcja, która teoretycznie powinna wymusić synchronizację hasła. jakoś nigdy mi to nie zadziałało, choć są tacy, którzy twierdzą, że to się zdarza O_o?

tymczasem w powershell v3.o pojawiało się polecenie pozwalające na synchronizację hasła: Reset-ComputerMachinePassword.

zgodnie z zasadą 'człowiek uczy się całe życie’ okazuje się, że taka funkcjonalność była dostępna od dawna… z poleceniem ’netdom resetpwd’ /:

temat trafił na mnie przypadkiem więc póki co nie testowałem żadnej z powyższych – dwa najważniejsze pytania to czy obie działają i czy konieczny jest restart? do sprawdzenia.

a to KB powinno zostać zmodyfikowane: KB162797

eN.

VMConnect

niedawno pisałem o tym, co można zrobić z hosta maszynie wirtualnej. przy okazji dalszych poszukiwań poczytałem sobie o VMConnect.exe – czyli jak w zasadzie działa zdalny pulpit to VM? najciekawsze jest,  że jest to zdalny pulpit – ale przecież można się połączyć zanim w ogóle wystartuje system. po zainstalowaniu RSAT dla Hv vmconnect znajduje się w „C:\Program Files\Hyper-V” i można pobawić się z linii poleceń. wymagane są dwa paramtry: nazwa hosta oraz maszyny wirtualnej, przy czym nazwa VM może być w postaci nazwy lub VMID. kilka ciekawostek o VMConnect i PS można przeczytać tutaj.

pozostaje jeszcze jedna ciekawostka – na Hyper-v Server nie ma GUI i nie ma VMConnect. ciekawszym scenariuszem jest zarządzanie z Linuxa… okazuje się, że na codeplexie jest alternatywa – FreeRDP.

eN.

 

Przyspieszyć IIS

Zabieram się do tego artykułu jak pies do jeża chyba więc prościej będzie wrzucać treść na raty…

Problem:
Zmieniam coś w konfiguracji lub podmieniam coś w aplikacji webowej. Wykonuję iisreset. Pierwsze użycie stronki trwa wieki. Nieważne czy jest to Sharepoint czy prosta witryna z gołą babą. Uruchamianie worker procesów, kompilowanie aplikacji, sprawdzenie certyfikatów a raczej CRLi … to wszystko zabiera nam cenne sekundy. Do tego Application poole mają swoje czasy uśpienia i recycling co powoduje, że przy braku użytkowników, strona znowu usypia… Przy rzadko odwiedzanych stronach generalnie mamy wrażenie że coś jest nie tak i za każdym razem musimy czekać nawet dwie minuty by zobaczyć efekt końcowy. Jak z tym walczyć? No jest kila trików, między innymi „warm up” skrypty w PS używane od lat przez Microsoft przy prezentacjach Sharepointów… Nie opisze tutaj wszystkich sztuczek a jedynie podam prosty sposób na  automatyczne wymuszenie uruchomienia application poola czyli uruchomienia worker procesu na IIS. Bez zaawansowanych skryptów i potrzeby wnikliwego analizowania swojej aplikacji.

Rozwiązanie:
Narzędzie stworzone do IIS 8 dostępne dla IIS 7.5 o nazwie Application Initialization
Użycie banalne, składające się z dwóch kroków.

  1. Instalacja Application Initialization
    1. Uruchom appwarmup_x64.msi
    2. Zrestartuj server
  1. Wybierz który application pool ma być zawsze uruchomiony
    1. Uruchom CMD jako Administrator
    1. Przejdź do lokalizacji c:\Windows\system32\inetsrv\
  1. Przykładowo dla DefaultAppPool uruchom
    appcmd.exe set apppool „DefaultAppPool” /startMode:AlwaysRunning

W ramach sprawdzenia możesz zrobić iisreset i zobaczyć że na liście Worker processów pojawi się DefaultAppPool pomimo braku wywołania strony.

Generalnie wypróbujcie to w domu, u mnie 120 sekund do przodu ;)

moje pięć groszy o w8.1

preview jest od kilq dni i wpisów dot. w8.1. jest od groma. serwera nie miałem czasu niestety potestować – zdołałem jedynie pobawić się wersją kliencką. przez najbliższe 3 tyg będę poza zasięgiem dobrodziejstw techniki więc o tej wersji skrobnę dopiero w sierpniu. a co z klientem?

po pierwsze wcale nie łatwo jest znaleźć jakiś sensowny dokument opisujący dokładne zmiany w szczegółach. zazwyczaj publikowany jest doqment aka „changes in functionality” – póki znalazłem tylko wersję dla devów, która bardziej sqpia się API oraz ogólny opis obszaru zmian. najwięcej oczywiście zmieniło się dla kafelkowców… ale to póki co poza moim zainteresowaniem.

instalacja

najpierw spróbowałem zainstalować na lapq z w8 pro. po zainstalowaniu całości i przy pierwszym uruchomieniu zobaczyłem blue screen i instalacja została wycofana. nie miałem czasu dochodzić przyczyny w każdym razie wersja preview to właśnie pro i przy takiej instalacji dostępna jest opcja inplace upgrade – czyli instalator zachowuje wszystkie aplikacje i sterowniki. jak widać kompatybilność nie jest 1oo%.

podjąłem ryzyko upgrade’u na lapq w domenie z w8 ent. przy takiej instalacji najbardziej przypominająca upgrade opcja to 'zachowaj ustawienia użytkownika’. jest to de facto świeża instalacja z zachowaniem profilu usera. przy takiej instalacji system wstał bez problemu, niestety musiałem od początq instalować wszystkie aplikacje ):

pierwsze wrażenie

GUI

takie zupełnie pierwsze to kolorowa rybka zamiast niebieskich kwadracików (; szkoda, że to koniec zmian w estetyce [a sama rybka ma zniknąć z finala] i nadal wszystko oparte jest modernistycznych prymitywach na bazie prostokąta. dzięki włączeniu kilq drobiazgów jak boot to desktop, opcji shutdown dostępnej z desktopa, priorytetyzacji aplikacji desktopowych przy wyszukiwaniu itp system stał się trochę bardziej przyjazny dla użytkownika workstacji.

niewiarygodne jest jak niewiele trzeba było… polityka pozostanie dla mnie zagadką. oczywiście menu start nie wróciło – w zmian są kafelki, niemniej znów jest pojedynczy search [alleluja!]. opinii co do kafelków na nie-dotykowych systemach nie zmienię, niemniej trzeba przyznać, że jest dużo lepiej.

SkyDrive

w8 jest imho wersją beta puszczoną publicznie. to widać w wielu aspektach na interfejsie poczynając, a na aplikacjach kończąc. skydrive był jedną z takich właśnie aplikacji, reklamowany jako 'bulit-in feature’. tyle, że wersja bulit-in, czyli kafelkowa, nie miała związq z desktopową – była zwykłą nakładką na IE, dzięki której wyświetlała się strona skydrive. teraz wersje połączyły się w jedno – nie ma już desktopowej, ale kafelkowa w końcu robi synchronizację na dysk lokalny, dzięki czemu można normalnie z niej korzystać. wiąże się to z kilkoma ułomnościami.. tfu nowym podejściem (; np. aby skorzystać ze SD trzeba koniecznie zarejestrować w systemie konto Live i zlinkować je z tym, które używa się jako systemowe [u mnie to domenowe]. poprzednio takiej operacji nie trzeba było wykonywać, bo aplikacja desktopowa SD po prostu przechowywała credsy do połączenia…

PowerShell 4.o

jest nowy PS w wersji 4.o. pojawiło się sporo nowych commandletów , trochę został rozszerzony [link na końcu] – niemniej nie jestem pewien czy zasługuje na zmianę major number. zauważyłem, że od jakiegoś czasu firmy prześcigają się w numeracji produktów [mistrzem w tej dziedzinie jest mozilla FF] więc patrzenie na numer wersji jest coraz mniej znaczące.

inne imho ciekawe

co z innych ciekawostek? nie miałem czasu potestować ale smacznie zapowiadają się:

  • rozbudowany interfejs open MDM
  • workplace join i work folders
  • iexplore 11 … nie jestem pewien ale chyba desktop i kafelkowy działa z tego samego procesu [wspólny cache? wspólna historia?]

w skrócie

jest lepiej. ciśnienie zostało upuszczone (;
ciekaw jestem czy nadejdzie jeszcze renesans w kwestii interfejsu i estetyki…

refs

bardziej szczegółowe opisy 'what’s new in windows 8.1 preview’:

eN.