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ř:

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.

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