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 がリリースされました。
そう、RTM ということは完全な製品版です。多くの機能がありますが、リリースノートをさくっと見ていきましょう。
サクッとみたのに長いです。
- 過去の記事はこちら
目次
- 2015/12/24 追記
- 本文
- 目次
- リリースノート
- サポートOS環境
- ダウンロード
- インストール
- 既知の問題
- 初回のみPoweShell ショートカットが動作しない
- DSC
- 破壊的変更 : 証明書による暗号化が失敗する
- Start-DscConfiguration など一部 Cmdlet がエラー
- WMF 5.0 Production Preview に上書きして WMF 5.0 RTM をインストール
- Get-DscConfiguration -Debug するとLCM状態が不安定になる
- Stop-DscConfiguration -Debug するとハング
- DSCResource の Verbose メッセージがLCMをDebugModeにしていると見えない
- Invoke-DscResource の実行がGet-DscConfigurationStatus cmdletで取得できない
- Get-DscConfigurationStatus が Pull実行結果を Consistency として返す
- Invoke-DscResource が呼び出し先のメッセージを返さない。
- Invoke-DscResource を使うと DSC Resource がデバッグしにくい
- 一つのノードに対して様々な Partial Configuration を適用するとどのリソースなのか判別できない
- Start-DscConfiguration –UseExisting が -Credential パラメータを受け付けない
- ノード名に IPv6 Addresses
- Class-Based DSC Resources のデバッグ
- DSC Class-Based Resource で$scriptスコープで定義した変数が他のDSCResource で利用できない
- PSDscRunAsCredential 使用時のデバッグ
- DSC Composite Resources で PsDscRunAsCredential が利用できない
- Get-DscResource -Syntax が PsDscRunAsCredential を正しく反映しない
- Windows 7 で WindowsOptionalFeature がサポートされていない
- Set-DscLocalConfigurationManager を WMF4.0 や WMF5.0 PP に実行しても失敗する
- 機能一覧
- Just Enough Administration (JEA)
- クラス構文を用いたユーザー定義型の作成
- 実行中PowerShellスクリプトのデバッグ
- DSC の Configuration にかかわる更新
- DSC の Resource にかかわる更新
- DSC のLocal Configuration Manager (LCM) にかかわる更新
- DSC の Cmdlet にかかわる更新
- DSC の PULLにかかわる更新
- PowerShell 監査
- PackageManagement Cmdlets
- PowerShellGet による PowerShell Moduleの検索、インストール
- PowerShellGet による PowerShell Script の検索、インストール
- 新Cmdlet と既存Cmdlet の更新
- Information Stream Cmdlets
- Generate PowerShell Cmdlets based on OData Endpoint
- Network Switch Management with PowerShell
- Software Inventory Logging (SIL)
- リリースノートにない機能
- まとめ
リリースノート
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 からどうぞ
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 コンソールの強化のためにも、ご自分でいれてください。
アンインストール
以下のコマンドを実行することでアンインストールできます。
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)
詳細はここで。
これまで 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 の時点では以下のように使えました。
モジュールやスクリプト外部では定義した型が利用できなかったり、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 のまとめて版ですね。中身はこれです。
- WindowsOptionalFeatureSet
WindowsOptionalFeature のまとめて版です。中身はこれです。
- ServiceSet
Service のまとめて版です。中身はこれです。
DSC のLocal Configuration Manager (LCM) にかかわる更新
Partial Configuration のサポート
Configuration を複数DSCサーバーで分割することがサポートされました。
Partial Configuration のルールは、コンフィグレーションは LCM で指定した対象と一致させることです。
この場合なら、OSConfig と SQLConfigですね。
Support for Mixed RefreshModes
PULL と PUSH を混ぜることが可能になりました。やったね!
LCM 定義の新属性追加
圧倒的に書きやすくなりました。
属性は以下の通りです。
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を意図的に止めたいときにどうぞ。
DSC の Cmdlet にかかわる更新
Configuration状態
今後、Get-DscConfigurationStatus
で Configuration適用状態がわかりました。この更新では、より高度な情報を提供して、コンフィグレーションの適用状態がわかるようになります。
- 全リソースの適用が失敗したか
- 何かリソースで再起動がもとめられているのか
- Configuration 適用時のMeta-Configuration 設定
- 他
これで、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での詳細情報取得
これですよ、ほしかったのは (再
いずれもこのように表示されます。
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 が追加されました。例えばこう。
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-DscConfigurationStatus
と Get-DscLocalConfigurationManager
で、LCM と DSC の状態を適切に返せるようになりました。
そのルールは以下の通りです。
- 実行されてないリソースは、LCM 状態やDSC状態に影響しません
- LCM は Resource が再起動を求めた時点で実行を停止します
- 再起動を求めたリソースは、再起動完了まで Desired State と自身の状態を返しません
- リソース適用が失敗した場合、LCM は失敗リソースに依存していない残りリソースの適用を試みます
Get-DscConfigurationStatus
cmdlet で返す状態は、全リソースの状態の総括です。個別ではありません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
各状態は以下で求められます。
これと併せて、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 です。
以下の挙動を示します。
- 現在とPULL Server側の Checksum が違うか検証します
- 同じ場合は、Sucess として Configuration を適用せず完了します
- 違う場合は、PULL から Configuration をダウンロードして適用します
ノードとConfigurationId の分離 - AgentId
これまで、LCM Meta 情報で、ConfigurationId としてホストを識別する GUID を設定してから、PULL サーバーにつなぐ処理が必要でした。しかし、もしコンフィグレーションを複数ホストで共有したい場合、DSC サーバーが自動的に AgentId として採番して同じ Configuration を適用できるようになりました。
Configuration名
- フレンドリー名 : これまで GUID で定義していた ConfigurationId の代わりに、好きな文字列 (例 : "SQL_Server")で適用するConfiguration 名を指定できるようになりました
- アサイン : 対象ノードにアサインするConfiguration はPULLサーバーで中央管理されます。このConfiguration名はLCM Meta Configurationの適用時にのみレジスターされます。レジスタ後は、サーバーがノードにどのConfiguration を適用するか通知します
- 複数/パーシャル 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 を使えばいいでしょう。
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 で設定します。
これを利用すると、PULL サーバーではないDSC サーバーから Resource のダウンロードを行い、また別の Report サーバーに報告するようにもできます。
中央へのConfiguartionのレポート
DSC Configurationの詳細情報は、DSC Service が稼働しているサーバーに送信可能です。これは、Get-DscConfigurationStatus
Cmdlet と同じ情報です。Configuration の適用完了時やエラー時に Report サーバーに報告されます。また、PULL / PUSH にかかわらず送信されるようになりました。この情報は DSC Service Database に保持されます。
新OData エンドポイントは、DSC Service で作られステータス情報を公開します。Configuration Id や AgentId {$Guid}をエンドポイントになげることで、情報は保持、解析されます。
以下で、Report サーバーから情報を収集できます。
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
この辺はまぁ過去にもいろいろ書いてるので飛ばします。
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 の更新
シンボリックリンクサポート
Remove も一応サポートされてます。
が、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# で実装した、シンボリックリンクを使ったほうが融通きくのでどうぞ。
Archive cmdlets
Zip圧縮、解凍 Cmdlet がサポートされました。が、微妙にまだバグってて、Compress-Archive
がかなり微妙な挙動をしています。
Clipboard cmdlets
これは便利で、クリップボードの中身を取り出せます。エクスプローラでファイルを複数選んでコピーしてから、Get-Clipboard -Format FileDropList
とやるとその一覧が出力されます。
Convert-String Cmdlet
パターンマッチによる、ストリングのリプレース処理です。RegEx では大変なことも、このCmdlet を使うと直感的に書けます。
Holmes, L. Lee, S. Snover, J.
ConvertFrom-String Cmdlet による文字列からの構造化オブジェクトの抽出と解析
パターンマッチングによる、自動解析Cmdlet です。詳しくは @mutaguchiさんのブログで。
Format-Hex Cmdlet
めちゃめちゃ便利です。PowerShell Cmdlet でバイナリが見えます。
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-File
、Add-Content
、Set-Content
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 : プロダクトバージョンの表示
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 シンタックス
複数バージョン Module のサイドローディング
これまで PowerShell Module は、Modules 直下にモジュールが並び、中には1つのバージョンだけが存在できました。
PowerShell v5 からは、同一 Module であっても複数バージョンを同時にサイドローディング可能です。
自己証明書 Cmdlet の強化
自己証明書 は従来 mkcert が定番でしたが、 PowerShell 4.0 からNew-SelfSignedCertificate
Cmdlet が追加されて限定的に作れるようになりました。
PowerShell 5.0 では更に強化されており、自在に証明書を作れるようになっています。
ゴミ箱のクリア
ゴミ箱をきれいにすることも 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をいれるだけでは入りません。
まずはぜひぜひお試しください。