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:
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
- 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:
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:
Po spuštění DSC se objeví jak účet, tak i skupina, které je nyní členem:
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:
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 DSC