Jak określić okres karencji dla komputera z systemem Windows Vista?
Skrypciarze odpowiadają na Wasze pytania
Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy. |
Jak określić okres karencji dla komputera z systemem Windows Vista?
Cześć, Skrypciarze! Jak określić okres karencji dla komputera z oprogramowaniem Windows Vista?
-- LD
Cześć, LD. Kilka lat temu Skrypciarz piszący te słowa wyszedł z pracy, wsiadł do samochodu, po czym okazało się, że nie może go odpalić. W tym okresie Skrypciarz pracował jako dziennikarz sportowy i niekiedy bardzo późno kończył pracę. Awaria samochodu miała miejsce właśnie takiego wieczoru; była 2 w nocy, wszędzie ciemno i ani żywej duszy, a samochód nie chce się uruchomić. Żeby pogorszyć sprawę, Skrypciarz piszący te słowa wie mniej o samochodach niż o skryptowaniu. Nie wiedząc za bardzo, co należy czynić, otworzył maskę i zajrzał do środka. Wszystko wyglądało niby w porządku, chociaż prawdę mówiąc piszący te słowa Skrypciarz zauważyłby, że coś jest nie tak dopiero, gdyby się zaczęło palić. Czując, że coś jednak musi zrobić, poruszał kilka kabelków, zamknął maskę i wsiadł za kierownicę. Ku jego wielkiemu zaskoczeniu, silnik uruchomił się od razu. Skrypciarz nie tylko bezpiecznie dojechał do domu, ale już nigdy więcej nie miał problemu z uruchomieniem samochodu.
Problem rozwiązany!
W przeciwieństwie to większości historii pojawiających się w serii Cześć Skrypciarze!, ta ma pewien przekaz: czasami można coś naprawić, nie mając zielonego pojęcia, co się robi. Dotyczy to zarówno samochodów, jak i skryptów. Zaglądając do środka i grzebiąc w kabelkach znajdziemy sposób na określenie pozostałego okresu karencji dla aktywacji systemu Windows; jednakże nie będziemy mogli na pewno powiedzieć jak znaleźliśmy rozwiązanie, ani co ono oznacza. Napotkany przez nas problem sprowadza się do tego, że nie do końca rozumiemy, na czym polega licencjonowanie systemu Windows Vista. (Rzeczywiście, prawdopodobnie jesteśmy jedynymi osobnikami na ziemi, który jeszcze tego nie rozgryźli!)
System Windows Vista ma między innymi nowy sposób licencjonowania Volume Licensing, przeznaczony dla dużych przedsiębiorstw, np. Microsoft. Po zapytaniu o informację na temat licencjonowania i okresu karencji (grace period) na naszym komputerze testowym, otrzymujemy raport wyglądający następująco:
Windows Operating System - Vista, RETAIL channel
Grace period remaining (hours): 0
Licensed
Windows Operating System - Vista, OEM_COA_NSLP channel
Grace period remaining (hours): 0
Unlicensed
Windows Operating System - Vista, OEM_SLP channel
Grace period remaining (hours): 0
Unlicensed
Windows Operating System - Vista, RETAIL channel
Grace period remaining (hours): 0
Licensed
Windows Operating System - Vista, OEM_COA_SLP channel
Grace period remaining (hours): 0
Unlicensed
Co to wszystko oznacza? No cóż, prawdę mówiąc, sami nie wiemy. Na dodatek nie jesteśmy całkiem pewni, jak będą wyglądały uzyskane dane na komputerze z systemem Vista, który nie posiada usługi Volume Licensing. Ale przecież połowa frajdy jeżeli chodzi o skryptowanie polega na tym, żeby zamknąć oczy, przełknąć ślinę, uruchomić skrypt i czekać na to, co się ma wydarzyć.
Uwaga. Czyż Skrypciarze nie powinni się trochę wysilić i dowiedzieć czegoś o usłudze Volume Licencing, zwłaszcza że system Vista posiada ogromną, nową klasę WMI poświęconą licencjonowaniu oprogramowania? O tak, powinniśmy i tak też zrobimy. Jednak na razie zachęcamy do poświęcenia kilku minut na przeczytanie artykułu na temat Volume Licensing oraz SoftwareLicensingProduct na własną rękę.
W każdym razie, bez zbędnych ceregieli (chyba głównie dlatego, że już nie mamy się z czym ceregielić), podajemy skrypt, który może określić pozostały okres karencji dla komputera z zainstalowanym systemem Windows Vista:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery _
("Select * From SoftwareLicensingProduct")
For Each objItem in colItems
Wscript.Echo objItem.Description
intGracePeriod = Int(objItem.GracePeriodRemaining / 60)
Wscript.Echo "Grace period remaining (hours): " & intGracePeriod
Select Case objItem.LicenseStatus
Case 0 Wscript.Echo "Unlicensed"
Case 1 Wscript.Echo "Licensed"
Case 2 Wscript.Echo "Out-Of-Box Grace Period"
Case 3 Wscript.Echo "Out-Of-Tolerance Grace Period"
Case 4 Wscript.Echo "Non-Genuine Grace Period"
End Select
Wscript.Echo
Next
No dobrze, zobaczmy, czy uda nam się przynajmniej w jakimś sensie rozgryźć ten skrypt i zobaczyć, o co w nim chodzi. Jak widać, zaczynamy od połączenia się z usługą WMI na lokalnym komputerze (chociaż skrypt może zostać równie dobrze uruchomiony na komputerze zdalnym). Następnie używamy poniższego wiersza kodu, aby uzyskać wszystkie wystąpienia klasy SoftwareLicensingProduct, która (gdyby ktoś się zastanawiał) zastępuje klasę Win32_WindowsProductActivation z systemów Windows XP oraz Windows Server 2003:
Set colItems = objWMIService.ExecQuery _
("Select * From SoftwareLicensingProduct")
Dobra, to było całkiem proste, nieprawdaż? Po wysłaniu zapytania uruchamiamy pętlę For Each, która przejdzie przez wszystkie elementy uzyskanej kolekcji. Wewnątrz tej pętli, pierwszą rzeczą, którą zrobimy, będzie wywołanie echa wartości właściwości Description:
Wscript.Echo "Description: " & objItem.Description
Nadal jest proste, czyż nie? Ok, a teraz przyjrzyjmy się właściwości GracePeriodRemaining. Jak się okazuje, ta właściwość podaje nam czas (w minutach) pozostały do zakończenia okresu karencji. (Lub, w przypadku komputerów klienckich – czas, znowu w minutach, zanim wymagana będzie ponowna aktywacja.) Z tego właśnie powodu, pobieramy wartość tej właściwości i dzielimy ją przez 60; pozwoli nam to wyrazić pozostały okres karencji w godzinach:
intGracePeriod = Int(objItem.GracePeriodRemaining / 60)
Wscript.Echo "Grace period remaining (hours): " & intGracePeriod
Jeśli chcieli mieć tę wartość wyrażoną w dniach, po prostu dzielimy ją przez 1440 (60 minut w godzinie razy 24 godziny w dniu daje nam 1440 minuty w dniu):
intGracePeriod = Int(objItem.GracePeriodRemaining / 1440)
Wscript.Echo "Grace period remaining (hours): " & intGracePeriod
To w zasadzie jest wszystko, czego dotyczyło pytanie, ale zdecydowaliśmy się posunąć o krok naprzód i uzyskać także status licencji. W tym celu stosujemy polecenie Select Case, które zaczyna działać w oparciu o wartość właściwości LicenseStatus:
Select Case objItem.LicenseStatus
Case 0 Wscript.Echo "Unlicensed"
Case 1 Wscript.Echo "Licensed"
Case 2 Wscript.Echo "Out-of-Box Grace Period"
Case 3 Wscript.Echo "Out-of-Tolerance Grace Period"
Case 4 Wscript.Echo "Non-Genuine Grace Period"
End Select
I znowu, kod sam w sobie nie jest skomplikowany. Właściwość LicenceStatus daje nam wartość 0, 1 ,2 ,3 lub 4. Teraz tylko sprawdzamy wartość i wywołujemy echo aktualnego statusu licencji. Na przykład, jeżeli właściwość LicenseStatus ma wartość 2, oznacza to, że system operacyjny znajduje się w okresie karencji. W odpowiedzi wywołujemy echo tej informacji:
Case 2 Wscript.Echo "Out-of-Box Grace Period"
Co to znaczy: znajdować się w okresie karencji? Jakie są tego konsekwencje? No cóż, w tym cały problem: nie wiemy. Ale przy odrobinie szczęścia odpowiedzi na te pytania można znaleźć tutaj. Mamy nadzieję, że to wskazówka w dobrym kierunku. My ze swojej strony obiecujemy zagłębić się w licencjonowanie Visty, kiedy tylko wrócimy do domu.
Do początku strony
Określanie okresu karencji za pomocą powłoki Windows PowerShell
Nie obiecujemy, że tak będzie we wszystkich przyszłych artykułach, jednak kiedy tylko będzie to możliwe, postaramy się przedstawić rozwiązanie problemu za pomocą powłoki Windows PowerShell, a nie tylko używanego przez nas zazwyczaj VBScript. Należy mieć przy tym na uwadze dwie rzeczy. Po pierwsze, nie będziemy poświęcać dużo miejsca (o ile w ogóle) na wyjaśnienia związane z zastosowaniem powłoki Windows PowerShell; w chwili obecnej po prostu nie mamy na to czasu. Po drugie, w dalszym ciągu naszym celem jest kształcenie; co oznacza, że nasze rozwiązania będą często wymagały więcej pracy z klawiaturą, niż życzyliby sobie tego miłośnicy powłoki Windows PowerShell. (Na przykład, zazwyczaj piszemy całe polecenia, zamiast używać aliasów.) Ale przynajmniej jest to jakiś początek, prawda?
$a=get-wmiobject softwarelicensingproduct -computer scriptcentral |
select-object description,remaininggraceperiod,licensestatus
foreach ($b in $a)
{
$b.description
$c = $b.graceperiodremaining/60
"Grace period remaining (hours): $c"
switch ($b.licensestatus)
{
0 {"Unlicensed"}
1 {"Licensed"}
2 {"Out-Of-Box Grace Period"}
3 {"Out-Of-Tolerance Grace Period"}
4 {"Non-Genuine Grace Period"}
default {"The license status could not be determined."}
}
write-host
}
Do początku strony |