Centrum skryptów - systemy operacyjne

Czy za pomocą transakcji mogę zapisywać informacje WMI w rejestrze?

Udostępnij na: Facebook

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.

Czy za pomocą transakcji mogę zapisywać informacje WMI w rejestrze?

Cześć, Skrypciarze! Chciałabym móc utworzyć kilka kluczy rejestru, ale z zachowaniem warunku, że komputer spełnia określone kryteria sprzętowe. Myślałam o wysłaniu kwerendy do kilku klas WMI i zastosowaniu transakcji, ale nie wiem, których sprzętowych klas WMI użyć. Jakieś sugestie?

-- NB

Cześć, NB! Czołem, tutaj skrypciarz Ed Wilson. Dzisiaj sporo czasu poświęciłem na rozmowy w serwisie Twitter z pewnym uczestnikiem grupy użytkowników programu Windows PowerShell z Sydney. Wczoraj Don Jones miał poprowadzić spotkanie z tą grupą przy okazji wakacji w Australii. Wszystko to obudziło wspaniałe wspomnienia. Ponadto niedługo Brett, menedżer techniczny firmy Microsoft z Sydney, który jest moim źródłem ciastek ANZAC, ma przybyć do Seattle na konferencję Microsoft TechReady. Niestety nie będę mógł wziąć w niej udziału — ciągle nie mogę podróżować samolotem po niedawnej operacji ucha. Dlatego też w wolnym czasie szukam kogoś z Charlotte, kto będzie w stanie przywieźć mi ciastka ANZAC. Jak więc widać, jest dziś bardzo pracowity dzień. Przejrzałem stare zdjęcia, które zrobiłem podczas ostatniej podróży na odwrotną stronę planety. Oto jedno z nich:

W chwili przerwy od starań, by zapewnić sobie dostęp do ciastek ANZAC, znalazłem czas, by zajrzeć do skrzynki odbiorczej scripter@microsoft.com. NB, gdyby nie potrzeba spełnienia wymagań sprzętowych, zaproponowałbym użycie klasyfikacji WinSAT. Klasyfikacja WinSAT jest z reguły tworzona podczas instalowania systemu Windows 7 lub Windows Vista (tylko te dwa systemy mają to narzędzie). Nowe sterowniki (np. sterowniki graficzne) mogą poprawić lub zmniejszyć wydajność, co oznacza konieczność ponownego uruchomienia aplikacji WinSAT. Można użyć klasy WMI Win32_WinSAT do pobrania najnowszej klasyfikacji WinSAT określonej platformy. Dokumentacja klasy WMI Win32_WinSAT jest dostępna w witrynie MSDN (j.ang.). Niestety klasa WMI Win32_WinSAT nie udostępnia metody aktualizowania (prawdę mówiąc klasa ta nie udostępnia żadnych metod). Narzędzie WinSAT jest dostępne też z wiersza poleceń, wymaga jednak uruchomienia z uprawnieniami administracyjnymi. Dokumentację programu Winsat.exe można znaleźć w witrynie TechNet (j.ang.).

Skrypt WriteWinSatToRegistryUseTransaction.ps1 jest podobny do skryptu użytego we wczorajszym artykule z serii „Cześć, Skrypciarze”. Główna różnica polega na tym, że w tym skrypcie musimy utworzyć nowy klucz rejestru, ale nie możemy tego zrobić przy użyciu apletu polecenia Set-Item. Jeśli klucz rejestru HKCU:\Software\ScriptingGuys\Hardware już istnieje, powstanie błąd. Najlepiej użyć apletu polecenia Test-Path, aby sprawdzić, czy klucz rejestru istnieje. Jeśli klucz nie istnieje, należy go utworzyć. Odpowiednią składnię widać poniżej:

if(-not (test-path -Path HKCU:\Software\ScriptingGuys\Hardware))

{

 New-Item -Path HKCU:\Software\ScriptingGuys\Hardware

}

Po utworzeniu klucza pozostała część skryptu jest zbliżona do skryptu z wczoraj. Używam kilku apletów polecenia Set-ItemProperty do przechowania informacji WinSat w rejestrze. Widać to poniżej:

Set-ItemProperty -Name CPUScore -Path HKCU:\Software\ScriptingGuys\Hardware `

-Value ($a.CPUScore).ToString() -useTransaction | out-null

Set-ItemProperty -Name D3dScore -Path HKCU:\Software\ScriptingGuys\Hardware `

-Value ($a.D3DScore).ToString() -useTransaction | out-null   

Set-ItemProperty -Name DiskScore -Path HKCU:\Software\ScriptingGuys\Hardware `

-Value ($a.DiskScore).ToString() -useTransaction | out-null

Set-ItemProperty -Name GraphicsScore -Path HKCU:\Software\ScriptingGuys\Hardware `

-Value ($a.GraphicsScore).ToString() -useTransaction | out-null

Set-ItemProperty -Name MemoryScore -Path HKCU:\Software\ScriptingGuys\Hardware `

-Value ($a.MemoryScore).ToString() -useTransaction | out-null

Set-ItemProperty -Name TimeTaken -Path HKCU:\Software\ScriptingGuys\Hardware `

-Value ($a.TimeTaken).ToString() -useTransaction | out-null

Set-ItemProperty -Name WinSPRLevel -Path HKCU:\Software\ScriptingGuys\Hardware `

-Value ($a.WinSPRLevel).ToString() -useTransaction | out-null

Pisząc skrypt, skopiowałem pierwszy wiersz i wkleiłem go sześć razy. Następnie zmieniałem w poszczególnych wierszach kodu nazwy kluczy rejestru i nazwy właściwości WMI. Na ekranie miałem otwartą konsolę programu Windows PowerShell zawierającą wyniki poniższego polecenia, co ułatwiało mi wprowadzanie zmian.

PS C:\> gwmi win32_winsat





__GENUS               : 2

__CLASS               : Win32_WinSAT

__SUPERCLASS          :

__DYNASTY             : Win32_WinSAT

__RELPATH             : Win32_WinSAT.TimeTaken="MostRecentAssessment"

__PROPERTY_COUNT      : 8

__DERIVATION          : {}

__SERVER              : MRED1

__NAMESPACE           : root\cimv2

__PATH                : \\MRED1\root\cimv2:Win32_WinSAT.TimeTaken="MostRecentAssessment"

CPUScore              : 7.2

D3DScore              : 4

DiskScore             : 7.1

GraphicsScore         : 4

MemoryScore           : 7.2

TimeTaken             : MostRecentAssessment

WinSATAssessmentState : 1

WinSPRLevel           : 4







PS C:\>

Teraz musimy zakończyć transakcję i wyświetlić komunikat o stanie:

Complete-Transaction

"zaktualizowano klucz rejestru"

Pełen skrypt WriteWinSatToRegistryUseTransaction.ps1 widać poniżej.

WriteWinSatToRegistryUseTransaction.ps1

#requires -version 2.0

Function New-HardwareKey ($computer)

{

 $t = {Start-Transaction}

 &($t)

 Try

  {

   $a = Get-WmiObject -Class win32_WinSat -ComputerName $computer -ErrorAction silentlyContinue

   if(-not (test-path -Path HKCU:\Software\ScriptingGuys\Hardware))

    {

     New-Item -Path HKCU:\Software\ScriptingGuys\Hardware -UseTransaction `

      -ErrorAction stop | out-null

    }

   Set-ItemProperty -Name CPUScore -Path HKCU:\Software\ScriptingGuys\Hardware `

   -Value ($a.CPUScore).ToString() -useTransaction | out-null

   Set-ItemProperty -Name D3dScore -Path HKCU:\Software\ScriptingGuys\Hardware `

   -Value ($a.D3DScore).ToString() -useTransaction | out-null   

   Set-ItemProperty -Name DiskScore -Path HKCU:\Software\ScriptingGuys\Hardware `

   -Value ($a.DiskScore).ToString() -useTransaction | out-null

   Set-ItemProperty -Name GraphicsScore -Path HKCU:\Software\ScriptingGuys\Hardware `

   -Value ($a.GraphicsScore).ToString() -useTransaction | out-null

   Set-ItemProperty -Name MemoryScore -Path HKCU:\Software\ScriptingGuys\Hardware `

   -Value ($a.MemoryScore).ToString() -useTransaction | out-null

   Set-ItemProperty -Name TimeTaken -Path HKCU:\Software\ScriptingGuys\Hardware `

   -Value ($a.TimeTaken).ToString() -useTransaction | out-null

   Set-ItemProperty -Name WinSPRLevel -Path HKCU:\Software\ScriptingGuys\Hardware `

   -Value ($a.WinSPRLevel).ToString() -useTransaction | out-null

   Complete-Transaction

   "zaktualizowano klucz rejestru"

  }

 Catch [System.Exception]

  { 

    Undo-Transaction 

    "cofnięcie transakcji"

  }

 Finally { "done" }

} #end function New-HardwareKey



New-HardwareKey localHost

Uruchomienie skryptu WriteWinSatToRegistryUseTransaction.ps1 powoduje zmodyfikowanie rejestru. Widać to poniżej.

NB, to już wszystko, co musisz wiedzieć o zapisywaniu informacji WMI w rejestrze za pomocą transakcji. To już ostatni artykuł z serii poświęconej pracy z transakcjami i dostawcą rejestru. Zapraszamy jutro na szybkie piątkowe odpowiedzi.

Skrypciarze Ed Wilson i Craig Liebendorfer

 Do początku strony Do początku strony

Centrum skryptów - systemy operacyjne