kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

PowerShellで実行予定のタスクを列挙する

これはPowerShell Advent Calendar 12/14分の記事です。


PowerShell Advent Calendar 2014 : ATND

Windowsのタスクスケジューラ、結構便利に使えます。Windows Server 2003の時代は「もうちょっとなぁ」と思いつつも使っていましたが、Windows Server 2008/Vistaから「なにこれすごい」って状態になって、高価なジョブ管理ソフト買うまでもないような場合において、大変助かりました*1

UNIX系にあるcronのほうが便利なこともあるのですが、cronはいまだに「次の実行日」が表示されないので、たまにしか使わない人は書式間違えると悲惨なことになるので…。

タスクスケジューラを本格的に業務として使うには祝祭日が何とかなればと思いますが、そういうのは後付でスクリプトの中などで考えましょう。ちなみに私はフェイルオーバークラスタでもうまく動くようにさせてました。

さて、本題です。タスクスケジューラのAPIにはWindows Server 2003互換のV1と呼ばれるものと、Vista以降でしか使えないV2と呼ばれるものがあります。コマンドラインツールのschtasks.exeはV1とV2両方対応していますが、V2だけ考えればいいでしょう。コマンドでやるのは…という方向きにはAPIもあります。

Task Scheduler (Windows)

みんな大好きCOMです。タスク作って、トリガー定義して、アクション登録して…結構面倒です。列挙するだけでも大変ですが、そこでPowerShellですよ。

とりあえず、簡単なところで、「時間が指定されているタスクが何時に起動するか」という情報を列挙するワンライナー。業務でスケジュールしようと思うと、「ここが空いてそうだからこの時間に差し込む」ということをしばしば考えます。そういうときに便利です。もちろん、Windowsの標準レポートで出してくれるようになるのも歓迎なので、Microsoftさん待ってます*2

Task Scheduler will run information.

結果はこんな感じ。

f:id:kkamegawa:20141213170257p:plain

時間指定されているタスクは意外と多くありません。なんらかのトリガーが指定されているものが多いようです。

*1:特に「月末」が定義されたのが大きい

*2:ま、自分で作ってもいいくらいのものですが

Windows Server 2008 R2のHyper-V VHDをコピーする

この記事はPowerShell Advent Calendar 2014の12/6分の記事です。


PowerShell Advent Calendar 2014 : ATND

Hyper-VをPowerShellでコントロールする方法は以下の二つの方法があります。

・System Center Virtual Machine Manager(SCVMM)を使う(全OS対象)

・OS組み込みのコマンドレットを使う(Windows Server 2012以降)

これで困るのがSCVMM管理下にない、Windows Server 2008 / 2008 R2環境。めんどくさいWMIを使う必要があります。それは困るので何とかしたいということで作られたのがPSHyperVというオープンソースプロジェクト。


PowerShell Management Library for Hyper-V - Home

Windows Server 2008 / 2008 R2専用です。なぜかといえば、WMIの名前空間に互換性がないのと、2012以降は専用コマンドレットがあるためだと思います。今でもかなり使われているようでdiscussionには最近でも書き込みが見られます。

Windows Server 2012のコマンドレットと多少似ていますが、メンバーとかはかなり違うので、スクリプトをそのまま持っていくことはできないので、注意してください。ということで、サンプル代わりのバックアップ対象のVMのVHDを指定のフォルダにコピーするというスクリプトです。

素直にexport-vm使ってもいいのですが、もともとあまり安定しなかったWindows Backupの変わりなのでこんな感じでVHDのコピーをやってます。

Hyper-V's VHD backup only Windows Server 2008 R2. ...

 

 

 

 

PowerShellでHW-NICをリセットする(改)

この記事はPowerShellアドベントカレンダー2014の12/3分の記事です。


PowerShell Advent Calendar 2014 : ATND

先日NICをリセットするスクリプトネタで日記を書きましたが、さすがに毎回手動実行は面倒なので、イベントログの特定のイベントに引っ掛けて起動するようなタスクを作ってみました。

Reset Hardware NIC

それとともに複数のNICがあった場合(具体的にはHyper-Vの仮想NICを除外する)でも正しく実行されるように、HWのNICのみリセットするようにしてみました。

Call Reset-HWNIC.ps1 task on Server start delay 15 ...

こちらはOS起動のイベントを検知して、上記のスクリプトを実行するタスクスケジューラをエクスポートしたxmlファイルです。タスクスケジューラのXMLはなぜかUTF-16なので、もしこれを使う場合はUTF-16で保存してください。

PowerShell 4.0でNetwork Adapterをリセットする

Reset Network Adapter for Windows 8.1/Windows Serv ...

 ドメインコントローラーとメンバーサーバが不通になると、ドメインネットワークとして判定されているNICがプライベートネットワークになることがあります。

プライベートネットワークになると認証が必要になる環境ではつながらなくなるので、適度なタイミングでNICをリセットしますが、今まではGUIかWMIを使ってリセットする必要がありましたが、Windows 8.1以降に付属するPowerShell 4.0ではFunctionが用意されているので、楽になりました。

Enable-NetAdapter

汎用的にするならNIC名を環境から取得する必要がありますが、アドホックなやつなのでこんな感じで。NIC名はローカライズされているので、できればとったほうがいいですね。