Zobrazují se příspěvky se štítkemPSRemoteTools. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemPSRemoteTools. Zobrazit všechny příspěvky

čtvrtek 28. ledna 2010

PSRemoteRegistry modul

[EN: Autotranslation]

Jak jsem již psal v posledních Get-PSNews, Shay Levy publikoval modul PSRemoteRegistry. Než se vrhneme na popis, podívejme se, jaké možnosti pro přístup do registru (lokálně či vzdáleně) máme nyní.

  1. Lokálně přes PSDrives: Get-PSDrive -PSProvider *Registry - asi nejčastější metoda, kterou budete používat z konzole nebo ve skriptech.
  2. Vzdáleně přes např. Invoke-Command, Enter-PSSession, ...
  3. Vzdáleně či lokálně přes WMI pomocí třídy StdRegProv. Obsahuje množství zajímavých metod, pokud jste v dobách VBS chtěli prohledat vzdálený registr, byla metoda EnumKey možná vaše první volba.
  4. Vzdáleně či lokálně před .NET třídy Microsoft.Win32.Registry*

Právě čtvrtý způsob využívá popisovaný modul, který zmiňované třídy zapouzdřuje do funkcí. Stáhnout si jej můžete z MSDN, kde je zároveň popsáno, jak jej správně importovat do PowerShellu. Seznam dostupných funkcí je vypsán na stránkách modulu, sami si jej můžete vylistovat pomocí Get-Command -Module PSRemoteRegistry. V tomto článku se můžete podívat na matici funkcí a dostupných parametrů. Součástí modulu je i tématická nápověda about_RemoteRegistry_Module.

Nejprve si ukážeme práci s lokálním počítačem a na konci článku uvedu, jak se lze dotazovat vzdálených počítačů. Otestujme, jestli existuje námi požadovaná větev.

PS C:\> Test-RegKey -Key "SOFTWARE\Makovec"
False



Neexistuje, takže ji vytvoříme

PS C:\> New-RegKey -Key SOFTWARE -Name Makovec
PS C:\> Test-RegKey -Key "SOFTWARE\Makovec"
True



Výborně, nyní si vytvoříme pár testovacích hodnot

PS C:\> 1..10 | % { Set-RegString -Key SOFTWARE\Makovec -Value "RegString$_" -Data $(Get-Random) -Force }



Všimněte si parametru -Force. Pokud jej neuvedete, budete vyzváni, abyste potvrdili zápis (bezpečnostní pojistka). Nyní si můžeme hodnoty zkontrolovat.

PS C:\> Get-RegKey -Key SOFTWARE -Name Makovec
ComputerName Hive Key SubKeyCount ValueCount
------------ ---- --- ----------- ----------
NETBOOK LocalMachine SOFTWARE\Makovec 0 10

PS C:\> Get-RegKey -Key SOFTWARE -Name Makovec | Get-RegValue
ComputerName Hive Key Value Data Type
------------ ---- --- ----- ---- ----
NETBOOK LocalMachine SOFTWARE\Makovec RegString1 1249268748 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString2 1967993881 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString3 1010703330 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString4 86413294 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString5 917742177 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString6 74280723 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString7 526159413 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString8 205545931 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString9 286790375 String
NETBOOK LocalMachine SOFTWARE\Makovec RegString10 2007859651 String



Pojďme si ukázat příklad ze života. Potřebujeme zjistit, na jakém portu komunikuje náš SMS klient na jednotlivých počítačích.

PS C:\> 'PC1','PC2','PC3','PC4' | Get-RegValue -Key SOFTWARE\Microsoft\CCM -Value httpport | ft ComputerName, Value, Data -AutoSize

ComputerName Value Data
------------ ----- ----
PC1 HttpPort 1234
PC2 HttpPort 1111
PC3 HttpPort 1234
PC4 HttpPort 1234


Vidíme, že PC2 potřebuje nutně změnu. Pokud pustíte skript přes více počítačů ve vaší síti, může se stát (a určitě se stane), že některé počítače budou nedostupné a obdržíte chybovou zprávu: Get-RegValue : Exception calling "OpenRemoteBaseKey" with "2" argument(s): "The network path was not found. Pro tyto případy jsou všechny funkce z PSRemoteRegistry modulu vybaveny parametrem -Ping a pokud jej použijete dostanete jasnou zprávu, kde se stala chyba.

PS C:\> 'PC1','PC2','PC3','PC4' | Get-RegValue -Key SOFTWARE\Microsoft\CCM -Value httpport -Ping | ft ComputerName, Value, Data -AutoSize

WARNING: [PC2] doesn't respond to ping.
WARNING: [PC3] doesn't respond to ping.
ComputerName Value Data
------------ ----- ----
PC1 HttpPort 1234
PC4 HttpPort 1234


Do připravovaného článku pro TechNet Flash jsem přidal ukázku, jak použít předchozí příklad na všechny počítače ve vaší doméně. Abych nezapomněl, měli bychom po sobě uklidit.

PS C:\> Remove-RegKey -Key SOFTWARE\Makovec -Force


Musím přiznat, že PSRemoteRegistry jsem okamžitě přidal do svého profilu a za těch pár dní, co jej používám se stal nenahraditelným pomocníkem. Pokud budete někdy potřebovat přistupovat ke vzdáleným registrům, tento modul je pro vás prostě must have.

pondělí 11. ledna 2010

Hrátky s parametry

[EN: Autotranslation]

Dnes jsem si hrál s modulem PSRemoteRegistry od Shaye Levyho. Testoval jsem různé parametry a napadlo mě, vypsat si tabulku, kde v řádkách budou vylistované funkce a ve sloupcích jednotlivé parametry. Vznikl mi následující výtvor:



Poté mě napadlo udělat malou statistiku pro standardní cmdlety. Nevím, jestli je to užitečné, ale já jsem se při tvorbě skriptu i výsledků dobře bavil :)

  • Počet cmdletů v modulech Microsoft.*: 236
  • Počet parametrů použitých v těchto cmdletech: 449
  • Počet kombinací cmdlet/parametr: 3491
  • Parametry, které jsou dostupné pro každý cmdlet: Zde určitě nikoho nepřekvapí (pokud ano, Get-Help about_CommonParameters je váš přítel pro následujících 10 minut :), že jsou to takzvané Common Parameters: Verbose, Debug, WarningAction, WarningVariable, ErrorAction, ErrorVariable, OutVariable, OutBuffer. Vyskytují se - ano, hádáte správně - 236x.
  • Další v pořadí jsou: Confirm, WhatIf (85), Force (68), Name (67), InputObject, Credential (54), Path (52). Ostatní parametry se vyskytují méně než 50x.
  • Parametrů, které se vyskytují pouze u jednoho cmdletu je 270.
  • Cmdlet s největším počtem parametrů: New-ModuleManifest (38)
  • Další v pořadí: Invoke-Command (28), New-PSSessionOption (28), Get-WSManInstance (28), Get-WmiObject (26), Set-WmiInstance, Invoke-WmiMethod (25).
  • Nejméně parametrů: Get-Culture, Get-Transaction, Get-Host, Get-PSCallStack, Get-UICulture, Exit-PSSession, Stop-Transcript, Get-WSManCredSSP (8).
Určitě bych mohl pokračovat dále, ale myslím, že tohle pro přehled stačí. Pokud chcete dělat vlastní výzkumy, zde je kód:




  1. function Get-CommandParameter {   

  2.   

  3.     param (   

  4.         [Parameter(   

  5.             ValueFromPipeline=$true,   

  6.             ValueFromPipelineByPropertyName=$true  

  7.         )]         

  8.         [string[]]$Name=""  

  9.     )   

  10.        

  11.     PROCESS {   

  12.            

  13.         foreach ($c in $Name) {   

  14.   

  15.             # receive all parameters   

  16.             $cParams = (Get-Command $c).Parameters.Keys   

  17.                

  18.             # process every parameter and create object   

  19.             foreach ($p in $cParams) {   

  20.            

  21.                 $psObj = New-Object PSObject -Property @{   

  22.                     Command=$c  

  23.                     Parameter=$p  

  24.                 } # psObj        

  25.                    

  26.                 $psObj         

  27.             } # foreach $p   

  28.         } # foreach $c     

  29.     } # PROCESS   

  30. # function Get-CommandParameter  


Použití je poté následující:
PS C:\> $a = Get-Command -CommandType cmdlet Get-CommandParameter
PS C:\> $a.Count
3491