tech.guitarrapc.cóm

Technical updates

Windows Management Framework 5.0 RTM (PowerShell 5.0 RTM) がリリースされました

2015/12/24 追記

WMF 5.0 RTM のインストールによって、環境変数の PSModulePath がデフォルト設定にリセットされるバグが見つかったため、現在ダウンロードセンターから外されています。

修正が確認できしだい再度公開される予定とのことですので、少しお待ちください。なお、もし既に WMF5.0 RTM をインストールしていた場合、この問題に該当しています。また、WMF 5.0 RC や Production Preview ではこの問題は生じていません。

Windows Management Framework (WMF) 5.0 currently removed from Download Center

本文

ついに PowerShell v5 RTM がリリースされました。

Windows Management Framework (WMF) 5.0 RTM is now available

そう、RTM ということは完全な製品版です。多くの機能がありますが、リリースノートをさくっと見ていきましょう。

サクッとみたのに長いです。

  • 過去の記事はこちら

tech.guitarrapc.com

tech.guitarrapc.com

目次

リリースノート

https://msdn.microsoft.com/en-us/powershell/wmf/releasenotes?f=255&MSPPError=-2147217396

サポートOS環境

気になるサポートOS環境ですが、WMFv5 Production Preview から大きく変わりました。サポートがサーバー系OSのみに変わりました。これには色々あったようですが、多くは語りません。まずはサーバー系OSでお試しください。

記事を書き終えた瞬間に、Windows 8.1 / 7 SP1 もサポートされました。従来のWMF PP などと同様のOSサポートになりました。

Operating System サービスパック エディション 前提条件
Windows Server 2012 R2 All, except IA64 .NET 4.5以上
Windows Server 2012 All, except IA64 .NET 4.5以上
Windows Server 2008 R2 SP1 All, except IA64 WMF 4.0 is installed / .NET 4.5以上
Windows 8.1 Pro, Enterprise
Windows 7 SP1 All WMF 4.0 is installed / .NET 4.5以上
WMF5.0 RTM のインストールが可能になった環境

以前の WMF5.0 Production Preview では以下のサーバーアプリケーションを入れているシステムでのインストールは対応していませんでした。が、 WMF5.0 RTM のインストールは可能になりました。

  • System Center 2012 Configuration Manager
WFM5.0 RTM をいれてはいけないソフトウェア環境

現時点では、以下のサーバーアプリケーションをいれているシステムでは WMF5.0 をインストールしないでください。

  • Microsoft Exchange Server 2013
  • Microsoft Exchange Server 2010 SP3
  • Microsoft SharePoint Server 2013
  • Microsoft SharePoint Server 2010
  • System Center 2012 Virtual Machine Manager

ダウンロード

Microsoft Download Center からどうぞ

Download Windows Management Framework 5.0 (Superceeded by WMF 5.1 RTM version: http://aka.ms/wmf5download) from Official Microsoft Download Center

OS 環境ごとのインストールパッケージは以下の通りです。

Operating System アーキテクチャ インストールパッケージ名
Windows Server 2012 R2 x64 W2K12R2-KB3094174-x64.msu
Windows Server 2012 x64 W2K12-KB3094175-x64.msu
Windows Server 2008 R2 x64 W2K8R2-KB3094176-x64.msu
Windows 8.1 x64 W2K12R2-KB3094174-x64.msu
Windows 8.1 x86 Win8.1-KB3094174-x86.msu
Windows 7 SP1 x64 W2K8R2-KB3094176-x64.msu
Windows 7 SP1 x86 Win7-KB3094176-x86.msu

インストール

少し注意が必要です。

Windows Server 2012 R2 と Windows Server 2012

まずは以下を確認してください。

  • Windows PowerShell 2.0 (該当する場合) が有効であること
    • Windows Server 2012 R2 Server Core では Windows Server 2.0 が無効になっています。その場合は以下のコマンドで有効化できます
dism /online /enable-feature:MicrosoftWindowsPowerShellV2
dism /online /enable-feature:MicrosoftWindowsPowerShellV2-WOW64
バージョン

Windows 10 TH2 (Build 10586) と同じバージョンです。

$PSVersionTable
# WMF 5 RTM

Name                           Value
----                           -----
PSVersion                      5.0.10586.56
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.10586.56
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

が、 Windows 10 TH2 と WMF 5 RTMは、マイナーバージョンが実は違ったりします。

# Windows 10 TH2

Name                           Value
----                           -----
PSVersion                      5.0.10586.0
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.10586.0
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
PSReadLine

Windows 10 の PowerShell 5.0 とは違い、PSReadLine は PoweShell.Core に入ってきていません。

PowerShell コンソールの強化のためにも、ご自分でいれてください。

github.com

アンインストール

以下のコマンドを実行することでアンインストールできます。

Windows Server 2012 R2

wusa /uninstall /kb:3094174

Windows Server 2012

wusa /uninstall /kb:3094175

Windows Server 2008 R2 SP1

wusa /uninstall /kb:3094176

既知の問題

初回のみPoweShell ショートカットが動作しない

以下のどちらかを行うと直ります。

  • PowerShell ショートカットを右クリック -> Windows PowerShell
  • PowerShell ショートカットを右クリック -> Windows PowerShell -> Run As Administrator

DSC

破壊的変更に伴い、いくつかあります。

破壊的変更 : 証明書による暗号化が失敗する

WMF5 RTM で別方式になったためです。対処は、証明書を 「Encipherment か Key Encipherment Key 利用」 と 「Document Encryption Enhanced Key 利用 (1.3.6.1.4.1.311.80.1)]で再生成してください。

詳細はここで。

Protect-CmsMessage (Microsoft.PowerShell.Security) - PowerShell | Microsoft Learn

Start-DscConfiguration など一部 Cmdlet がエラー
LCM failed to retrieve the property PendingJobStep from the object of class dscInternalCache .
    + CategoryInfo : ObjectNotFound: (root/Microsoft/...gurationManager:String) \[\], CimException
    + FullyQualifiedErrorId : MI RESULT 6
    + PSComputerName : localhost

管理者として、DSCEngineCache.mof を削除します。

Remove-Item -Path $env:SystemRoot\\system32\\Configuration\\DSCEngineCache.mof
WMF 5.0 Production Preview に上書きして WMF 5.0 RTM をインストール

管理者で以下のコマンド実行します。

mofcomp $env:windir\\system32\\wbem\\DscCoreConfProv.mof
Get-DscConfiguration -Debug するとLCM状態が不安定になる

Get-DscConfiguration cmdlet の Debug 中に、CTRL+Cで中断しないこと。

Stop-DscConfiguration -Debug するとハング

Get-DscConfiguration -Debug するとLCM状態が不安定になる

で示した方法を実行します。

DSCResource の Verbose メッセージがLCMをDebugModeにしていると見えない

LCM のデバッグモードを無効にします。

Invoke-DscResource の実行がGet-DscConfigurationStatus cmdletで取得できない

対処なし

Get-DscConfigurationStatus が Pull実行結果を Consistency として返す

Pull 実行されたノードは、Initial ではなくConsistency として返します。

Invoke-DscResource が呼び出し先のメッセージを返さない。

LCM や DSC Resource 生成された verbose, warning, error messages は出力されません。

Invoke-DscResource を使うと DSC Resource がデバッグしにくい

LCM が Debug モードになっていると Invoke-DscResource は RunspaceId を返さないため、リモートデバッグが困難です。

Get-PSHostProcessInfo, Enter-PSHostProcess , Get-Runspace, Debug-Runspace で RunSpaceId を特定して利用しましょう。

一つのノードに対して様々な Partial Configuration を適用するとどのリソースなのか判別できない

Partial Configuration が異なる場合、別のリソース名を利用します。

Start-DscConfiguration –UseExisting が -Credential パラメータを受け付けない

CIM Session を利用します。

ノード名に IPv6 Addresses

サポートしていません。

Class-Based DSC Resources のデバッグ

サポートしていません。

DSC Class-Based Resource で$scriptスコープで定義した変数が他のDSCResource で利用できない

クラス構文の仕様です。各DSC Class 自体に関数や変数をそれぞれ設定してください。

PSDscRunAsCredential 使用時のデバッグ

サポートしていません。

DSC Composite Resources で PsDscRunAsCredential が利用できない

Credential を代わりに使ってください。

Get-DscResource -Syntax が PsDscRunAsCredential を正しく反映しない

サポートしていません。が、ISE での編集中のみ正しいメタデータがインテリセンスにでます。

Windows 7 で WindowsOptionalFeature がサポートされていない

DISM module を必要とするため、Windows 8 以上である必要があります。

Set-DscLocalConfigurationManager を WMF4.0 や WMF5.0 PP に実行しても失敗する

直接Invoke-CimMethodで設定してください。WMF 5.0 RTM 入れましょう。

$computerName = "WIN-3B576EM3669"
$mofPath = "C:\\$computerName.meta.mof"
$configurationData = \[Byte\[\]\]\[System.IO.File\]::ReadAllBytes($mofPath)
$totalSize = \[System.BitConverter\]::GetBytes($configurationData.Length + 4 )
$configurationData = $totalSize + $configurationData
Invoke-CimMethod -Namespace root/microsoft/windows/desiredstateconfiguration -class MSFT\_DSCLocalConfigurationManager -name SendMetaConfigurationApply -arguments @{ConfigurationData = \[Byte\[\]\]$configurationData} -Verbose -ComputerName $computerName

機能一覧

さくっとピックアップです。

Just Enough Administration (JEA)

詳細はここで。

gallery.technet.microsoft.com

これまで Windows においてユーザーが管理者権限がほしい場合、昇格していましたがこれではすべてのコマンドが管理者扱いでした。つまり Azure のサブスクリプションにおける共同管理者状態です。 これに対してJEA では、リモートエンドポイントを作成して、そこにつないだユーザーを「指定したコマンド、スクリプト、実行ファイルに限定して」管理者昇格することが可能になります。これを Role base Administrationと呼びます。つまり Azure の Role Base Account Control のようなイメージです。

必要な操作のエンドポイントにつないで必要な操作をやることで、必要な分だけの実行制御を行う。大事です。

クラス構文を用いたユーザー定義型の作成

PowerShell v4 におけるDSC に続いて、v5 でも言語デザインに大きな更新が入りました。クラス構文の導入です。

他のオブジェクト指向プログラミング言語 (OOP) と同じような、シンタックスやセマンティックがクラス構文で提供されます。目標としているのは、開発者とIT Proがお互いに 必要なシーンでもっとPowerShell を活用できるようにすることです。PowerShell での成果物 (DSC リソースなど) の生成を高速化することを目指しています。

サポートされているシナリオは以下の通りです。

  • DSC リソースの定義 と それに伴う型を PowerShell言語機能で提供すること
  • OOP の一般的な構文(Class / Propery / Method 他) を用いて、ユーザー定義型を提供すること
  • クラス継承をPowerShell や クラスベースのDSCリソースでサポート
  • 型のデバッグをPowerShell 言語機能として提供
  • 例外の生成と発生をきっちりしたメカニズムで正しい権限で扱うこと

若干変わっている部分がありますが、Preview の時点では以下のように使えました。

tech.guitarrapc.com

モジュールやスクリプト外部では定義した型が利用できなかったり、Enumのベースタイプには int のみ指定可能*1など、まだまだいくつか制限があります。それでも、DSCリソースなど動作をきっちり制御したい場合は、クラス構文がレキシカルスコープだったり、型の初期化から呼び出しまできっちり制御できるのはいいでしょう。*2

実行中PowerShellスクリプトのデバッグ

実行中のスクリプトに対して、デバッガーをブレイク挿入可能になりました。VS のリモートデバッグのようなイメージです。ローカルでもリモートでも動作するのでぜひぜひ!

  • Enter-PSHostProcess
  • Exit-PSHostProcess
リモートセッション先のファイルの編集をISEで可能に

ようは ssh 先のドキュメントを Vim で操作、保存できるように、PowerShell ISE も PS Remortingでつないだリモートセッションにあるファイルの編集保存が可能になりました。

ローカルからリモートを対話形式で編集できるの、やっと実装です。やったね!

デバッグ強化

RunSpace に対するデバッグが可能になりました。valentia もそうですが、PowerShell での非同期操作はコールバックメインなので、コールバック実行中のセッションをデバッグできるのはうれしのです。

  • Get-Runspace
  • Debug-Runspace
  • Enable-RunspaceDebug
  • Disable-RunspaceDebug
  • Get-RunspaceDebug

DSC の Configuration にかかわる更新

PSDesiredStateConfiguration モジュールが 1.1 に更新されました。

ノード間の協調動作

以下のリソースを利用して、指定ノード完了をまってから続行したりなど協調動作が可能になりました。

  • WaitForAll
  • WaitForAny
  • WaitForSome
MOF がデフォルトで暗号化されます。

WMF v4 の DSC で屑かったのが、MOF がデフォルトプレーンテキストだったことです。暗号化には証明書が必要と大変クズでした。まじサイテー。

WMF v5 ではデフォルト暗号化されます。証明書もいりません。やったね!!!!!暗号化は、Windows Data Protection で行われます。

次の図の通り、DSCサーバーで作ったMOF はこれまで通り暗号化されません、がノードに転送されたMOFは暗号化されます。

Configuration のヘルプサポート

読み込んだ Configuration に対して help Configurationname でヘルプが出ます!

例えば以下のような Configuration を実行してから、

configuration HelpSample1
{
    param([string]$computername,[string]$filePath)
    File f
    {
        Contents="Hello World"
        DestinationPath = "c:\Destination.txt"
    }
}

ヘルプを見ようとしてもでませんでした。

man HelpSample1

これが、WMF5 からヘルプがでます。

<#
.SYNOPSIS
The synopsis for the configuration goes here. This can be one line, or many.

.DESCRIPTION
The description for the configuration is usually a longer, more detailed explanation of what the script or function does. Use as many lines as you need.

.PARAMETER computername
Here, the dotted keyword is followed by a single parameter name. Don't precede that with a hyphen. The following lines describe the purpose of the parameter:

.PARAMETER filePath
Provide a PARAMETER section for each parameter that your script or function accepts.

.EXAMPLE
There's no need to number your examples.

.EXAMPLE
Windows PowerShell will number them for you when it displays your help text to a user.
#>

configuration HelpSample1
{
    param([string]$computername,[string]$filePath)
    File f
    {
        Contents="Hello World"
        DestinationPath = "c:\Destination.txt"
    }
}

こんな感じですね。

HelpSample1 -?

NAME
HelpSample1

SYNOPSIS
The synopsis for the configuration goes here. This can be one line, or many.

SYNTAX
HelpSample1 [[-InstanceName] <String>] [[-DependsOn] <String[]>] [[-OutputPath] <String>] [[-ConfigurationData] <Hashtable>] [[-computername] <String>] [[-filePath] <String>] [<CommonParameters>]

DESCRIPTION
The description for the configuration is usually a longer, more detailed explanation of what the script or function does. Take as many lines as you need.

RELATED LINKS

REMARKS

To see the examples, type: "get-help HelpSample1 -examples".
For more information, type: "get-help HelpSample1 -detailed".
For technical information, type: "get-help HelpSample1 -full".
DSC のISE インテリセンスサポート向上

どれもやっとです。だいぶん楽になります。

  • Ctrl + Spaceでコンフィグレーション名の列挙がサポートされました
  • リソースのプロパティが列挙型の場合自動補完されるようになりました
  • DependsOn を使っているときに、他リソースの補完がきくようになりました
  • リソースのプロパティのタブ補完が強化されました
DSC のコンフィグレーション競合検知

以下のWeb-Server のインストールのように、同一コンフィグレーションでプロパティが一致している定義が複数あった場合、今後検知されます。

もしプロパティが違う値の場合は検知されないのでお気を付けを。

Configuration IIS_FrontEnd
{
    WindowsFeature FE_IIS         #Identical resource
    {
        Ensure = 'Present'
        Name = 'Web-Server'
    }

    WindowsFeature FTP
    {
        Ensure = 'Present'
        Name = 'Web-FTP-Server'
    }
}

Configuration IIS_Worker
{
    WindowsFeature Worker_IIS      #Identical resource
    {
        Ensure = 'Present'
        Name = 'Web-Server'
    }

    WindowsFeature ASP
    {
        Ensure = 'Present'
        Name = 'Web-ASP-Net45'
    }
}

Configuration WebApplication
{
    IIS_Frontend Web {}

    IIS_Worker ASP {}
}
Import-DscResource がバージョンサポート

バージョンの指定が可能になりました。

PowerShell v5 で複数バージョンのモジュールサイドロードが可能になったことを受けて、Import-DscResource もモジュールバージョンを指定可能になりました。 大事大事。

32bit 環境での Configuration キーワードサポート

これまで DSC は 64bit 環境でのみサポートされてましたが、32bit でもサポートされました。

DSC の Resource にかかわる更新

クラス構文による DSC リソースの記述サポート

いくつかの特殊な属性[DscProperty(Mandatory)][BaseFileResource]などを含めて、PowerShell のクラス構文で DSC リソース記述がサポートされました。

DSC リソーススクリプトのデバック

以下のCmdlet でデバッグすることが可能になりました。

  • Enable-DscDebug
  • Disable-DscDebug

やっとですよ。こんな感じですね。 WMF5 のデバッグ機能の強化はここに目標が集約されています。

Enter-PSSession -ComputerName MGMT-10001-827
Enter-PSHostProcess -Id 2640 -AppDomainName DscPsPluginWkr\_AppDomain
Debug-Runspace -Id 3
PsDscRunAsCredential の自動サポート

DSC を指定ユーザーで実行したいことありませんでしたか?わたしめちゃめちゃいつも思ってました。

別ユーザーのコンテキストで実行しようと思ったら、タスクスケジューラを使うなど迂回措置をとる必要があったためとてもうれしいサポートです。

例えば以下のような感じで、DependsOn プロパティ同様に自動的に PsDscRunAsCredential プロパティがサポートされました。

Configuration ChangeCmdBackGroundColor
{
    Node ("localhost")
    {
        Registry CmdPath
        {
            Key = "HKEY\_CURRENT\_USER\\\\Software\\Microsoft\\\\Command Processor"
            ValueName = "DefaultColor"
            ValueData = '1F'
            ValueType = "DWORD"
            Ensure = "Present"
            Force = $true
            Hex = $true
            PsDscRunAsCredential = get-credential
        }
    }
}

$configData = {
    AllNodes = (
    {
        NodeName="localhost";
        CertificateFile = "C:\publicKeys\targetNode.cer"
    })
}

ChangeCmdBackGroundColor -ConfigurationData $configData
DSCリソースのサイドバイサイドサポート

先述の通りです。同一コンフィグレーションで別バージョンのリソースを並列利用はできません。

標準リソースの追加
  • Windowsfeatureset

WindowsFeature のまとめて版ですね。中身はこれです。

gist.github.com

  • WindowsOptionalFeatureSet

WindowsOptionalFeature のまとめて版です。中身はこれです。

gist.github.com

  • ServiceSet

Service のまとめて版です。中身はこれです。

gist.github.com

DSC のLocal Configuration Manager (LCM) にかかわる更新

Partial Configuration のサポート

Configuration を複数DSCサーバーで分割することがサポートされました。

gist.github.com

Partial Configuration のルールは、コンフィグレーションは LCM で指定した対象と一致させることです。

この場合なら、OSConfig と SQLConfigですね。

Support for Mixed RefreshModes

PULL と PUSH を混ぜることが可能になりました。やったね!

gist.github.com

LCM 定義の新属性追加

圧倒的に書きやすくなりました。

gist.github.com

属性は以下の通りです。

Resource Name Description
LocalConfigurationManager DSCエンジンの実行にかかわる定義が可能になります。
PartialConfiguration Partial configuration 設定です。
ConfigurationRepositoryWeb Web-based configuration リポジトリの定義です。(HTTP/HTTPS ってことです)
ConfigurationRepositoryShare File share-based configuration リポジトリの定義です。(SMBってことです)
ResourceRepositoryWeb Web-based resource リポジトリの定義です。
ResourceRepositoryShare File-based resource リポジトリの定義です。
ReportServerWeb PULLシナリオにおける、Webベースでのレポートエンドポイントの定義です。
LCM 状態の詳細化

いままで Get-DscLocalConfigurationManager でやってもLCM は Busy / idle などわずかな状態しかわかりませんでした。が、細かくわかるようになりました。

  • Idle
  • Busy
  • PendingReboot
  • PendingConfiguration

LCMStateDetail プロパティで詳細がわかるようになっています。

RefreshFrequencyMins と ConfigurationModeFrequencyMins が倍数である必要がなくなりました

WMFv4 の屑かったポイントがまた治りました!

PULL での挙動はこんな感じになります。

LCM Meta 設定 Meta Configuration の値 Meta Configuration適用後の値 pull発生頻度[mins] Configuration の適用頻度 [mins]
ConfigurationModeFrequencyMins 70 70 40 70
RefreshFrequencyMins 40 40

PUSH での挙動はこんな感じになります。

LCM Meta 設定 Meta Configuration の値 Meta Configuration適用後の値 Configuration の適用頻度 [mins]
ConfigurationModeFrequencyMins 70 70 70
RefreshFrequencyMins 40 40
RefreshModeへの新規追加

これまでの PULL と PUSH 以外に Disabled が追加されました。LCM がこの設定にされると、MOFなどの管理を行わなくなります。Invoke-DscResource でDSCに適用はするけど、DSCの代わりに3rdパーティのCM利用時など、DSCを意図的に止めたいときにどうぞ。

gist.github.com

DSC の Cmdlet にかかわる更新

Configuration状態

今後、Get-DscConfigurationStatus で Configuration適用状態がわかりました。この更新では、より高度な情報を提供して、コンフィグレーションの適用状態がわかるようになります。

  • 全リソースの適用が失敗したか
  • 何かリソースで再起動がもとめられているのか
  • Configuration 適用時のMeta-Configuration 設定

gist.github.com

これで、Get-DscConfigurationStatusの実行でこのような出力が確認できます。

DurationInSeconds          : 0
Error                      : The SendConfigurationApply function did not succeed.
HostName                   : WINDOW10PRO
IPV4Addresses              : {169.254.54.128, 169.254.145.119, 169.254.40.31, 192.168.11.111...}
IPV6Addresses              : {fe80::2c05:b3b:8fb:281f%9, ::2000:0:0:0, ::1, ::2000:0:0:0...}
JobID                      : {4902A626-A5C8-11E5-9BDD-E0CB4EA477F0}
LCMVersion                 : 2.0
Locale                     : ja-JP
MACAddresses               : {E0-CB-4E-A4-71-CD, E0-CB-4E-A4-77-F0, 10-66-82-18-4D-F6, 10-66-82-18-4D-F6...}
MetaConfiguration          : MSFT_DSCMetaConfiguration
MetaData                   : Author: admin; Name: Hoge; Version: 2.0.0; 
                             GenerationDate: 12/19/2015 05:45:35; GenerationHost: 
                             WINDOW10PRO;
Mode                       : PUSH
NumberOfResources          : 2
RebootRequested            : False
ResourcesInDesiredState    : {[File]Hoge}
ResourcesNotInDesiredState : {[File]Fuga}
StartDate                  : 12/19/2015 5:45:35 AM
Status                     : Failure
Type                       : Initial
PSComputerName             : 127.0.0.1
CimClass                   : root/Microsoft/Windows/DesiredStateConfiguration:MSFT_DSCConfigurationStatus
CimInstanceProperties      : {DurationInSeconds, Error, HostName, IPV4Addresses...}
CimSystemProperties        : Microsoft.Management.Infrastructure.CimSystemProperties

あるべき状態じゃないリソースの詳細もわかります。 gist.github.com

ConfigurationName    : Hoge
DependsOn            : 
ModuleName           : PSDesiredStateConfiguration
ModuleVersion        : 1.1
PsDscRunAsCredential : 
ResourceId           : [File]Fuga
SourceInfo           : ::14::9::File
DurationInSeconds    : 0.027
Error                : The system cannot find the path specified. The related 
                       file/directory is: x:\fuga.  The related ResourceID is 
                       [File]Fuga.
FinalState           : 
InDesiredState       : False
InitialState         : 
InstanceName         : Fuga
RebootRequested      : False
ResourceName         : File
StartDate            : 12/19/2015 5:45:35 AM
PSComputerName       : 127.0.0.1

これですよ、ほしかったのは!

Test-DscConfigurationでの詳細情報取得

これですよ、ほしかったのは (再

gist.github.com

いずれもこのように表示されます。

InDesiredState             : False
ResourcesInDesiredState    : {[File]Hoge}
ResourcesNotInDesiredState : {[File]Fuga}
ReturnValue                : 0
PSComputerName             : 127.0.0.1

もちろん詳細もみれます。

ConfigurationName    : Hoge
DependsOn            : 
ModuleName           : PSDesiredStateConfiguration
ModuleVersion        : 1.1
PsDscRunAsCredential : 
ResourceId           : [File]Fuga
SourceInfo           : ::14::9::File
DurationInSeconds    : 0.012
Error                : 
FinalState           : 
InDesiredState       : False
InitialState         : 
InstanceName         : Fuga
RebootRequested      : False
ResourceName         : File
StartDate            : 12/19/2015 5:56:20 AM
PSComputerName       : 127.0.0.1

ようやく Pester の組み込みテストが楽になります。

DSCリソースメソッドへの直接アクセス

DSC リソースには、Set/Get/Test があります。これを直接叩く Cmdlet が追加されました。例えばこう。

gist.github.com

Set の実行結果です。

WARNING: LCM state is changed by non-DSC operations. If you wish to change the state of LCM, please use Remove-DscConfigurationDocument cmdlet.

RebootRequired 
-------------- 
False          

Get してみましょう。

ConfigurationName    : 
DependsOn            : 
ModuleName           : PSDesiredStateConfiguration
ModuleVersion        : 1.1
PsDscRunAsCredential : 
ResourceId           : 
SourceInfo           : 
Attributes           : {archive}
Checksum             : 
Contents             : 
CreatedDate          : 12/19/2015 5:59:13 AM
Credential           : 
DestinationPath      : d:\hoge\DirectAccess.txt
Ensure               : present
Force                : 
MatchSource          : 
ModifiedDate         : 12/19/2015 5:59:13 AM
Recurse              : 
Size                 : 44
SourcePath           : 
SubItems             : 
Type                 : file
PSComputerName       :

Testしてみましょう。

InDesiredState
--------------
True
MOF の転送のみCmdletの追加

MOF を転送したいけど、適用はしたくない。そんなときに使える Cmdlet としてPublish-DscConfiguration が追加されました。

PULL での次タイミングでの適用や、Update-DscConfiguration での任意実行まで実行が遅延されるので便利でしょう。

DSC Document (MOF) の削除

MOF は場合によっては壊れます。そんなときはRemove-DscConfigurationDocumentで削除できます。正確にはこれはWMF v4 の 2014年10月にWindows Update で配布された KB3000850 で追加されたCmdlet です。

あるべき状態の表現が適正化

これまでと異なり、Get-DscConfigurationStatusGet-DscLocalConfigurationManager で、LCM と DSC の状態を適切に返せるようになりました。

そのルールは以下の通りです。

  1. 実行されてないリソースは、LCM 状態やDSC状態に影響しません
  2. LCM は Resource が再起動を求めた時点で実行を停止します
  3. 再起動を求めたリソースは、再起動完了まで Desired State と自身の状態を返しません
  4. リソース適用が失敗した場合、LCM は失敗リソースに依存していない残りリソースの適用を試みます
  5. Get-DscConfigurationStatus cmdlet で返す状態は、全リソースの状態の総括です。個別ではありません
  6. PendingReboot状態は、PendingConfiguration状態の総括です

いくつかのシナリオでの状態をテーブルで示すとこうです。

Scenario LCMState Status RebootRequested ResourcesInDesiredState ResourcesNotInDesiredState
Idle Success $false S $null
PendingConfiguration Failure $false $null F S,F
PendingConfiguration Failure $false S F F,S
PendingConfiguration Failure $false S F S1, F, S2
PendingConfiguration Failure $false S1, S2 F F1, S, F2
PendingConfiguration Failure $false S F1, F2 S, r
PendingReboot Success $true S r F, r
PendingReboot Failure $true $null F, r r, S
PendingReboot Success $true $null r r, F
PendingReboot Success $true $null r
  • Si: A series of resources that applied successfully
  • Fi: A series of resources that applied unsuccessfully
  • r: A resource that requires reboot

各状態は以下で求められます。

gist.github.com

これと併せて、Get-DscConfigurationStatus の StartDateが string型 から DateTime型 に変わるなどの変更もしています。

Set-DscLocalConfigurationManager の -Force サポート

これまで、整合性確認などが走っていると Set-LocalConfigurationManager の実行が止められてました。これは、Set-LocalConfigurationManager cmdlet がLCM 操作を停止するためでしたが、今回 -Force スイッチを提供することで、強制実行が可能になります。

例えば、-Force 無しで実行すると

Set-DscLocalConfigurationManager -Path .\MetaTest1\ -Verbose

エラーとなることがありました。

VERBOSE: Performing the operation "Start-DscConfiguration: SendMetaConfigurationApply" on target "MSFT_DSCLocalConfigurationManager".
VERBOSE: Perform operation 'Invoke CimMethod' with following parameters, ''methodName' = SendMetaConfigurationApply,'className' = MSFT_DSCLocalConfigurationManager,'n
amespaceName' = root/Microsoft/Windows/DesiredStateConfiguration'.
VERBOSE: An LCM method call arrived from computer DEV-10586-465 with user sid S-1-5-21-2127521184-1604012920-1887927527-5557045.
Cannot invoke the Set-DscLocalConfigurationManager cmdlet. The Consistency Check or Pull cmdlet is in progress and must return before
Set-DscLocalConfigurationManager can be invoked. Use -Force option if that is available to cancel the current operation.
CategoryInfo : NotSpecified: (root/Microsoft/...gurationManager:String) [], CimException
FullyQualifiedErrorId : MI RESULT 1
PSComputerName : localhost
VERBOSE: Operation 'Invoke CimMethod' complete.
VERBOSE: Set-DscLocalConfigurationManager finished in 0.046 seconds.```

このような場合でも、-Force を使うことで実行できます。

VERBOSE: Performing the operation "Start-DscConfiguration: SendMetaConfigurationApply" on target "MSFT_DSCLocalConfigurationManager".
VERBOSE: Perform operation 'Invoke CimMethod' with following parameters, ''methodName' = SendMetaConfigurationApply,'className' = MSFT_DSCLocalConfigurationManager,'n
amespaceName' = root/Microsoft/Windows/DesiredStateConfiguration'.
VERBOSE: An LCM method call arrived from computer DEV-10586-465 with user sid S-1-5-21-2127521184-1604012920-1887927527-5557045.
VERBOSE: The -Force option was specified with the Stop operation. The current configuration has been successfully cancelled.
VERBOSE: An LCM method call arrived from computer DEV-10586-465 with user sid S-1-5-21-2127521184-1604012920-1887927527-5557045.
VERBOSE: [DEV-10586-465]: LCM: [ Start Set ]
VERBOSE: [DEV-10586-465]: LCM: [ Start Resource ] [MSFT_DSCMetaConfiguration]
VERBOSE: [DEV-10586-465]: LCM: [ Start Set ] [MSFT_DSCMetaConfiguration]
VERBOSE: [DEV-10586-465]: LCM: [ End Set ] [MSFT_DSCMetaConfiguration] in 0.0310 seconds.
VERBOSE: [DEV-10586-465]: LCM: [ End Resource ] [MSFT_DSCMetaConfiguration]
VERBOSE: [DEV-10586-465]: LCM: [ End Set ]
VERBOSE: [DEV-10586-465]: LCM: [ End Set ] in 0.1410 seconds.
VERBOSE: Operation 'Invoke CimMethod' complete.
VERBOSE: Set-DscLocalConfigurationManager finished in 0.421 seconds.

DSC の PULLにかかわる更新

任意でのDSC Configuration の適用

PULLでも任意のタイミングに適用したいでしょう。そんなときはUpdate-DscConfigurationで適用できます。正確にはこれはWMF v4 の 2014年10月にWindows Update で配布された KB3000850 で追加されたCmdlet です。

以下の挙動を示します。

  1. 現在とPULL Server側の Checksum が違うか検証します
  2. 同じ場合は、Sucess として Configuration を適用せず完了します
  3. 違う場合は、PULL から Configuration をダウンロードして適用します
ノードとConfigurationId の分離 - AgentId

これまで、LCM Meta 情報で、ConfigurationId としてホストを識別する GUID を設定してから、PULL サーバーにつなぐ処理が必要でした。しかし、もしコンフィグレーションを複数ホストで共有したい場合、DSC サーバーが自動的に AgentId として採番して同じ Configuration を適用できるようになりました。

Configuration名
  1. フレンドリー名 : これまで GUID で定義していた ConfigurationId の代わりに、好きな文字列 (例 : "SQL_Server")で適用するConfiguration 名を指定できるようになりました
  2. アサイン : 対象ノードにアサインするConfiguration はPULLサーバーで中央管理されます。このConfiguration名はLCM Meta Configurationの適用時にのみレジスターされます。レジスタ後は、サーバーがノードにどのConfiguration を適用するか通知します
  3. 複数/パーシャル Configuration : 対象ノードに複数のConfigurationが適用された場合、それらは Partial Configuration として扱われます。これが動作するために、対象ノードのLCM Meta Configurationは Partial Configuration を受け入れるようにしておく必要があります。Azure Automation では Partial Configuration をサポートしません
レジストレーション

ノードとの Configuration の連携は、これまでの Guid から Configuration名に変わりフレンドリーになりました。が、逆に推測可能になった側面もあります。そこでこのようなセキュリティに対応するため、DSCサーバーへのリクエスト時に Registration を求めることができるようになりました。

Node は DSC サーバーに自身を登録するときに、両者が知っている Shared Secret を利用し、オプショナルに Configuration 名も利用します。この Shared Secret はマシンごとに一意であることが求められ、推測困難な Guid などであることが推奨されます。

Shared Secred は、 LCM Meta-Configuration で RegistrationKey として設定します。

まぁ、これまでの ConfigurationId を使えばいいでしょう。

gist.github.com

DSC サーバーは、このRegistrationKey を Pullサーバーの特定パスにおいて、それをweb.config に設定します。デフォルトは、C:\Program Files\WindowsPowerShell\DscService です。

<add key="ConfigurationPath" value="C:\Program Files\WindowsPowerShell\DscService\Configuration">
<add key="ModulePath" value="C:\\Program Files\\WindowsPowerShell\\DscService\\Modules">
<add key="RegistrationKeyPath" value="C:\\Program Files\\WindowsPowerShell\\DscService">

最新の、xDSCWebService リソースを使って構成してください。

Configuration と Resource と Report Repository の分離

WMF5.0 から、より柔軟に構成できるように複数のPULL サーバーを指定可能になりました。各エンドポイントは個別に設定する必要があります。これにより、Resource と Configuration の読み込みサーバーを分離し、レポートサーバーも分離可能になりました。

これらは、LCM Meta Configuration で設定します。

gist.github.com

これを利用すると、PULL サーバーではないDSC サーバーから Resource のダウンロードを行い、また別の Report サーバーに報告するようにもできます。

gist.github.com

中央へのConfiguartionのレポート

DSC Configurationの詳細情報は、DSC Service が稼働しているサーバーに送信可能です。これは、Get-DscConfigurationStatus Cmdlet と同じ情報です。Configuration の適用完了時やエラー時に Report サーバーに報告されます。また、PULL / PUSH にかかわらず送信されるようになりました。この情報は DSC Service Database に保持されます。

gist.github.com

新OData エンドポイントは、DSC Service で作られステータス情報を公開します。Configuration Id や AgentId {$Guid}をエンドポイントになげることで、情報は保持、解析されます。

以下で、Report サーバーから情報を収集できます。

gist.github.com

PowerShell 監査

Transcription オプション

Transcription コマンドが強化されて、PoweShell.exe 以外の ISE などのホストプロセスでも Start-Transcription を実行可能になりました。

併せて、Transcription 機能も強化され、Transcription ヘッダーへの情報追加、Nested ScriptBlock の補足、出力ディレクトリの指定なども可能になりました。

また、グループポリシーの Administrative Templates -> Windows Components -> Windows PowerShell -> Turn on PowerShell Transcription や レジストリで設定可能です。

Script Tracing とロギング

Microsoft-Windows-PowerShell/Operational へのさらなる自動ロギングが強化されました。

これも グループポリシー Administrative Templates -> Windows Components -> Windows PowerShell -> Turn on PowerShell Script Block Logging やレジストリで設定可能です。

Cryptographic Message Syntax (CMS) cmdlets

証明書暗号を利用した イベントロギングのCMS暗号化が実装されました。これは、イベントログへのロギング強化に伴い、実行したScript Block などを見られるセキュリティリスクの回避のためです。

PackageManagement Cmdlets

aka. OneGet ですね!ソフトウェア検索、インストールとインベントリ(SDII) が可能になりました。以下の Cmdlet で可能です。

  • Find-Package
  • Find-PackageProvider
  • Get-Package
  • Get-PackageProvider
  • Get-PackageSource
  • Import-PackageProvider
  • Install-Package
  • Install-PackageProvider
  • Register-PackageSource
  • Save-Package
  • Set-PackageSource
  • Uninstall-Package
  • Unregister-PackageSource

この辺はまぁ過去にもいろいろ書いてるので飛ばします。

tech.guitarrapc.com

tech.guitarrapc.com

tech.guitarrapc.com

PowerShellGet による PowerShell Moduleの検索、インストール

PowerShellGet により PowerShell Module の展開が圧倒的に楽になります。

  • Find-Module で、-Tag を使ってモジュールメタデータのフィルタが可能です
  • Find-Module で、-Filterを使ってリポジトリ指定での検索が可能です
  • Find-Module で、-Command / - DscREsource と -Include パラメータを使って、モジュールをフィルタできます
  • Find-DscResource で、DSC Resource を検索できます
  • NuGet を利用してのインストール、公開が可能です

また、以下がサポートされます。

  • サイドバイサイドのバージョンインストールが可能です
  • Module に依存関係を持たせてインストールが可能です
  • 3つの新 Cmdlet が追加されています
    • Get-InstalledModule
    • Uninstall-Module
    • Save-Module

PowerShellGet による PowerShell Script の検索、インストール

PowerShellGet からは、モジュールだけではなく、スクリプトの検索も可能です。

Find-Script などの Cmdlet を利用可能です。

新Cmdlet と既存Cmdlet の更新

シンボリックリンクサポート

gist.github.com

Remove も一応サポートされてます。

gist.github.com

が、SimbolicLink 対象のファイル/フォルダがないと作成できないなど制約も多いです。

PS C:\WINDOWS\system32> New-Item -Type SymbolicLink -Path d:\hogemoge -Value d:\hogemogehogmoe
New-Item : Cannot find path 'D:\hogemogehogmoe' because it does not exist.
At line:1 char:1
+ New-Item -Type SymbolicLink -Path d:\hogemoge -Value d:\hogemogehogmo ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (D:\hogemogehogmoe:String) [New-Item], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.NewItemCommand

以前 C# で実装した、シンボリックリンクを使ったほうが融通きくのでどうぞ。

tech.guitarrapc.com

Archive cmdlets

Zip圧縮、解凍 Cmdlet がサポートされました。が、微妙にまだバグってて、Compress-Archive がかなり微妙な挙動をしています。

tech.guitarrapc.com

Clipboard cmdlets

これは便利で、クリップボードの中身を取り出せます。エクスプローラでファイルを複数選んでコピーしてから、Get-Clipboard -Format FileDropList とやるとその一覧が出力されます。

Convert-String Cmdlet

パターンマッチによる、ストリングのリプレース処理です。RegEx では大変なことも、このCmdlet を使うと直感的に書けます。

gist.github.com

Holmes, L.
Lee, S.
Snover, J.
ConvertFrom-String Cmdlet による文字列からの構造化オブジェクトの抽出と解析

パターンマッチングによる、自動解析Cmdlet です。詳しくは @mutaguchiさんのブログで。

winscript.jp

Format-Hex Cmdlet

めちゃめちゃ便利です。PowerShell Cmdlet でバイナリが見えます。

gist.github.com


           Path: C:\WINDOWS\system.ini

           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000   0D 0A 0D 0A 5B 6D 63 69 5D 0D 0A 72 2E 64 72 76  ....[mci]..r.drv
00000010   0D 0A 0D 0A 5B 6D 63 69 5D 0D 0A 72 2E 64 72 76  ....[mci]..r.drv
00000020   0D 0A 0D 0A 5B 6D 63 69 5D 0D 0A 72 2E 64 72 76  ....[mci]..r.drv
00000030   0D 0A 0D 0A 5B 6D 63 69 5D 0D 0A 72 2E 64 72 76  ....[mci]..r.drv
00000040   0D 0A 0D 0A 5B 6D 63 69 5D 0D 0A 72 2E 64 72 76  ....[mci]..r.drv
00000050   0D 0A 0D 0A 5B 6D 63 69 5D 0D 0A 72 2E 64 72 76  ....[mci]..r.drv
00000060   0D 0A 0D 0A 5B 6D 63 69 5D 0D 0A 72 2E 64 72 76  ....[mci]..r.drv
00000070   0D 0A 0D 0A 5B 6D 63 69 5D 0D 0A 72 2E 64 72 76  ....[mci]..r.drv
00000080   0D 0A 0D 0A 5B 6D 63 69 5D 0D 0A 72 2E 64 72 76  ....[mci]..r.drv
00000090   0D 0A 0D 0A 5B 6D 63 69 5D 0D 0A 72 2E 64 72 76  ....[mci]..r.drv
000000A0   0D 0A 0D 0A 5B 6D 63 69 5D 0D 0A 72 2E 64 72 76  ....[mci]..r.drv
000000B0   0D 0A 0D 0A 5B 6D 63 69 5D 0D 0A 72 2E 64 72 76  ....[mci]..r.drv
000000C0   0D 0A 0D 0A 5B 6D 63 69 5D 0D 0A 72 2E 64 72 76  ....[mci]..r.drv
000000D0   0D 0A 0D 0A 5B 6D 63 69 5D 0D 0A 72 2E 64 72 76  ....[mci]..r.drv
既存 Cmdlet への NoNewLine パラメータの追加

既存 Cmdlet に新パラメータ –NoNewlineが追加されました。対象は、Out-FileAdd-ContentSet-Content

gist.github.com

This is a single sentence.

便利ですね。

New-TemporaryFile Cmdldt

Tmp フォルダ$env:Tmpに一時ファイルを生成します。

New-TemporaryFile 

で、

    Directory: C:\Users\admin\AppData\Local\Temp


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       12/19/2015   7:53 AM              0 tmp78E9.tmp
New-Guid Cmdlet

ただのラッパーです。

[Guid]::NewGuid();
Guid
----
0f1e0d76-14e8-4e1f-8bee-f146f97fea69
New-Guid
Guid
----
b31f817b-30b5-47e0-8cff-753ff37fb337
Get-ChildItem に -Depth パラメータ追加

-Recurse で再帰的に検索したときの深度を設定可能になりました。ようやく!

Get-ChildItem -Recurse -Depth 0
FileInfoオブジェクトへの更新

2つのScriptProperty が追加されています。

  • FileVersionRaw : ファイルバージョンの表示
  • ProductVersionRaw : プロダクトバージョンの表示

gist.github.com

OriginalFilename  : PowerShell.EXE.MUI
FileDescription   : Windows PowerShell
ProductName       : Microsoft® Windows® Operating System
Comments          :
CompanyName       : Microsoft Corporation
FileName          : C:\WINDOWS\system32\WindowsPowerShell\v1.0\PowerShell.exe
FileVersion       : 10.0.10586.0 (th2_release.151029-1700)
ProductVersion    : 10.0.10586.0
IsDebug           : False
IsPatched         : False
IsPreRelease      : False
IsPrivateBuild    : False
IsSpecialBuild    : False
Language          : English (United States)
LegalCopyright    : © Microsoft Corporation. All rights reserved.
LegalTrademarks   :
PrivateBuild      :
SpecialBuild      :
FileVersionRaw    : 10.0.10586.0
ProductVersionRaw : 10.0.10586.0
モジュールへのバージョン範囲指定(1.*, etc)

2つのパラメータを用いて、バージョン範囲を指定できます。 -MinimumVersion, -MaximumVersion

Import-Module psreadline -verbose -MinimumVersion 1.0 -MaximumVersion 1.2.*

Information Stream Cmdlets

Standardoutput, Error, Verbose. Warning, Debug に続く新しい出力ストリームとして Information がサポートされました。

普段は見えませんが、InfomrationAction Continue を指定することでユーザーに表示させることができます。

Generate PowerShell Cmdlets based on OData Endpoint

興味ないのでスキップ

Network Switch Management with PowerShell

Windows Server 2012 R2 ロゴ認証のネットワークスイッチに対して、スイッチの操作が可能になりました。

使う人はどうぞ!

Software Inventory Logging (SIL)

ここだけ注意で!

IMPORTANT: When installing WMF 5.0 on a Windows Server 2012 R2 Server that is already running SIL, it is necessary to run the Start-SilLogging cmdlet once after the WMF install, as the installation process will errantly stop the Software Inventory Logging feature.

リリースノートにない機能

いくつか紹介しておきます。なんでリリースノートにないんでしょうね..。

Remote-Copy

これは、同一PSSession間において、Copy-Item で -ToSettion と -FromSession でコピーがマシン間を超えれるものです。

$session = New-PSSession -ComputerName RemoteMachine

# Local Machine -> Remote Machine のコピー
Copy-Item -Path C:\Hoge.ps1 -Destination C:\Source\test.csv -ToSession $session

# Remote Machine -> Local Machine のコピー
Copy-Item -Path C:\Hoge.ps1 -Destination C:\Source\srv.csv -FromSession $session
using namespace シンタックス

tech.guitarrapc.com

複数バージョン Module のサイドローディング

これまで PowerShell Module は、Modules 直下にモジュールが並び、中には1つのバージョンだけが存在できました。

PowerShell v5 からは、同一 Module であっても複数バージョンを同時にサイドローディング可能です。

自己証明書 Cmdlet の強化

自己証明書 は従来 mkcert が定番でしたが、 PowerShell 4.0 からNew-SelfSignedCertificate Cmdlet が追加されて限定的に作れるようになりました。

PowerShell 5.0 では更に強化されており、自在に証明書を作れるようになっています。

New-SelfSignedCertificate | Microsoft Learn

ゴミ箱のクリア

ゴミ箱をきれいにすることも PowerShell で可能になりました。それが Clear-RecycleBin Cmdlet です。

New-ScheduledTaskTrigger の -Weekly サポート

PowerShell v4 までは-Weekly がないため週1回の実行などが面倒でした。しかし PowerShell v5 では-Weekly スイッチがサポートされました。-Monthly はない模様。

New-ScheduledTaskTrigger -Weekly

なお、実行するとNewTriggerByWeekly メソッドがないというエラーが表示されますが、環境依存のようです。

Windows 10 TH2 (build 1511)でも再現するのですが、これは ScheduledTask モジュールが壊れてるので修正待ちですねぇ。

https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/11190663-bug-scheduledtasks-module-broken-in-1511windowsserver.uservoice.com

まとめ

WFMv5 は、コミュニティからのフィードバックがもっとも反映されたリリースになりました。

かなり紆余曲折があり、実装があっちにいったりこっちにいたっりしましたが、とりあえず使えるレベルでリリースされてよかったですね!

Windows 10 や 2016などOS依存系のCmdlet は、WMFv5をいれるだけでは入りません。

まずはぜひぜひお試しください。

*1:enum の enum はできない

*2:私はC#を書くことがおおいですが!きっと使うでしょう。