Aktywacja z wykorzystaniem skryptów

Aktywacja z wykorzystaniem skryptów

Autor: Microsoft

Opublikowano: 4/4/2006, 12:00 AM

Liczba odsłon: 11692

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

Jak wykorzystać Copilot w codziennej pracy? Kurs w przedsprzedaży
Jak wykorzystać Copilot w codziennej pracy? Kurs w przedsprzedaży

Wydarzenia