【Deployment】 WDS だけで Windows 8 を仮想マシンに自動展開するとキーボードレイアウトが英語配列(101/102)になってしまう

##2013.4.19 スクリプトを修正 Windows Deployment Service(WDS) で Windows 8 を仮想マシンに自動展開しようとすると、キー配列が英語(101/102)になってしまいます。そのため、初回ログオン時にキーボードドライバを 106/109 に変更しなければなりません。 何とかこの現象を回避し、日本語でインストールしようと試みているのですがなかなかうまくいかず試行錯誤しておりました。 本件に関し、MVP の 小澤 真之 氏が BLOG にて以下の記事を投稿してくださいました。 WDS で Windows 8 を展開する際に日本語キーボードを設定する http://engineermemo.wordpress.com/2013/04/11/wds-%e3%81%a7-windows-8-%e3%82%92%e5%b1%95%e9%96%8b%e3%81%99%e3%82%8b%e9%9a%9b%e3%81%ab%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%82%ad%e3%83%bc%e3%83%9c%e3%83%bc%e3%83%89%e3%82%92%e8%a8%ad%e5%ae%9a%e3%81%99/ 要約すると、インストールに使用する install.wim ファイルに対して以下のコマンドを実行することで、既定のレイヤードドライバーを 106/109 に変更しておくという方法です。 dism /Image:C:\mount /Set-LayeredDriver:6 これならば言語ごとに install.wim を用意しておけば済むので、今のところ小澤さんが提案してくださったこの方法がベストだろうなぁ考えています。 が、そうはいっても別の(もうすこし変態的な)方法を考えたくなるのが人情というものです。 そこで、以下の PowerShell スクリプトを”インストール完了のタイミングを見計らってホスト側から"実行するってのはどうでしょう。※MDT 2012 Updat1 でタスクシーケンスを使用すれば、インストール完了後に実行できるかも ##仮想マシン名 $VMName = "test" ##設定したいLayeredDriver の値 $LayerdDriver = 6 ##仮想マシンの仮想ハードディスクのパスを取得 $HDD =…


【Management】DHCP フェールオーバーの構成が解除できない場合

Windows Server 2012 ではDHCP サーバーの構成をクラスタリングすることができることは、10万人位の方がご存知かと思います。 念のために簡単に紹介しておきます。 いままでの Windows Server DHCP サービスでは フェールオーバーすることはできず、1台の DHCP サービスが死んでしまった時のために、スコープを変えて別の DHCP サービスを用意しておく必要がありました。 Windows Server 2012 では、同じスコープを複数の DHCP サービスで共有し、ロードバランスならびにフェールオーバーが可能となりました。これにより、DHCP サービスの設計や導入が非常に楽になりました。 で、これはこれで便利なのですが、困ったこともあります。 一方の DHCP サーバーが死んでしまったとき、以下のようにスコープが消せないという問題が出ることがあります。 「スコープがフェールオーバーリレーションシップに含まれています。このスコープを関係から削除してください」 じゃぁ、ということで「フェールオーバーの構成解除」をしようとすると、以下のように「対象となるコンピューター上で、DHCP サーバーが実行されていません。」というエラーが出てしまい、にっちもさっちもいきません。   対象となるコンピューター上で、DHCPサーバー サービスが実行されていません。 フェールオーバーの構成を解除できませんでした。エラー: 1722 困ったときは Windows PowerShell です。間違いありません。 まずは、削除したいスコープのプロパティを開いて「フェールーバー」タブを確認しておきます。ここに書かれている「関係名」と「パートナーサーバー」をコマンドレットのパラメタとして使用します。 管理者モードで Windows PowerShell のコンソールを開き、以下の通りコマンドを入力します。 Remove-DhcpServerv4Failover -Name <関係名> –Force -Force を忘れずに指定してください。 警告が表示されることがあるのですが、フェールオーバー構成が削除されているはずです。 これで、スコープを削除することもできるようになっているはずです。  


【Azure】 No certificate was found in the certificate store with thumbprint に見舞われたら

Windows Azure を Windows PowerShell をはじめとするコマンドラインから管理するためのモジュールが以下からダウンロードしてインストールすることができます。 http://www.windowsazure.com/en-us/downloads/?fb=ja-jp これにより、Windows PowerShell のコマンドレットや、Azure.cmd コマンド等が使える用意なり、それはそれは大変便利な環境になります。 が、難点は、コマンドがどこを触っているのかさっぱりわからないこと。 特に、以前は証明書の作成も含めて自分でやらなければならなかった管理証明書(API証明書)のインストールやアップロードなんかは、以下のコマンドレットを使用して簡単に行えるようになりました。 Get-AzurePublishSettingFile このコマンドレットにより、AzureポータルからAzureサブスクリプション情報と管理証明書が格納された「 .publishsettings 」ファイルをダウンロードすることができます。ファイルのダウンロードと同時に、「管理証明書」に証明書が登録されます(超便利!) Import-AzurePublishSettingFile –PublishSettingFile <ダウンロードした .publishsettings ファイル> これにより、Get-AzurePublishSettingFile でダウンロードしたファイルを、ローカルの PowerShell 環境に取り込むことができます。もちろん、管理証明書もローカルにインストールされます(超便利!)。 Import-AzurePublishSettingFile コマンドレットを実行して .publishsettings ファイルを取り込むと何が行われるかというと、以下の通りです。 管理証明書(Azureサブスクリプションに登録されたものと同じもの)が現在のユーザーの[個人]-[証明書]にインストールされる %UserProfile%\AppData\Roaming\Windows Azure Powershell 配下に設定ファイルが作成される ここに保存したサブスクリプション情報が裏で使用されて管理プロセスが動きます。 これ、非常に便利なのですが、「環境をきれいにしよう」なんつってうっかりローカルの証明書を消してしまったりするとさぁ大変。 以下のようなエラーが出て、コマンドレットがことごとく使えなくなります PS C:\windows\system32> Select-AzureSubscription コマンド パイプライン位置 1 のコマンドレット Select-AzureSubscription 次のパラメーターに値を指定してください: (ヘルプを表示するには、「!?」と入力してください。) SubscriptionName: junichia Select-AzureSubscription : No certificate was…


【PowerShell】仮想マシンのリソース使用量を計測する

※この投稿は、PowerShell Adcent Calender 2012 に参加しています! Hyper-V 上の仮想マシンが使用しているリソースを計測するにはパフォーマンスモニターを使用することができました。 Measuring Performance on Hyper-V http://technet.microsoft.com/ja-jp/library/cc768535(v=bts.10).aspx しかし、パフォーマンスモニターの利用になれた方であればまだしも、通常は使用するカウンターの選定など、ちょっと面倒な面も否めません。 そこで、Windows Server 2012、Windows 8 に実装されている Hyper-V では、ゲスト OS のリソース使用量を容易に計測できる Windows PowerShell コマンドレットが用意されました。Measure-VM です。 パフォーマンスモニターが仮想マシンの正常性を計測することを主目的としていたのに対し、このコマンドレットの主な目的は「課金」です。例えば、ホスティングを担当する企業による利用を想定しています。 Measure-VM コマンドレットを使用すると以下の数値を取得することができます。 CPUの平均使用量(MHz) メモリの平均使用量(MB) メモリの最大使用量(MB) メモリの最少使用量(MB) ネットワーク(送信)の総使用量(MB) ネットワーク(受信)の総使用量(MB) ディスクの使用量(MB) ここで、CPUの「使用率」ではなく「使用量」であることに注意してください。先にも書いた通り、Mesure-VM の主目的は「課金」です。よって、CPU の使用率では意味がありません。なぜならば、使用している物理マシンによって使用率が変わる可能性が大きいからです。よって、Mesure-VM は使用率ではなく実際にゲスト OS が使用した CPU の使用量を MHz で出力するように設計されています。 ネットワークについても同様です。帯域の使用率ではなく、実際に送受信したデータ量を算出してることに注意してください。 いずれも、計測を開始してから Measure-VM コマンドレットを実行した瞬間までを計測します。 では使ってみましょう。 <計測開始> 計測を開始するには、ゲストOS のメータリング機能を有効にする必要があります。以下はゲストOS Server1…


【PowerShell】ドメインコントローラーのクローンを PowerShell で完全自動化

もうすっかり古いはなしになるのですが、9月28日、MSC 2012 で SC-006 セッションにご参加くださった皆様、ありがとうございました。 冒頭で、Windows Server 2012 で構築した仮想ドメインコントローラーを Windows PowerShell を使用してクローンするデモを行いました。 その際に使用したスクリプトを掲載します。 (公開されている資料に書かれているものに若干不具合がございました…すみません) それにしても、たったこれだけのスクリプトでDCが複製できてしまうなんて….Hyper-V 2012 + New AD すてきです。   スクリプトの実行環境は以下の通りです。(ITCAMP-FS は Hyper-V ホストです) スクリプトの解説は以下をご参照ください。 仮想化した DC を PowerShell で複製する http://www.slideshare.net/junichia/dc-powershell スクリプトは以下からダウンロードできます(大したもんじゃないですが…) スクリプトのダウンロード http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-56-58/8233.CloneDC.ps1 $SourceDC = "ITCAMP-DC02" $DistDC = "ITCAMP-DC03" $distPDCEmu = "ITCAMP-DC01" $SourceHyperVHost = "ITCAMP-FS" $DistHyperVHost = "ITCAMP-FS" $VMStore = "\\$DistHyperVHost\VMStore" $ConfirmPreference =…


【PowerShell】長時間バッチ処理中に停電でサーバーがシャットダウン!でも Workflow ならば安心です

Windows PowerShell 3.0 にはワークフロー機能が実装されています。もちろん、そのベースとなっているのは Windows Workflow Foundation 4.0 です。 例えば、以下のようなワークフローがあったとします。このワークフローでは、UserList.csv ファイルにの保存されたユーザー一覧を読みこんで、大量のユーザーを順次作成する処理を想定していると考えてください。 Workflow CreateUser {     Get-Content -Path \\junichia-vdi\tools\ps\wf\UserList.csv -Encoding String | `             Out-File -Path .\UserList_Unicode.csv -Encoding unicode     $UserList = Import-Csv -Path .\UserList_Unicode.csv     foreach  ($u in $UserList)     {         $UserID = $u.userID         Echo -InputObject "$(Get-Date) $UserID を作成します"         $password = convertto-securestring…


【PowerShell】PowerShell 3.0 を使用した Windows Server 2012 管理の自動化

2012年6月は、毎週1回、10:00~11:30に Windows PowerShell 3.0 のセミナーを継続的に開催しています。 これまでに、2回開催し、残すところあと2回となりました。 基礎編(終了) リモーティング編(終了) ワークフロー編(6月19日) 開発者編(PowerShell コマンドレットを使って管理アプリを作る)(6月25日) 既に満席となっておりお申込みいただくことはできないのですが、ひとまずワークフロー編までの資料を以下に公開しました。 随時アップデートしていく予定ですので、興味のある方はダウンロードしてお使いください。 Windows PowerShell 3.0 によるWindows Server 2012 管理の自動化 v2.0 2012.06.19 更新版(初級編+リモーティング編+ワークフロー編) View more presentations from Junichi Anno


【PowerShell】リモートコンピューターが再起動するまで待ち合わせるには

Windows PowerShell には Restart-Computer という便利なコマンドレットが用意されています。 Restart-Computer –ComputerName TARGETCOMPUTER とすれば、リモートコンピューターを再起動することができます。 もしリモートコンピューターに誰かがログオンしていても、-Force を指定することで強制的に再起動できます。もちろん管理者権限が必須です。 さて、ここで問題です。 リモートコンピューターに対して複雑な処理をしているとき、一度再起動が必要な処理があったとします。 もちろん、再起動後にも処理は継続しなければなりません。 どうしましょう? 例えば、以下のようなスクリプトを作れば、待ち合わせは可能です。 ※ 2012.6.18 14:21 スクリプトに不備があったので修正しました…すみません New-PSSession -ComputerName $ServerName Restart-Computer -ComputerName $ServerName -Force do #セッションが切断されるまで待ち合わせ {     Start-Sleep -Seconds 1 } Until ((Get-PSSession -ComputerName $ServerName).count -eq 0) do #セッションが再接続されるまで待ち合わせ {     Start-Sleep -Seconds 1     $S = New-PSSession -ComputerName $ServerName }…


【PowerShell】ループバック PS セッションとは

Windows PowerShell 3.0 では、PowerShell のセッションから一旦切断して、別のコンピューターから再度接続する…ということが可能になっています。 PowerShell Web Accessを使用すれば自宅からの再接続も可能となり、どこからでも仕事がしたいエンジニアにとっては垂涎の機能です。PSWAを経由すればスマートフォンからでも接続できます。すばらしいです。 ここで、こんな疑問が出てきます。 普通はサーバーに「ローカルログオン」して作業しているから、 そこに再接続できるとうれしいんですけど はい、可能です。 それがループバックPSセッションです。 仕組みも使い方も、リモーティングと全く同じです。 PowerShell コンソールを開いたら、以下のようにしてローカルコンピューターに対して PS セッションを開設します。 PS C:\> $Session = New-PSSession PS C:\> Enter-PSSession $Session [LOCALHOST] PS C:\> プロンプトが [LOCALHOST] となったことに注意してください。これで、ローカルコンピューターに PS セッションを経由して入り込んだことになります。 作業が完了したら PowerShell コンソールを閉じる前に以下のコマンドを入力します。 [LOCALHOST] PS C:\> Exit PS C:\> Disconnect-PSSession $Session Id Name            ComputerName    State         ConfigurationName        Availability — —-            ————   …


【PowerShell】Invole-Command –FilePath パラメタの魔法

Invoke-Command を使用するとリモートコンピューター上でコマンドレットを実行することができます。このとき、コマンドレット単体ではなく、スクリプトファイル(.ps1)を使用することができます。 Invoke-Command で .ps1 ファイルを使用する方法は2つあります。 Invoke-Command -ComputerName SV01 -FilePath .\hogehoge.ps1 Invoke-Command -ComputerName SV02 {.\hogehoge.ps1} 前者と後者の違い、わかりますか? 前者の場合は、スクリプトファイルのパスはローカルコンピューターです。後者の場合は、リモートコンピューター内のパスになります。 リモートコンピューターにコマンドレットが存在することさえ確認できていれば、スクリプトファイルをいちいち送信しなくてもよいというのは非常に便利なことです。 (参考)【PowerShell】Hyper-V 系コマンドレットを手元の Windows 7 から実行するには ~ Import-PSSession ちなみに、指定した ps1 ファイルに引数を指定したい場合にはどうしたらよいでしょう? 以下のように、-ArgumentList パラメタを使用して指定します。 Invoke-Command -ComputerName SV01 -FilePath .\hogehoge.ps1 -ArgumentList “Arg1",“Arg2",“Arg3" PowerShell…知れば知るほど奥が深いです。