Seriál Windows PowerShell–PowerShell v4 (část 37.)

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 Requiresa 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