タスクスケジューラを PowerShell で管理してみる。<Get 編 其の一>

管理ツール「タスクスケジューラ」(taskschd.msc)を PowerShell で操作するためには、モジュール「ScheduledTasks」のコマンドレットを使用します。

なお、このモジュールは、 Windows Server 2012 や Windows 8 以降の OS でしか使えません。

同じ PowerShell 3.0 を Windows Server 2008、Windows Server 2008 R2 、Windows 7 にインストールしてみましたが、使えませんでした。

 

PowerShell において、なんらかの設定情報を取得するためには " Get-***** " というコマンドレットを打つのが常道ですから、とりあえず " Get-ScheduledTask " を実行してみます。

すると、タスクの一覧を取得できました。

コマンドプロンプトで " SCHTASKS /Query " コマンドを実行した場合と似ています。

(PowerShell もコマンドプロンプトも、「管理者として実行」していない場合、アクセス権が及ばないタスクの情報は取得できません。)

 

続きを読む

ServerManager.exe

Windows Server 2008 の「サーバー マネージャ」と Windows Server 2008 R2 の「サーバー マネージャー」の実体は、「Microsoft管理コンソール(mmc.exe)」のスナップインの一つである「ServerManager.msc」でした。

 

 

一方、Windows Server 2012 や Windows Server 2012 R2 の「サーバー マネージャー」はプロセスとして独立し、「%systemroot%¥System32」にある「ServerManager.exe」になっています。

そのため、コマンドプロンプトや「ファイル名を指定して実行」に「ServerManager.msc」と打ち込んでも起動出来ません。

 

フォレストとドメインの機能レベルを下げてみた。

フォレストやドメインの機能レベルは、一度上げてしまったが最後、二度と下げる事はできない・・・

そう思ってました。

が、どちらも「2008R2以上のレベルから、2008まで」なら、下げられることを確認しました。

※Technetの下記ページによると、フォレストの機能レベルを下げる事ができるのは「Active Directory のごみ箱が有効になっていないとき」という条件付きだそうです。

AD DS のインストールおよび削除に関する新機能

 

 

上記ページには肝心の手段が書いていないのですが、PowerShellでできることが判明しました。

フォレストの機能レベルなら「Set-ADForestMode」、ドメインの機能レベルなら「Set-ADDomainMode」です。

※Windows Server2008R2の場合は、予め「ActiveDirectory」モジュールをインポートしておく必要があります。

 

 

これらのコマンドレットの必須パラメーターは二つだけです。

「-Identity」でドメイン名を、「-ForestMode(ないし-DomainMode)」で下げたいレベルを指定します。

フォレストのルートドメイン「test.com」でフォレストの機能レベルを2008にする場合は、

Set-ADForestMode -Identity test.com -ForestMode windows2008forest

と書きます。

 

 

この方法により、Windows Server 2012やWindows Server 2012R2のドメインコントローラーで、両機能レベルを「2012」や「2012R2」から「2008」まで下げることもできました。

※上げることもできました。

Get-Partition の方が Get-Volume より便利?

"Get-Partition" も、”Get-Vlume“ と同じく、Windows Server 2012 の PowerShell 3.0 から使えるようになったコマンドレットの一つです。

前回の記事では、"Get-Volume" コマンドレットは必ずしも “diskpart” コマンドにおける “list volume” の代用にはならないということを書きましたが、"Get-Partition" コマンドレットであれば代用どころかより豊富な情報が得られることを確認しました。

コンピューター上に存在するパーティションの一覧が、ご丁寧にディスク毎に分かれて表示されますし、その中にはちゃんと「EFI システムパーティション」(100MB)も載っています。

ただし、そのパーティションが「EFI システムパーティション」であるとはどこにも書いてません。「Type」という項目が「System」になっていることが特徴的だと言えますが、それだけです。(Cドライブなど、普通のパーティションは同項目が「Basic」になっています。)

 

 

またさらに、「予約」領域が、"Get-Partition" コマンドレットで表示出来ることを確認しました。「Type」は「Reserved」です。

この領域は、“diskpart” コマンドの "list partition" によって確認出来ますが、“list volume” や、「ディスクの管理」画面では表示されません。

Get-Volume で表示されないパーティションがあった。

Windows Server 2012 の PowerShell 3.0 から使えるようになったコマンドレットの一つに、"Get-Volume" というものが有ります。

特にオプションを付けずにそのまま実行すると、現状でそのコンピューター内に存在するパーティションが全て表示されます。

要するに "diskpart" コマンドにおける "list volume" と同じようなものか・・・ と思っていたのですが、必ずしもそうではないケースもあるということに気づきました。

 

 

普段、各種確認/検証作業は Windows Server 2012 の Hyper-V 上にある仮想マシンで行っているのですが、ふとした思いつきで、ホスト側でもこの "Get-Volume" コマンドレットを実行してみました。

すると、その結果には "diskpart" の "list volume" や、「ディスクの管理画面」には表示される「EFI システムパーティション」というパーティション(100MB)が表示されていません。

 

 

このパーティションは、"mountvol" コマンドにより表示される「現在のマウントポイントとボリューム名の考えられる値」の一覧にも表示されません。

そのため、このパーティションが "Get-Volume" コマンドレットの結果に表示されないのは、「マウントされていない」ことが原因ではないかと考えられます。

"mountvol" コマンドのオプションを調べてみると "/S" というものがあり、その効能は「EFI システムパーティションを与えられたドライブにマウントします。」となっています。

おそらく、この方法でこのパーティションをマウントしてやれば、"Get-Volume" コマンドレットの結果にも表示されるようになるのでしょう。

が、ホストの環境はあまり弄りたくないので未確認です。

 

 

netsh の運命や如何に。

Windows Server 2012 R2 のプレビュー版が、6月中には公開されるそうですね。

ソースは、Microsoft Cloud というMicrosoft社によるツイッターアカウントです。

 

 

Windows Server 2012 では、コマンドプロンプトで " netsh " を実行し、次に " interface " 等を実行した時点で「Windows の将来のバージョンで、TCP/IP の Netsh機能が削除される可能性があります。」と表示されます。そしてPowerShell への移行を促されます。

さて、Windows Server 2012 R2 ではどうなっているでしょうか。

 

 

本当に無くなるのはさらに次のバージョンかもしれませんが、 "netsh" が無くなるとすると、これまで蓄積してきたスクリプト等の資産に少なからぬダメージがあるのではと思います。Windows Server 2008 R2 以降はパケットキャプチャまで出来ますからね。

Windows Server 2003 では OS 自体に標準で付属していたキャプチャツール「 Network Monitor 」が、Windows Server 2008 以降はダウンロードツールになりました。

商用稼働中のサーバーの場合、障害調査のためといえど、パケットキャプチャのためにフリーソフトをインストールすることなど言語道断!なケースもあります。たとえ Microsoft 純正であっても。そんな時には、 "netsh>trace" コマンドが有効な手段となりました。

パケットだけでなくネットワーク関連の様々な情報をまとめて採取出来るので、パケットキャプチャ自体が不要だったとしても、ネットワークの障害調査には有用なコマンドだと思います。

 

 

今のところ、Windows Server 2012 標準のPowershell v3.0 には、パケットキャプチャのコマンドレットは無いようです。Windows Server 2012 R2 には新しいバージョンが搭載されるのでしょうか。あるいは、バージョン自体は同じでモジュールの数が増えるのでしょうか。今から楽しみです。

 

 

ちなみに、Windows Server 2012 の PowerShell で "Get-Wild" と実行すると・・・

何も起こりません。

Windows Server 2012 R2  に期待します。

AT コマンドが廃止されてた。

Windows の「タスクスケジューラ」にタスクを登録するコマンドとしては、"at" , "schtasks" の2つがありますが、Windows Server 2012 で "at" コマンドを実行すると、「それもう廃止されたから "schtasks" 使ってね。」という旨のメッセージが表示されます。

 

"at" コマンドの特徴として、登録したタスクが、既定では [SYSTEM] アカウントにより実行される、という点が挙げられます。

[SYSTEM] アカウントとは、通常はコンピューターの内部処理に使われるものであり、ユーザーがこのアカウントを用いて対話的にログオンする事は出来ません。

大変強い権限があるため、Administrator でもアクセス許可が無い「何か」へアクセスするタスクは、"at" コマンドで作成すると便利です。

 

 

その "at" コマンドが無くなってしまいました・・・

では 今後、[SYSTEM] アカウントによりタスクを実行したい場合はどうしたらよいのでしょうか?

手段を3つ考えてみました。(Windows Server 2008 R2 SP1 および Windows Server 2012 にて確認。)

 

 

<1> まず一番簡単なのは、手動による変更です。

GUI (タスクスケジューラ)ないし "schtasks" コマンドにより作成したタスクは、GUI 上の操作(タスクを右クリック -> プロパティの[全般]タブ内)でその実行ユーザーを変更することが可能なので、 [SYSTEM] アカウントに変更します。

 

 

<2> タスクの作成および作成後に、GUIでの操作が一切出来ないというケースもあるかと思います。

そのような場合には、"schtasks" コマンドによりタスクを作成する際に、実行ユーザーを指定するオプション "/RU" の引数に [SYSTEM] と記述します。(パスワードの入力は不要です。)

 

 

<3> "schtasks" コマンドによる、「XML ファイルのインポート」という手もあります。

GUI上でタスクを右クリックし、「エクスポート」を選択することで、実行ユーザー等の設定情報が記述されたXMLファイルが保存されます。

あらかじめ [SYSTEM] アカウントにより実行されるよう設定したタスクをエクスポートしておき、"schtasks" コマンドによりタスクを作成する際、XMLファイルを読み込むオプション "/XML" の引数としてそのXMLファイルのフルパスを記述します。

これにより、"/RU" オプション無しでも、 [SYSTEM] アカウントにより実行されるタスクが作成されます。

※"/RU" オプションにより、XML内の記述と異なる実行ユーザーを指定した場合は、"/RU" オプションが優先されます。

 

 

このXMLファイルには、実行ユーザー以外にもタスクの設定情報が多く記述されていて、メモ帳でも編集可能です。

"schtasks" コマンドによりタスクを作成する際のオプションとしては存在しない設定も、どうやら編集出来るようなので、覚えておいて損は無い方法だと思います。

Windows Server バックアップを、PowerShell でやってみる。<おまけ>

導入編でも書きましたが、Windows Sewrver 2008 R2 SP1 で Windows Server バックアップ機能を利用するためには、事前にサーバーマネージャーにて「機能の追加」をしておく必要があります。

せっかくなので、それも PowerShell でやってみようと思います。方法は、Technet の記事「サーバーの役割と機能を追加する」を参考にしました。

 

 

機能の追加は "add-windowsfeature" というコマンドレットで出来るのですが、Windows Sewrver 2008 R2 SP1 に標準搭載されている PowerShell 2.0 では、最初はこのコマンドレットを使用出来ません。

先に、”import-module servermanager” というコマンドレットを実行しておく必要があります。こうして 「servermanager モジュール」を読み込んでおかないと、"add-windowsfeature" 等のサーバーマネージャー関連のコマンドレットは使えないようです。

※PowerShell を終了してしまうと、次に起動した際には読み込まれていない状態に戻ります。

※Windows Server 2012 に標準搭載されているPowerShell 3.0 では、インポートの手間は不要です。"add-windowsfeature" を実行した時点で、必要な「servermanager モジュール」が自動的に読み込まれます。

 

 

モジュールの読み込みが出来たところで、"get-windowsfeature" というコマンドレットを実行してみます。これにより、現時点での役割や機能を確認出来ます。

一覧の中で Windows Server バックアップ の箇所を見てみると、

[   ]  Windows Server バックアップ            Backup-Features

       [   ]  Windows Server バックアップ      Backup

       [   ]  コマンドライン ツール                     Backup-Tools

となっています。左端の [   ] が空なので、現時点では追加されていないことが分かります。真ん中が「Display Name」で、右端が「Name」です。コマンドレット実行時には「Name」を使います。

 

 

では実際にこれらの機能を追加してみましょう。 "add-windowsfeature backup-features" を実行します。進捗状況が画面上部に表示され、完了後に表示されるメッセージから再起動の必要があるかどうかも分かります。

完了後、あらためて "get-windowsfeature" をしてみると、以下のようになっています。

[ X ]  Windows Server バックアップ            Backup-Features

         [ X ]  Windows Server バックアップ      Backup

         [     ]  コマンドライン ツール                     Backup-Tools

この状態では、PowerShell を用いたバックアップは行えませんので、"add-windowsfeature backup-tools" を実行することで

[ X ]  Windows Server バックアップ            Backup-Features

          [ X ]  Windows Server バックアップ      Backup

          [ X ]  コマンドライン ツール                     Backup-Tools

とします。

この状態でなら、”add-pssnapin windows.serverbackup“ が実行可能になります。

 

 

なお、最初からコマンドラインツールも含めて追加するためには、下記のようなコマンドレットを実行します。

例 1.  "add-windowsfeature backup-features -includeallsubfeature"

例 2.  "add-windowsfeature backup-features , backup-tools"

また、add の代わりに remove を用いることで、役割や機能を削除することが可能です。