しばたテックブログ

気分で書いている技術ブログです。

Nano ServerのPowerShellについてざっくりとした話

基本的にはこちらの記事の内容をかいつまんだ感じです。

https://technet.microsoft.com/en-us/windows-server-docs/compute/nano-server/powershell-on-nano-servertechnet.microsoft.com

technet.microsoft.com

まだ日本語に翻訳されてないみたいなので、自分の勉強がてらざっくりとまとめていきます。
そのうち翻訳されると思いますのでその際はこのエントリの内容も不要になるでしょう。

はじめに

本エントリの内容はWindows Server 2016 TP5およびGA版で確認しています。
製品版のWindows Server 2016、およびWMF 5.1が出る際はこのエントリの内容と違うことになっている可能性がありますので予めご了承ください。

PowerShellのエディションについて

PowerShell 5.1からプラットフォームに応じて以下の2つのエディションに分かれます。

  • Desktop Edition

    所謂これまでのPowerShell。
    Full Server/Server CoreやDesktop Windowsに搭載され、.NET Framework上で動作します。

  • Core Edition

    Nano ServerやWindows IoTに搭載されるサブセット版のPowerShell。
    .NET Core上で動作します。

エディションの判別

PowerShell 5.1では$PSVersionTablePSEditionプロパティが増え、DesktopまたはCoreが設定されるのでこの値を取得することでエディションの判別が可能になります。

PS C:\> $PSVersionTable  

Name                           Value  
----                           -----  
CLRVersion                     4.0.30319.34011
BuildVersion                   10.0.14284.1000  
PSVersion                      5.1.14284.1000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3  
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
SerializationVersion           1.1.0.1 
PSEdition                      Core

エディションの指定

requires -PSEditionステートメントでスクリプトを実行可能なエディションを指定できる様になるそうです。
指定例は以下。

#requires -PSEdition Core

モジュールとエディション

PowerShell 5.1からはモジュールのManifest keyにCompatiblePSEditionsというパラメーターが増え、モジュールがサポートするエディションを指定できる様になるそうです。
以下の様なコマンドで当該のエディションでサポートされるモジュールを取得できます...

Get-Module -ListAvailable | ? CompatiblePSEditions -Contains "Desktop"

が、Windows Server 2016 TP5で試した限りでは既存のモジュールにはこのパラメーターは設定されておらず、値を取得することはできませんでした。

【2016/09/27追記】
GA版でもこの点は変わっていませんでした。

Nano Server上のPowerShell

PowerShell CoreエディションではDesktopエディションに対して以下の機能が制限されています。

1. ADSI, ADO, and WMI type adapters

PowerShell CoreエディションにはADSI、ADO、WMI Type Adapterはありません。
これはADSI、ADO、WMI(V1)に関する機能が使えないという事も意味しています。

WMI(V1)が使えないという事は、Get-WmiObject等のWMI関連のコマンドレットが使えないという事で割と一大事なのですが、こちらに関してはCIM Type AdapterおよびCIM Cmdlet(Get-CimInstanceなど)が代わりに使え、古いWMI関連の機能を捨てる形となります。

2. Enable-PSRemoting, Disable-PSRemoting

Enable-PSRemotingDisable-PSRemotingコマンドレットは使えません。
PSRemotingの設定はOSイメージ作成時に行うため削除されています。

3. Scheduled jobs and PSScheduledJob module

PSScheduledJobモジュールは使えず、Scheduled Jobの機能を利用することはできません。
なお、通常のJobは利用可能です。

4. Computer cmdlets for joining a domain

Add-CompurterRemove-Computerコマンドレットは使えません。
ドメインへの参加はOSイメージ作成時に設定するため削除されています。

5. Reset-ComputerMachinePassword, Test-ComputerSecureChannel

Reset-ComputerMachinePasswordTest-ComputerSecureChannelコマンドレットは使えません。
ADSI Type Adapterが無いことに起因する感じでしょうか?

6. Profiles

PowerShell Coreエディションではプロファイルの機能が無くなり、$Profile変数も無くなっていました。
Nano Serverではコンソールログオンでの管理をあまり想定していない様なのでその影響を受けている感じでしょうか。

Set-PSSessionConfigurationを使ってリモート接続時にスタートアップスクリプトを実行するすることは可能です。

7. Clipboard cmdlets

クリップボード関連のコマンドレット(Get-ClipboardSet-Clipboard)は使えません。
Nano Serverではクリップボードの使いどころが無いので当然といった感じです。
ちなみにclip.exeも無くなってました。

8. EventLog cmdlets

イベントログ関連のコマンドレット(Clear-EventLogGet-EventLogLimit-EventLogNew-EventLogShow-EventLogRemove-EventLogWrite-EventLog)は使えません。
代わりにGet-WinEventNew-WinEventコマンドレットを使います。
単純に古いコマンドレットを捨てる形になる様です。

9. Get-PfxCertificate cmdlet

Get-PfxCertificateコマンドレットは使えません。
このコマンドレットは内部でSystem.Security.Cryptography.X509Certificates.X509Certificate2クラスを使っているのですが、このクラスが当初.Net Coreに含まれていなかった?*1ため使えない様に見受けられます。

【2016/12/27追記】
正確にいつなのかは不明なのですが、本日2016/12月の累積更新(KB3206632) を適用し、PowerShellのバージョンを 5.1.14393.1000 に上げたところGet-PfxCertificateが追加されていました。
リリースノートなどは出ていない様です。

10. TraceSource cmdlets

Get-TraceSourceSet-TraceSourceコマンドレットは使えません。
機能が削られた理由はよくわかりません。

11. Counter cmdlets

Get-CounterExport-CounterImport-Counterコマンドレットは使えません。
typeperfコマンドは使えますのでパフォーマンスカウンターに関してはこのコマンドで頑張る感じでしょうか?

12. Web-related cmdlets

Invoke-WebRequestInvoke-RestMethodNew-WebServiceProxySend-MailMessageConvertTo-HtmlといったWEBアクセスに関するコマンドレットは使えません。

Invoke-WebRequestInvoke-RestMethodが使えないのは非常に痛いです。

【2016/09/27追記】
GA版でも追加されませんでした...
オープンソース版のPowerShell Core(6.0.0.alpha)ではInvoke-WebRequestInvoke-RestMethodが追加されているので、もしかしたらGAに盛り込まれるやもと期待していたのですが残念です。

【2016/12/27追記】
正確にいつなのかは不明なのですが、本日2016/12月の累積更新(KB3206632) を適用し、PowerShellのバージョンを 5.1.14393.1000 に上げたところInvoke-WebRequestInvoke-RestMethodが追加されていました。
リリースノートなどは出ていない様です。

13. Logging and tracing using PSDiagnostics module

PSDiagnosticsモジュールの機能を使ったロギングやトレースはできません。

14. Get-HotFix

Get-HotFixコマンドレットは使えません。
Nano ServerではManaging updates in Nano Serverにある様にWMIを使ってアップデート管理をする方針の様です。

15. Implicit remoting cmdlets

暗黙的なリモート処理を行うためのExport-PSSessionImport-PSSessionコマンドレットは使えません。
暗黙的なリモートとは何かについてはこちらを参考にしてくだい。

16. New-PSTransportOption

New-PSTransportOptionコマンドレットは使えません。
機能が削られた理由はよくわかりません。

【2016/09/27修正】
GA版ではNew-PSTransportOptionコマンドレットが追加されていました。

17. PowerShell transactions and Transaction cmdlets

トランザクションは使えません。
トランザクションについては、正直使ってる人いるの?ってくらいの機能なので不要でしょう。

18. PowerShell Workflow infrastructure, modules, and cmdlets

ワークフローは使えません。
縄神様には申し訳ないですが残当。

19. Out-Printer

Out-Printerコマンドレットは使えません。
当然ですがOut-GridViewもありません。

20. Update-List

Update-Listコマンドレットは使えません。
理由はよくわかりませんが、単純に利用されないからでしょうか?

21. WMI v1 cmdlets

こちらについては1. ADSI, ADO, and WMI type adaptersで述べた通りです。

Nano ServerのWindows PowerShell Desired State Configuration

Nano ServerのDSCについては、Using DSC on Nano Server | Microsoft Docsを参考にすると良いでしょう。
こちらは日本語に翻訳済みで分かりやすくまとまっています。

*1:今は含まれています