Menu kategorii
  • Aktywacja z wykorzystaniem skryptów

    Aktywacja z wykorzystaniem skryptów

     Microsoft
    Microsoft
    00:00
    04.04.2006
    9351 wyświetlenie

    Administratorzy mogą preferować aktywowanie systemu Windows XP u użytkowników po konfiguracji, z wykorzystaniem skryptów zawierających linie poleceń. (Nośniki Volume Licensing nie wymagają aktywacji, o czym już wspominaliśmy).

    Można tak całkowicie zautomatyzować proces aktywacji, że podłączeni użytkownicy nie będą zupełnie wiedzieć o jego przebiegu. Dzięki WPA możemy:

    • Tworzyć kwerendy dotyczące właściwości związanych z aktywacją
    • Ustawiać nowe klucze produktów
    • Dawać polecenie aktywacji

    Do tego celu oferowane są dwie podstawowe klasy obiektów:

    • Win32_WindowsProductActivation zawiera wspomniane wyżej funkcje.
    • Klasa Win32_Proxy jest używana do tworzenia kwerend oraz konfiguracji ustawień proxy.

    Uwaga: Szczegółowe informacje na temat wspomnianych powyżej klas, jak również błędów oznaczonych, zą zawarte w platformie SDK , o której mowa poniżej w sekcji Przydatne Adresy.

    Przykładowe skrypty Visual Basic
    W dalszej części przedstawiono - celem przypomnienia - przykładowe skrypty (.vbs) języka Visual Basic (VB), które ilustrują metody zastosowania narzędzi skryptujących WPA.

    Uwaga: Wspomniane skrypty zostały sformatowane ze względu na ich czytelność. Aby nadać im prostą formę pominięto tu kod obsługi błędów, który jednak powinien znaleźć się w skryptach produkcyjnych.

    win32_WindowsProductActivation-Properties
    Zamieszczony poniżej wydruk kodu Listing2 to prosty skrypt VB, przedstawiający wszystkie właściwości obsługiwane przez klasę win32_WindowsProductActivation dla danej maszyny. Możemy wykonać ten skrypt (z pominięciem pustych przestrzeni dodanych dla lepszej czytelności) przy pomocy "Cscript wpa_properties.vbs" dla trybu tekstowego, lub "Wscript wpa_properties.vbs" w wypadku okien.

    Listing2 - wpa_properties.vbs
    for each Obj in GetObject("winmgmts:{impersonationLevel=impersonate}").
    InstancesOf ("win32_WindowsProductActivation")
    WScript.Echo
    Obj.ServerName,
    Obj.ProductID,
    Obj.ActivationRequired,
    Obj.RemainingGracePeriod,
    Obj.RemainingEvaluationPeriod
    next

    Platforma SDK zawiera wszelkie szczegóły dotyczące tych właściwości.

    win32_WindowsProductActivation-Properties
    Poniższe opisy są streszczeniem każdej z właściwości, wspomnianej powyżej w wydruku Listing2, i oferują przydatne informacje dotyczące instalacji:

    • ServerName w sposób jednoznaczny identyfikuje komputer. Wartość ta to jego w pełni kwalifikowana nazwa domeny (FQDN) lub jego adres IP.
    • ProductID (PID) zawiera dziewięciocyfrowy sekwencyjny numer, sssssssss, wyprowadzony z klucza produktu, jakiego użyto do instalacji systemu. Ma on format xxxxx-sss-ssssssx-xxxxx dla wszyskich systemów z wyjątkiem OEM - w tym wypadku wygląda on następująco: xxxxx-OEM-xxssssx-sssss. PID komputera można również zobaczyć klikając na Start, Control Panel, System i sprawdzając poniżej Registered To: pod zakładką General.
    • ActivationRequired jest 1 (prawda), jeśli komputer musi być uaktywniony w okresie wskazanym jako RemainingGracePeriod. W przeciwnym wypadku wartość jest 0 (fałsz).
    • RemainingEvaluationPeriod ma znaczenie jedynie w wypadku nośników beta oraz testowych, i oznacza liczbę dni pozostałych do testowania. W innych warunkach posiada on największą wartość całkowitą (2147483647).

    win32_WindowsProductActivation-SetProductKey
    Zalecaną metodą wielokrotnej (hurtowej) instalacji systemów, które wymagają aktywacji, jest dodanie ogólnego klucza produktu firmy Microsoft do pliku odpowiedzi w trakcie konfiguracji systemu. (Zobacz Ogólne Klucze Produktów poniżej). Ten tymczasowy klucz nie może być wykorzystany do aktywacji komputera I musi zostać zastąpiony każdorazowo indywidualnym kluczem produktowym zanim wygaśnie okres przeznaczony na aktywację. Klasa win32_WindowsProductActivation oferuje metodę SetProductKey w celu ustawienia klucza danego komputera.

    Jak stwierdzić, czy klucz produktu powinien zostać zmieniony
    Aby ustalić, czy użyty do zainstalowania komputera klucz produktowy był kluczem ogólnym, i czy w związku z tym musi być zmieniony, możemy skorzystać z właściwości ProductID. Nastepuje wówczas porównanie numeru sekwencyjnego ProductID z numerem sekwencyjnym ogólnego klucza produktu. Funkcja Mid() wydziela numer sekwencyjny I porównuje do ze swoją własną wartością.

    Skrypt ten na ogół wykonuje się jako część skryptu logowania każdej maszyny. Przedstawiony poniżej wydruk kodu Listing3 stanowi przykład takiego postępowania poprzez użycie ogólnego klucza produktu beta oraz odpowiadającego mu numeru sekwencyjnego - przykład ten ma wyłącznie charakter poglądowy I odnosi się jedynie do wersji innych niż OEM.

    W sekcji Ogólne klucze produktów poniżej znajdują się właściwe klucze oraz odpowiednie numery sekwencyjne dla różnych instalacji.

    Uwaga: Po to, aby podany w wydruku Listing3 klucz wpa_productkey.vbs spełnił swoją funkcję, musimy najpierw utworzyć swego rodzaju bazę kluczy produktowych dla wszystkich komputerów, jakie mamy zamiar zainstalować, oraz opracować metodę pozyskiwania każdego klucza w miarę potrzeb. Ta operacja nie leży w polu zainsteresowań niniejszej publikacji.

    Jak działa skrypt wpa_productkey.vbs

    • Listing 3 otwiera dla systemu instancję klasy win32_WindowsProductActivation.
    • Następnie kieruje zapytania o jego ProductID, wydziela numer sekwencyjny i porównuje go z wartością ogólną.
    • Jeśli numery różnią się od siebie oznacza to, że klucz produktu został już zmieniony i nie potrzebne są dalsze działania.
    • Jeśli numery są takie same, specyficzny dla maszyny klucz produktowy jest pozyskiwany za pomocą GetMyProductKey (jest to funkcja pochodząca od klienta) a następnie instalowany na maszynie docelowej przy użyciu metody SetProductKey.

    Listing3-wpa_productkey.vbs
    'blocked genericProdKey = "PXRQ3-7VPMV-CQWXR-8Y4KX-RD786"
    const genericSeqNum = "010-053298"
    myProdKey = "xxxxx-xxxxx-xxxxx-xxxxx-xxxxx"
    ' must be replaced with user's unique PK
    for each Obj in GetObject("winmgmts:{impersonationLevel=impersonate}").
    InstancesOf ("win32_WindowsProductActivation")
    'Does PID's sequence number match generic value?
    If Mid(Obj.ProductID, 7, 10) = genericSeqNum Then
    'Sequence numbers match:
    ' Get new Product Key from database
    ' user-provided method:
    ' myProdKey = GetMyProductKey()
    'Set machine-specific product key
    Obj.SetProductKey(myProdKey)
    end if
    next

    win32_WindowsProductActivation-ActivateOnline
    Metoda ActivateOnline umożliwia aktywację maszyny, która posiada dostęp do Internetu. Odpowiada ona metodzie aktywacyjnej za pośrednictwem Internetu w ręcznym interfejsie użytkownika, I korzysta z protokołu HTTPS do komunikacji z serwerem centrali Microsoft. Jeśli jest to konieczne, powinniśmy najpierw użyć opisanej poniżej metody win32_Proxy SetProxySetting, w celu nawiązania połączenie poprzez.

    Jak działa skrypt wpa_activateonline.vbs
    Program z wyduku 4 na ogół powinien być wykonywany jako fragment skryptu logowania każdej maszyny.

    • Najpierw kierowane jest zapytanie o właściwość obiektu ActivationRequired.
    • Jeśli maszyna była już uaktywniona, nie potrzebne są dalsze działania.
    • W innym wypadku, skrypt wywołuje metodę ActivateOnline.

    Listing 4 - wpa_activateonline.vbs
    for each Obj in GetObject("winmgmts:{impersonationLevel=impersonate}").
    InstancesOf ("win32_WindowsProductActivation")
    if Obj.ActivationRequired <> 0 then
    'If necessary, save/set proxy
    Obj.ActivateOnline()
    'If necessary, restore proxy
    end if
    next

    win32_WindowsProductActivation-ActivateOffline
    W celu uaktywnienia maszyn, które nie są podłączone do Internetu, należy wykonać szereg działań. Są one odpowiednikiem telefonicznej procedury aktywacji, dostępnej w interfejsie użytkownika.

    Aktywacja maszyn nie podłączonych do Internetu
    W celu uaktywnienia maszyny, która nie jest połączona z Internetem, należy wykonać następujące działania:

    • Uzyskać InstallationID za pośrednictwem metody GetInstallationID.
    • Zatelefonować do centrum aktywacji firmy Microsoft w celu uzyskania odpowiedniego ConfirmationID.
    • Przekazać maszynie ConfirmationID, korzystając z metody ActivateOffline.

    Telefon do centrum aktywacji, odczytanie Installation ID, oraz uzyskanie ConfirmationID to działania manualne, dla których nie istnieją jak dotąd odpowiedniki automatyczne. Najlepszym wyjściem jest telefonowanie do centrum co jakiś czas, gdy znamy możliwie jak najwięcej identyfikatorów InstallationID. Należy najpierw sprawdzić - korzystając z manualnego interfejsu użytkownika - właściwy dla naszego kraju numer do centrum aktywacji.

    Przedstawiony poniżej wydruk kodu Listing 5 ilustruje zastosowanie metody GetInstallationID. Przy każdym wywołaniu pokazywany jest unikalny ciąg znaków InstallationID z parametru myIID.

    Listing 5-wpa_getIID.vbs
    for each Obj in GetObject("winmgmts:{impersonationLevel=impersonate}").
    InstancesOf ("win32_WindowsProductActivation")
    if Obj.ActivationRequired <> 0 then
    result = Obj.GetInstallationID(myIID)
    WScript.Echo "InstallationID = " & myIID
    end if
    next

    Listing 6-wpa_ActivateOffline.vbs
    Listing 6 to program zakończenia aktywacji w trybie bez podłączenia do Internetu.
    myConfID="012345678901234567890123456789012345678901"
    for each Obj in GetObject("winmgmts:{impersonationLevel=impersonate}").
    InstancesOf ("win32_WindowsProductActivation")
    result = Obj.ActivateOffline (myConfID)
    next

    Co może udareminić aktywację offline
    Aktywacja offline przy użyciu identyfikatora ConfirmationID w odpowiedzi na wywołanie metody GetInstallationID() nie uda się jeśli:

    • Istnieje kilka nakładających się na siebie wywołań GetInstallationID().
    • Użyto kreatora aktywacji telefonicznej.
    • Nakładają się na siebie interaktywne logi, w tym Remote Administration oraz Remote
    • Desktop lub poprzez Terminal Services.

    win32_Proxy-Properties
    Klasa obiektów win32_Proxy służy do pobrania aktualnego ustawienia proxy dla kontekstu, w jakim jest wykonywany, jak również do przestawiania serwera i portu proxy na nową wartość. Jeśli zamierzamy skorzystać z metody ActivateOnline programu WPA w celu uaktywnienia maszyny podłączonej do Internetu poprzez firewall, musimy najpierw skonfigurować jej proxy. Zanim to zrobimy, należy wydobyć I zapisać aktualną wartość proxy, w celu jej przywrócenia po zakończonej całej operacji.

    Wydruk Listing 7 poniżej ilustruje sposób wyszukiwania aktualnej nazwy I portu serwera proxy.

    Listing 7 - wpa_GetProxy.vbs
    for each Obj in GetObject("winmgmts:{impersonationLevel=impersonate}").
    InstancesOf ("win32_Proxy")
    WScript.Echo
    Obj.ProxyServer,
    Obj.ProxyPortNumber
    next

    win32_Proxy-SetProxySetting
    Metoda SetProxySetting jest używana w celu przestawienia portu I serwera proxy na nową wartość w kontekście nowych warunków funkcjonowania. Przedstawiony poniżej wydruk Listing 8 pokazuje sposób ustawiania proxy:

    Listing 8 - wpa_SetProxy.vbs
    myProxyServer="myproxy"
    myProxyPort=80
    for each Obj in GetObject("winmgmts:{impersonationLevel=impersonate}").
    InstancesOf ("win32_Proxy")
    result = Obj.SetProxySetting(myProxyServer,myProxyPort)
    end if
    next

    Podsumowanie

    Poniżej przedstawiony przykładowy skrypt (WPA_Automation.vbs) pokazuje, jak uaktywnić maszynę w trybie online z poziomu skryptu logowania. W przykładzie tym założono, że maszyna została wstępnie skonfigurowana przy pomocy ogólnego klucza produktu.

    Jak działa WPA_Automation.vbs

    Jeśli maszyna została wstępnie skonfigurowana przy użyciu ogólnego klucza produktu, skrypt WPA_Automation.vbs wykonuje następujące działania:

    • Zamienia zastosowany klucz na inny, specyficzny dla danej maszyny, uzyskany poprzez wywołanie podanej przez klienta funkcji GetProductKey().
    • Decyduje, czy maszyna musi być aktywowana.
    • Jeśli aktywacja jest potrzebna, zapisuje aktualne ustawienia proxy, zamienia je na żądane, aktywuje maszynę, a następnie przywraca oryginalne proxy.

    WPA_Automation.vbs-Skrypt przykładowy
    '***************************************************************
    '
    ' WMI Sample Script WPA_Automation.vbs (VBScript)
    '
    ' This script demonstrates Windows Product Activation automation
    '
    ' if current PID is the generic PID (blocked at clearinghouse)
    ' get machine-specific product key from database
    ' (not included here)
    ' call SetProductKey method
    '
    ' if activation is required (not activated yet)
    ' save existing proxy setting
    ' set proxy
    ' call ActivateOnline method
    ' restore saved proxy setting
    '
    '***************************************************************
    ON ERROR RESUME NEXT

    productKey = "xxxxx-xxxxx-xxxxx-xxxxx-xxxxx"
    'must be replaced with user's unique PK
    'blocked genericPK = "PXRQ3-7VPMV-CQWXR-8Y4KX-RD786"
    const seqNumber = "010-053298"
    'part of PID, derived from genericPK

    actvProxyServer = "proxy" 'replace with values appropriate
    actvProxyPort = "80" 'to the customer environment


    For Each wpaObj In GetObject("winmgmts:{impersonationLevel=impersonate}").
    InstancesOf ("win32_WindowsProductActivation")

    'Set new Product Key if the current PID's
    'Sequence Number matches the global PID (once only)

    If Mid(wpaObj.ProductID, 7, 10) = seqNumber Then
    WScript.Echo "Sequence Numbers match!"

    'Sequence Numbers match: get new Product Key from database

    'Get new Product Key from database
    productKey = GetProductKey()
    WScript.Echo "Product Key: " & productKey

    'Set new Product Key

    result = wpaObj.SetProductKey(productKey)
    WScript.Echo "SetProductKey() returned = " & result

    If err <> 0 Then
    WScript.Echo Err.Description, "0x" & Hex(Err.Number)
    Halt
    End If
    End If ' ProductKey check/set


    'If not yet activated, set proxy and activate the machine

    If wpaObj.ActivationRequired <> 0 Then

    serverName = wpaObj.ServerName
    WScript.Echo "ActivationRequired for " & serverName

    'Set proxy. First save existing proxy for later

    For Each proxyObj In
    GetObject("winmgmts:{impersonationLevel=impersonate}").
    InstancesOf ("win32_Proxy")
    savedProxyServer = proxyObj.ProxyServer
    savedProxyPort = proxyObj.ProxyPortNumber
    WScript.Echo "Saved Proxy: " & savedProxyServer &
    ":" & savedProxyPort
    Next

    'Set temporary activation proxy

    For Each proxyObj In
    GetObject("winmgmts:{impersonationLevel=impersonate}").
    InstancesOf ("win32_Proxy")
    result = proxyObj.SetProxySetting(actvProxyServer,
    actvProxyPort)

    WScript.Echo "SetProxySetting() returned = " & result

    If err <> 0 Then
    WScript.Echo Err.Description,"0x" & Hex(Err.Number)
    Halt
    End If
    Next

    'Activate Machine

    result = wpaObj.ActivateOnline()

    WScript.Echo "ActivateOnline Method() returned = "& result

    If err <> 0 Then
    WScript.Echo Err.Description, "0x" & Hex(Err.Number)
    ' do not halt - need to reset proxy
    End If

    'Restore proxy to original setting

    For Each proxyObj In
    GetObject("winmgmts:{impersonationLevel=impersonate}").
    InstancesOf ("win32_Proxy")
    result = proxyObj.SetProxySetting (savedProxyServer,
    savedProxyPort)

    WScript.Echo "SetProxySetting Method() = " & result

    If err <> 0 Then
    WScript.Echo Err.Description, "0x"& Hex(Err.Number)
    Halt
    End If
    Next

    End If

    Next


    Spodobał Ci się ten artykuł? Podziel się z innymi!

    Źródło:

    Polecamy również w kategorii Windows Product Activation