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ということは完全な製品版です。多くの機能がありますが、リリースノートをさくっと見ていきましょう。

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

過去の記事はこちら

https://tech.guitarrapc.com/entry/2014/09/05/065912

https://tech.guitarrapc.com/entry/2014/09/08/042747

https://tech.guitarrapc.com/entry/2014/09/08/050311

https://tech.guitarrapc.com/entry/2014/09/08/062313

https://tech.guitarrapc.com/entry/2014/09/08/081459

https://tech.guitarrapc.com/entry/2015/07/04/163454

リリースノート

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からどうぞ

https://www.microsoft.com/en-us/download/details.aspx?id=50395

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コンソールの強化のためにも、ご自分でいれてください。

https://github.com/lzybkr/PSReadLine

アンインストール

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

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)]で再生成してください。

詳細はここで。

https://technet.microsoft.com/en-us/library/dn807171.aspx

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セッションを利用します。

ノード名に 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)

詳細はここで。

https://gallery.technet.microsoft.com/Just-Enough-Administration-6b5ad370

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

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

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

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

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

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

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

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

https://tech.guitarrapc.com/entry/2014/09/08/081459

モジュールやスクリプト外部では定義した型が利用できなかったり、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)][DscProperty(Mandatory)]などを含めて、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のまとめて版ですね。中身はこれです。

https://gist.github.com/guitarrapc/b873d2ee87f7d0eed6cf

  • WindowsOptionalFeatureSet

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

https://gist.github.com/guitarrapc/ca95659b3b51faf8751e

  • ServiceSet

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

https://gist.github.com/guitarrapc/e4b5256e3740b1e114c4

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

Partial Configuration のサポート

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

https://gist.github.com/guitarrapc/60ae6268e58d705d5a28

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

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

Support for Mixed RefreshModes

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

https://gist.github.com/guitarrapc/1288d4f76e99e91dec11

LCM 定義の新属性追加

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

https://gist.github.com/guitarrapc/5540568a649f4f23cfe5

属性は以下の通りです。

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を意図的に止めたいときにどうぞ。

https://gist.github.com/guitarrapc/9ba608a2a8404093eb1d

DSC の Cmdlet にかかわる更新

Configuration状態

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

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

https://gist.github.com/guitarrapc/e6d92da5acb3ae3215a2

これで、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

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

https://gist.github.com/guitarrapc/1bd454c7ec2c88d9ac49

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での詳細情報取得

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

https://gist.github.com/guitarrapc/2f7cf144ec438b5909be

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

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が追加されました。例えばこう。

https://gist.github.com/guitarrapc/3e282fd441e2a3ba17b4

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-DscConfigurationStatusで、LCMとDSCの状態を適切に返せるようになりました。

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

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

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

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

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

https://gist.github.com/guitarrapc/2f59df48e2ab4dae8ec9

これと併せて、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を使えばいいでしょう。

https://gist.github.com/guitarrapc/78f1b53e46402350d486

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で設定します。

https://gist.github.com/guitarrapc/2713e19ac3e4b856200a

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

https://gist.github.com/guitarrapc/898b2f4910dc31d21149

中央へのConfiguartionのレポート

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

https://gist.github.com/guitarrapc/09847418b3d904dcebb3

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

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

https://gist.github.com/guitarrapc/a3161767a089b53de042

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

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

https://tech.guitarrapc.com/entry/2015/09/03/045447

https://tech.guitarrapc.com/entry/2015/10/26/011741

https://tech.guitarrapc.com/entry/2015/09/04/042449

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 の更新

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

https://gist.github.com/guitarrapc/2388ccc9ef013487fd9f

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

https://gist.github.com/guitarrapc/2388ccc9ef013487fd9f

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

PS> 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# で実装した、シンボリックリンクを使ったほうが融通きくのでどうぞ。

https://tech.guitarrapc.com/entry/2014/08/19/022232

Archive cmdlets

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

https://tech.guitarrapc.com/entry/2014/09/08/062313

Clipboard cmdlets

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

Convert-String Cmdlet

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

https://gist.github.com/guitarrapc/6123b168f38ec34fc32b

Holmes, L.
Lee, S.
Snover, J.

ConvertFrom-String Cmdlet による文字列からの構造化オブジェクトの抽出と解析

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

https://winscript.jp/powershell/285

Format-Hex Cmdlet

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

https://gist.github.com/guitarrapc/75a0a166278661f0c7e5


           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が追加されました。対象は、–NoNewline–NoNewline–NoNewline

https://gist.github.com/guitarrapc/9f5b9ecdb2c581a1010c

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 : プロダクトバージョンの表示

https://gist.github.com/guitarrapc/421b3a7a77bac176749f

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 シンタックス

https://tech.guitarrapc.com/entry/2015/08/30/082605

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

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

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

自己証明書 Cmdlet の強化

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

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

https://technet.microsoft.com/ja-jp/library/hh848633.aspx

ゴミ箱のクリア

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

New-ScheduledTaskTrigger の -Weekly サポート

PowerShell 4.0までは-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-1511

まとめ

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

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

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

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

*1:enumのenumはできない

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