V minulém TechNet Flash magazínu jsem na začátku zmiňoval jednu z nových vlastností PowerShellu v4. Jelikož jsou od té doby již dostupné (v preview) nové verze klienta i serveru (Windows 8.1 a Windows Server 2012 R2), rád bych se na aktuální novinky podíval dnes trochu podrobněji. Pokud si budete chtít vyzkoušet popisované novinky, můžete využít odkazů publikovaných na českém TechNetu pro Windows 8.1 a Server nebo si můžete rozběhat virtuální počítač ve Windows Azure, například pomocí tohoto návodu.

Pokud byste chtěli nainstalovat nový PowerShell na starší typy počítačů (Windows 7 SP1, Server 2008 R2 SP1, Server 2012), můžete si stáhnout Windows Management Framework 4.0 Preview.

Pojďme se podívat ne některé ze zajímavých nových změn.

Save-Help - tento cmdlet se dočkal změny, po které volalo mnoho lidí. Pokud jste měli počítač, na kterém nebyl nainstalován nějaký PowerShell modul, nemohli jste pro tento modul nainstalovat nápovědu. Tato funkcionalita se hodí v případě, že jste chtěli mít na svém počítači nápovědu pro serverové moduly (pro studijní důvody) nebo jste potřebovali stáhnout nápovědu na server, který neměl konektivitu do internetu.

Příklad si ukážeme na updatu helpu v mém labu. Mám zde Active Directory doménu, kde můj DC počítač nemá přístup na internet. Na DC spustím tento příkaz:

PS> Export-Clixml –Path c:\Temp\dns.xml –InputObject (Get-Module –Name DnsServer -List)

Ve výsledném XML souboru je vyexportována struktura modulu pro správu DNS. Na následujícím obrázku je zobrazen pouze začátek souboru:

image

Tento soubor si přeneseme na počítač, který má připojení do internetu a spustíme příkaz pro uložení nápovědy:

PS> $xml = Import-Clixml c:\Scripts\dns.xml
PS> Save-Help –Module $xml –Destination c:\Scripts\DnsHelp

Uložené soubory přeneseme zpět na zdrojový počítač a zde je již naimportujeme pomocí Update-Help

PS> Update-Help –Module DnsServer –Source c:\Temp\DnsHelp

Toto zřejmě není operace, kterou byste prováděli příliš často (někteří možná nápovědu takto aktualizovat nepotřebují), ale pro určité scénáře se jedná o zajímavou cestu.

Malé změny v cmdletech

Pro práci s naplánovanými úlohami určitě používáte cmdlety Register-ScheduledJob a Set-ScheduledJob. Tyto dva cmdlety nyní obsahují nový parametr – RunNow. Pomocí toho parametru můžete úlohu spustit okamžitě a není potřeba vytvářet trigger.

-RunNow [<SwitchParameter>]
   
Starts a job immediately, as soon as the Register-ScheduledJob cmdlet
    is run. This parameter
eliminates the need to trigger Task Scheduler to
    run a Windows PowerShell script immediately
after registration, and does
    not require users to create a trigger that specifies a starting
date and
    time.
   
   
Required? false
   
Position? named
   
Default value false
   
Accept pipeline input? false
   
Accept wildcard characters? False

Když už jsme u těch triggerů J Pro cmdlety New-JobTrigger a Set-JobTrigger přibyl také nový parametr: RepeatIndefinitely.

-RepeatIndefinitely [<SwitchParameter>]
   
This parameter, available starting in Windows PowerShell 4.0, eliminates
    he necessity of
specifying a TimeSpan.MaxValue value for the
    repetitionDuration parameter to run a scheduled
job repeatedly, for an
    indefinite period.

Po instalaci PowerShellu na starších verzích jste museli pro běh skriptů nastavit Execution Policy. Ve Windows Serveru 2012 R2 je tato politika nastavena na RemoteSigned (netýká se Windows 8.1). Je zde vidět posun v administraci serverů směrem k jednodušší administraci. I když Microsoft nemá tuto změnu označenou jako „breaking“, dle mého názoru je potřeba, aby o této změně byli lidé informováni – i když se primárně nejedná o žádné narušení bezpečnosti.

Nového parametru se dočkal i můj oblíbený cmdlet Get-Process. Jedná se o parametr IncludeUserName a jak jméno naznačuje, do výpisu přidá jméno uživatele, pod kterým byl proces spuštěn:

PS> Get-Process | select -First 10

Handles NPM(K) PM(K) WS(K) VM(M) CPU(s)   Id ProcessName
------- ------ ----- ----- ----- ------   -- -----------
     57      7  1940  8772    54   1.75  668 conhost
    135     10  1616  3680    42   0.38  388 csrss
     88      9  1128  3512    39   0.02  440 csrss
    112     10  1656 30488    65   0.69 2664 csrss
    201     15 22812 32644    95   0.11  728 dwm
    192     18 13320 54212   139   1.91 2768 dwm
    881     65 17004 55588   342   2.30 1968 explorer
      0      0     0    24     0           0 Idle
    270     21  8324 23332   128   0.14 1384 LogonUI
    782     18  3320  9504    35   0.50  544 lsass

PS> Get-Process -IncludeUserName | select -First 10

Handles WS(K) VM(M) CPU(s)   Id UserName                ProcessName
------- ----- ----- ------   -- --------                -----------
     57  8772    54   1.69  668 MAKOVECSVRR2-01\makovec conhost
    135  3680    42   0.38  388                         csrss
     88  3512    39   0.02  440                         csrss
    112 30488    65   0.69 2664                         csrss
    201 32644    95   0.11  728 Window Manager\DWM-1    dwm
    192 54212   139   1.91 2768 Window Manager\DWM-2    dwm
    881 55588   342   2.30 1968 MAKOVECSVRR2-01\makovec explorer
      0    24     0           0                         Idle
    270 23332   128   0.14 1384 NT AUTHORITY\SYSTEM     LogonUI
    782  9492    34   0.50  544 NT AUTHORITY\SYSTEM     lsass

A také jsme se dočkali nového cmdletu, jedná se o Get-FileHash. Hash můžete počítat jedním z následujících algoritmů: SHA1, SHA256, SHA384, SHA512, MACTripleDES, MD5, RIPEMD160 (defaultní je SHA256). Pokud chcete mít standardní jiné, můžete použít mou (další) oblíbenou „fíčuru“ – PSDefaultParameterValues, např. takto:

PS> $PSDefaultParameterValues = @{'Get-FileHash:Algorithm'='MD5'}
PS> Get-FileHash c:\Temp\dns.xml | fl *

Path : C:\Temp\dns.xml
Type : System.Security.Cryptography.MD5CryptoServiceProvider
Hash : FUnAxqeXLOkiR0yIGcF1ag==

Vzhledem k některým rozšířením jazyka, došlo i ke změnám v PowerShell ISE. Nejedná se ovšem o žádné převratné novinky. Jsou to spíše maličkosti, které zjednoduší práci, např:

  • Podpora pro debugging workflow
  • Podpora pro Desired State Configuration (DSC) a to v oblasti IntelliSense
    image
  • Podpora pro debugging vzdálených skriptů

Zároveň byla odstraněna chyba, která byla velmi otravná, a narazilo na ní množství lidí. V případě, že jste v ISE spustili cmdlet Invoke-WebRequest a po vrácení hodnot ISE zavřeli, proces běžel stále na pozadí a po nějaké době vám byl schopen obsadit celou paměť. Několikrát se mi stalo, že jsem si říkal, proč mám tak pomalý počítač a až pohled na Process Monitor odhalil smutnou pravdu. Například teď při testování mám ISE dávno vypnuté, ale pořád mi běží v procesech a celkem kvalitně vytěžuje procesor:

image

Naštěstí, tohle už nás ve verzi 4 nečeká.

Desired State Configuration (DSC)

Jak jsem již naznačoval minule, pro mne největší novinkou je DSC. Zde si můžete určit daný stav systému a ten poté pomocí DSC vynucovat. Dnes si ukážeme krátkou ukázku a podrobnější popis vyjde zřejmě na příští pokračování.

Naším cílem bude zajistit, že na počítači bude vždy lokální účet daného jména (LokalniDulezityUcet) a tento účet bude vždy členem určité skupiny (MojeSkupina). Na začátku operace neexistuje ani účet ani skupina:

image

image

Po spuštění DSC se objeví jak účet, tak i skupina, které je nyní členem:

image

Celé kouzlo spočívá v následující konfiguraci:

Configuration MyUserConfig
{
   
param($MachineName)

   
Node $MachineName
   
{
       
User MyUser
       
{
           
Ensure = 'Present'
           
UserName = 'LokalniDulezityUcet'
       
}

        Group MyGroup
       
{
           
Ensure = 'Present'
           
Name = 'MojeSkupina'
           
MembersToInclude = 'LokalniDulezityUcet'
           
Requires = '[User]MyUser'
       
}

       
Log MyLogAction
       
{
           
Message = 'Probehla kontrola uctu ve skupine'
           
Requires = '[Group]MyGroup'
       
}

   
}

}

Zde jsme si v rámci Configuration vytvořili Node, který obsahuje chtěnou definici cílového stavu.

  • Uživatel je definován jako chtěný „Present“ a uvádíme jeho jméno.
  • Skupina je také potřebná, její jméno je MojeSkupina a chceme přidat uživatele vytvořeného v předchozím kroku. Abychom zajistili, že uživatel opravdu existuje, použili jsme Requires a uvedli sekci, která má být spuštěna před aktuální.
  • Logování probíhá do Analytic logu a text, který jsme chtěli mít uvedený se tam opravdu zapsal:
    image

Po vytvoření konfigurace je potřeba zkompilovat tuto konfiguraci do MOF souboru a poté ji spustit. Vše provedeme následujícími dvěma příkazy:

PS> MyUserConfig -MachineName $env:COMPUTERNAME
PS> Start-DscConfiguration -Path .\MyUserConfig

Pokud bych nyní smazal uživatelský účet a spustil DSC znovu, účet se vytvoří a přidá do skupiny. Což si můžeme ověřit, pokud spustíme kontrolu s parametry Wait a Verbose.

PS> Start-DscConfiguration -Path .\MyUserConfig -Wait -Verbose
VERBOSE: Perform operation 'Invoke CimMethod' with following parameters, ''methodName' = SendConfigurationApply,'className' = MSFT_DSCLocalConfigurationMan
ager,'namespaceName' = root/Microsoft/Windows/DesiredStateConfiguration'.
VERBOSE: An LCM method call arrived from computer MAKOVECSVRR2-01 with user sid S-1-5-21-1791083104-4223022288-313497419-500.
VERBOSE: 'DSCEngine': Starting to process the Set request.
VERBOSE: 'DSCEngine': Starting to process resource. '[User]MyUser'
VERBOSE: 'DSCEngine': Performing the test operation. '[User]MyUser'
VERBOSE: 'DSCEngine': [User]MyUser: The Test operation took 0.3590 seconds.
VERBOSE: 'DSCEngine': Performing Set operation. '[User]MyUser'
VERBOSE: '[User]MyUser': Configuration of user LokalniDulezityUcet started.
VERBOSE: '[User]MyUser': User LokalniDulezityUcet created successfully.
VERBOSE: '[User]MyUser': Configuration of user LokalniDulezityUcet completed successfully.
VERBOSE: 'DSCEngine': [User]MyUser: The Set operation took 0.4690 seconds.
VERBOSE: 'DSCEngine': The resource finished processing. '[User]MyUser'
VERBOSE: 'DSCEngine': Starting to process resource. '[Group]MyGroup'
VERBOSE: 'DSCEngine': Performing the test operation. '[Group]MyGroup'
VERBOSE: 'DSCEngine': [Group]MyGroup: The Test operation took 0.4060 seconds.
VERBOSE: 'DSCEngine': Performing Set operation. '[Group]MyGroup'
VERBOSE: '[Group]MyGroup': Group MojeSkupina properties updated successfully.
VERBOSE: 'DSCEngine': [Group]MyGroup: The Set operation took 0.4380 seconds.
VERBOSE: 'DSCEngine': The resource finished processing. '[Group]MyGroup'
VERBOSE: 'DSCEngine': Starting to process resource. '[Log]MyLogAction'
VERBOSE: 'DSCEngine': Performing the test operation. '[Log]MyLogAction'
VERBOSE: 'DSCEngine': [Log]MyLogAction: The Test operation took 0.0150 seconds.
VERBOSE: 'DSCEngine': Performing Set operation. '[Log]MyLogAction'
VERBOSE: '[Log]MyLogAction': Probehla kontrola uctu ve skupine
VERBOSE: 'DSCEngine': [Log]MyLogAction: The Set operation took 0.0000 seconds.
VERBOSE: 'DSCEngine': The resource finished processing. '[Log]MyLogAction'
VERBOSE: 'DSCEngine': Set request completed.
VERBOSE: DSCEngine: The total operation took 1.8900 seconds.
VERBOSE: Operation 'Invoke CimMethod' complete.
VERBOSE: Time taken for configuration job to complete is 2.115 seconds

Tím bych pro dnešek PowerShell opustil. Těším se na vaše komentáře o DSCVeselý obličej

David Moravec, MVP
Mainstream Technologies