June, 2009 - フィールドSEあがりの安納です - Site Home - TechNet Blogs

フィールドSEあがりの安納です

Microsoft Evangelist -- Junichi Anno

June, 2009

  • 【書籍】Windows Server 2008 実践ガイド (MVP 村嶋さん)

    話は違うのですが、Imagine Cup ってご存知ですか?ワールドワイドで実施されている、マイクロソフト主催の学生向けの技術コンテストです。

    Japan Team のBLOG

    毎年、決勝戦が世界各地で開かれるのですが、今年はなんとエジプト!アカデミックチームは、明後日、カイロに向けて出発するようです。うらやますぃ…。

    以下の写真は決勝戦が行われる会場(設営中)なのですが、ご覧のとおり、砂漠の中で行われます。真ん中に一番に大きく見えるのがカフラー王のピラミッドで、左右がメンカウラー王とクフ王のピラミッドです。スフィンクスはギリギリこの写真では判別できませんが、右端になります。ツアーで訪れると、通常、右にあるクフ王(実際には一番背が高い)のピラミッドの「向こう側」から入場してきますが、そこからだとこの写真のように3つのピラミッドを絶好のコンディションで見ることができません。このような絶好のビュースポットには、ラクダを雇ってたどり着くことになりますが、価格交渉が疲れるんですよねぇ(笑)。ここだけの話ですが、安くラクダツアーに参加するには、カイロにある日本人宿で申し込むのが良いです。この写真の右側には(切れていて見えないですが)らくだツアーの集落があります。

    0629_pyramids_215

    ちなみに、最近のエジプトのビザはシールだって知ってました?2007 2004 年に行ったときには普通の印紙だったんですけどね。昨年訪れたとき、私は知らずに、裏面を舐めまくってしまいました…(恥)。アカデミックチームのメンバーも同じ間違いをして恥をかくように、心から遠くから祈っています。

    さて、何の話でしたっけ?あ、書籍でした。

    MVPの村嶋さんが執筆された書籍、「Windows Server 2008 実践ガイド」がリリースされました。700ページで3800円!これは安いです。

    なぜ、あえてここでご紹介しているかといいますと、かゆいところに手が届いているんですねぇ。すごく。

    実践ガイドというだけあって、Windows Server を一から構築していく手順が書かれているのですが、手順にとどまらず、なぜそういう設定をするのか、いま何をやっているのかという点がきちんと解説されています。村嶋さんらしく、ネットワーク系の実装については、力が入っていますね。

    マイクロソフトの情報は、とかく「新機能」に偏ったものになりがちなのですが、この書籍では本来のWinodws Serverをきちんと解説してくれています。

    是非ともこの本を手にとって見てください。

    あと、アカデミックチームの皆さんは気をつけていってらっしゃい!日本チームの優勝を祈っています!

  • 【Management】KMS で 12293 エラー が出たら Software Licensing を再起動する

    久しぶりにKMS(Key Management Service)に関する投稿です。

    以下のコマンドを使用して、Windows Server にボリュームライセンスをインストールすると、サーバーは自動的にKMSとなります。

    slmgr –ipk <ボリュームライセンスキー>

    KMSが正しく動作するには、KMSサーバーは DNSに  _VLMCS._tcp を登録できなければなりません。

    私の手元の環境でKMSのテストをしていたところ、KMSサーバーのアプリケーションログに Event ID 12293(hr=0x800705B4) が出て、どうしてもDNSにサービスレコードを登録することができませんでした。

    image

    どうやらこれは、DNSへのレコード登録の際にタイムアウトが発生した..というものらしいのですが、再起動してもライセンスを再入力しても解決できませんでした。

    そこで、ためしに Software Licensing  サービスを再起動してみたところ…

    image

    あっさりと登録ができてしまいました。

    image

    こんな現象、どこかで見たことがありますね…そう、ADインストール直後です。DNSにAD関連のレコードが登録されないときも、NetLogonサービスを手動で再起動するという手がありました。

    根本的な解決策ではないのですが、試してみてください。

  • 【IDM】TechNet Magazine:Windows PowerShell でユーザー プロビジョニングを自動化する

    とうとう7月になってしまいました。失礼しました、なぜか勘違いしていました)みなさまいかがお過ごしでしょうか。わたしは、提出物に追われて胃が痛くなっています。

    さて、TechNet Magazine で、「PowerShell によるユーザープロビジニングの自動化」に関する連載が、ひっそりと行われていたことをご存知でしょうか?

    プロビジョニングという大げさな言葉が使われてはいますが、実はさほど複雑なものではありません。

    CSVファイルからデータを読み込み、PowerShellで加工してActive Directoryに登録するという一連の流れをPowerShellで実現しています(状態の変更や削除といった作業については触れられていません)。

    image

    第1回 CSVファイルの読み込み
    http://technet.microsoft.com/ja-jp/magazine/2009.03.windowspowershell.aspx

    第2回 Active Directoryへのユーザー作成とExchange 2007 メールボックス作成
    http://technet.microsoft.com/ja-jp/magazine/2009.04.windowspowershell.aspx

    第3回 ファイルサーバーへのホームディレクトリの作成とアクセス権の設定
    http://technet.microsoft.com/ja-jp/magazine/2009.05.powershell.aspx

    第4回 ユーザーをセキュリティグループに参加させる
    http://technet.microsoft.com/ja-jp/magazine/2009.06.windowspowershell.aspx

    この全4回の連載を読破すれば、

    • プロビジョニングの基本的な考え方
    • PowerShellを使用したテキストファイルの操作方法
    • PowerShellを使用した基本的なActive Directoryの操作
    • PowerShellからDOSコマンドを呼び出す方法

    が習得できるはずです。

    お勧めです!

  • testtesttesttest

    ネットワーク ポリシー サーバーがユーザーにアクセスを許可しました。

    ユーザー:
     セキュリティ ID:   NULL SID
     アカウント名:   TSGW01\Administrator
     アカウント ドメイン:   -
     完全修飾アカウント名: -

    クライアント コンピュータ:
     セキュリティ ID:   NULL SID
     アカウント名:   -
     完全修飾アカウント名: -
     OS バージョン:   -
     被呼端末 ID:  UserAuthType:PW
     起呼端末 ID:  -

    NAS:
     NAS IPv4 アドレス:  -
     NAS IPv6 アドレス:  -
     NAS ID:   -
     NAS ポートの種類:   仮想
     NAS ポート:   -

    RADIUS クライアント:
     クライアントのフレンドリ名:  TSGW01
     クライアント IP アドレス:   192.168.120.4

    認証の詳細:
     プロキシ ポリシー名:  ターミナルサーバーゲートウェイを介したターミナルサービスへの接続
     ネットワーク ポリシー名:  -
     認証プロバイダ:  <なし>
     認証サーバー:  TS01.contoso.co.jp
     認証の種類:  -
     EAP の種類:   -
     アカウントのセッション ID:  -

    検疫情報:
     結果:    -
     セッション ID:   -

    ---

    ネットワーク ポリシー サーバーがユーザーのアクセスを拒否しました。

    詳細については、ネットワーク ポリシー サーバーの管理者に問い合わせてください。

    ユーザー:
     セキュリティ ID:   NULL SID
     アカウント名:   TSGW01\Administrator
     アカウント ドメイン:   TSGW01
     完全修飾アカウント名: TSGW01\Administrator

    クライアント コンピュータ:
     セキュリティ ID:   NULL SID
     アカウント名:   Vista-demo01
     完全修飾アカウント名: -
     OS バージョン:   -
     被呼端末 ID:  UserAuthType:PW
     起呼端末 ID:  -

    NAS:
     NAS IPv4 アドレス:  -
     NAS IPv6 アドレス:  -
     NAS ID:   -
     NAS ポートの種類:   仮想
     NAS ポート:   -

    RADIUS クライアント:
     クライアントのフレンドリ名:  TSGW01
     クライアント IP アドレス:   192.168.120.4

    認証の詳細:
     プロキシ ポリシー名:  ターミナルサーバーゲートウェイを介したターミナルサービスへの接続
     ネットワーク ポリシー名:  -
     認証プロバイダ:  Windows
     認証サーバー:  TS01.contoso.co.jp
     認証の種類:  非認証
     EAP の種類:   -
     アカウントのセッション ID:  -
     理由コード:   7
     理由:    指定したドメインは存在しません。


    --------------

    ネットワーク ポリシー サーバーがユーザーにアクセスを許可しました。

    ユーザー:
     セキュリティ ID:   CONTOSO\user01
     アカウント名:   CONTOSO\user01
     アカウント ドメイン:   CONTOSO
     完全修飾アカウント名: contoso.co.jp/Users/user01

    クライアント コンピュータ:
     セキュリティ ID:   NULL SID
     アカウント名:   Vista-demo01
     完全修飾アカウント名: -
     OS バージョン:   -
     被呼端末 ID:  UserAuthType:PW
     起呼端末 ID:  -

    NAS:
     NAS IPv4 アドレス:  -
     NAS IPv6 アドレス:  -
     NAS ID:   -
     NAS ポートの種類:   仮想
     NAS ポート:   -

    RADIUS クライアント:
     クライアントのフレンドリ名:  TSGW01
     クライアント IP アドレス:   192.168.120.4

    認証の詳細:
     プロキシ ポリシー名:  ターミナルサーバーゲートウェイを介したターミナルサービスへの接続
     ネットワーク ポリシー名:  ターミナルサービスゲートウェイ用ネットワークポリシー
     認証プロバイダ:  Windows
     認証サーバー:  TS01.contoso.co.jp
     認証の種類:  非認証
     EAP の種類:   -
     アカウントのセッション ID:  -

    検疫情報:
     結果:    フル アクセス
     セッション ID:   -
    ---

    ホストが定義済みの正常性ポリシーを満たしていたため、ネットワーク ポリシー サーバーはユーザーにフル アクセスを許可しました。

    ユーザー:
     セキュリティ ID:   CONTOSO\user01
     アカウント名:   CONTOSO\user01
     アカウント ドメイン:   CONTOSO
     完全修飾アカウント名: contoso.co.jp/Users/user01

    クライアント コンピュータ:
     セキュリティ ID:   NULL SID
     アカウント名:   Vista-demo01
     完全修飾アカウント名: -
     OS バージョン:   -
     被呼端末 ID:  UserAuthType:PW
     起呼端末 ID:  -

    NAS:
     NAS IPv4 アドレス:  -
     NAS IPv6 アドレス:  -
     NAS ID:   -
     NAS ポートの種類:   仮想
     NAS ポート:   -

    RADIUS クライアント:
     クライアントのフレンドリ名:  TSGW01
     クライアント IP アドレス:   192.168.120.4

    認証の詳細:
     プロキシ ポリシー名:  ターミナルサーバーゲートウェイを介したターミナルサービスへの接続
     ネットワーク ポリシー名:  ターミナルサービスゲートウェイ用ネットワークポリシー
     認証プロバイダ:  Windows
     認証サーバー:  TS01.contoso.co.jp
     認証の種類:  非認証
     EAP の種類:   -
     アカウントのセッション ID:  -

    検疫情報:
     結果:    フル アクセス
     拡張結果:   -
     セッション ID:   -
     ヘルプ URL:   -
     システム正常性検証ツールの結果: -
    ----
    ■接続がエラーになる場合

    ネットワーク ポリシー サーバーがユーザーのアクセスを拒否しました。

    詳細については、ネットワーク ポリシー サーバーの管理者に問い合わせてください。

    ユーザー:
     セキュリティ ID:   CONTOSO\junichia
     アカウント名:   CONTOSO\junichia
     アカウント ドメイン:   CONTOSO
     完全修飾アカウント名: CONTOSO\junichia

    クライアント コンピュータ:
     セキュリティ ID:   NULL SID
     アカウント名:   Vista-demo01
     完全修飾アカウント名: -
     OS バージョン:   -
     被呼端末 ID:  UserAuthType:PW
     起呼端末 ID:  -

    NAS:
     NAS IPv4 アドレス:  -
     NAS IPv6 アドレス:  -
     NAS ID:   -
     NAS ポートの種類:   仮想
     NAS ポート:   -

    RADIUS クライアント:
     クライアントのフレンドリ名:  TSGW01
     クライアント IP アドレス:   192.168.120.4

    認証の詳細:
     プロキシ ポリシー名:  ターミナルサーバーゲートウェイを介したターミナルサービスへの接続
     ネットワーク ポリシー名:  -
     認証プロバイダ:  Windows
     認証サーバー:  TS01.contoso.co.jp
     認証の種類:  非認証
     EAP の種類:   -
     アカウントのセッション ID:  -
     理由コード:   48
     理由:    接続試行はどのネットワーク ポリシーにも一致しませんでした。


     

  • 【Community】7/11 広島でPowerShell のリモーティング機能を解説します

    どうにもお肌にツヤが無い、きょうこの頃です。

    さて、イベントの告知をさせてください。

    7月11日、広島のマイクロソフト中国支店にて、ヒーロー島との共催によりWindows 7 コミュニティ勉強会が開催されます。

    Windows 7 コミュニティ勉強会 with Tech Fielders 中国編
    http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032416507&Culture=ja-JP

    この中で、私は Windows 7 PowerShell Remoting 30連発 というセッションを担当します。

    Windows7/Windows Server 2008 R2 の新しい機能として、Windows PowerShell 2.0 があります。

    標準でエディタがついていたり、Active Directoryをはじめとする運用管理系のコマンドレットが増えたりと、ワクワク感いっぱいなのですが、運用管理者にとってうれしいのが リモーティング と呼ばれるリモートコンピュータの運用管理機能です。

    Windows NT 4.0 のころ、リモートコンピュータの情報を取得するのは至難の業でした。コマンドが必ずしも  /Computer  オプションをサポートしていた時代ではなかったわけです。

    当時、リモートでコマンドを実行させるのに流行った方法は、ATコマンド。ATでは \\ComputerName でリモートコンピュータを指定することができました。なので、例えば「10秒後」の時間を指定して投げることで、すこし時間差はあるもののリモートコンピュータでの実行結果を得ることができました。ATの亜種であるSOONコマンドでは、時間を指定するのではなく、「10秒後」という指定ができたので、大変使い勝手がよかったです。

    そのほか、NT 4.0 のリソースキットの Remote.exe や rconsole/rclient なども使ったりしました。

    その後、WSH 5.6 では Remote Script 機能がサポートされ、さらにリモートコンピュータに対する管理の幅は広がりました。

    そして、今回のPowerShell 2.0 です。

    30のコマンドレットが /ComputerName 対応になっただけでなく、Invoke-Command が使えるようになり、そしてリモートコンピュータの PowerShell セッションをローカルコンソールに表示することができるようになりました(sshみたいな感じです)。

    本勉強会の私のセッションでは、このようなPowerShell 2.0 のリモーティングについて詳しく解説したいと思います。

    懇親会も予定されているようなので、是非ともお申し込みください!

  • 【Hyper-V】スナップショットとコンピュータアカウントパスワードの微妙な関係

    タイトルを見て、これから何が書かれるのか想像がついた方は、酸いも甘いも経験したActive Directory使いであると言えるでしょう。

    実はHyper-Vがリリースされてから、「正式な対応があるのだろうか?」と疑問に思い続けてきたことがあります。それは…

    Hyper-Vでスナップショットを取った後で、コンピュータアカウントのパスワードがリセットされてしまったらどうなるのだろう?

    きっと、同じ疑問を持っている方は多いはずです。

    ドメインに参加しているコンピュータは、ユーザーと同様に「コンピューターアカウント」と呼ばれるアカウントを持っています。ユーザーアカウントの場合、定期的に利用者自らがパスワードを変更しますが、コンピューターアカウントの場合にも同様に、規定で30日に1回、パスワードをリセットします。

    このパスワードは、ADとコンピュータ自身の両方に保存されており、両者が食い違った場合には「不正なコンピュータ」であるとしてドメインにアクセスすることができなくなります。もちろん、ユーザーがそのコンピュータを使用してログオンすることもできません。

    こうした問題が発生するのは、たとえば、クライアントにバックアップからディスクイメージを戻した場合です。そのバックアップイメージが前回の自動パスワードリセット前に取られたものであれば、再度ドメインに参加しなおさないとユーザーはログオンすることができません。

    ※ドメインへの再参加ではなく、パスワードのリセットでいけたかどうか…ちょっと記憶にないです…どなたか経験者いらっしゃいますか?
    → 2009.6.24 (参考) ドメインにログオンできない ~ セキュア チャネルの破損 ~ (Ask the Network & AD Support Team)

     これと同じ問題が、Hyper-Vのスナップショットでも発生するはずだよなぁ…と考えていました。

    実は、コレに対する現時点の回答が Windows Server Core Team のBLOGに投稿されました。

    Running Hyper-V in a lab? Use Snapshots? Check this out!
    http://blogs.technet.com/askcore/archive/2009/06/03/running-hyper-v-in-a-lab-use-snapshots-check-this-out.aspx

    対処法は、ずばり…

    コンピューターアカウントのパスワードリセットを無効にしてください

    とのこと…。あぁ、やはりそうきましたか..。

    具体的にはコンピュータ側のレジストリを修正します。

    DisablePasswordChange
    http://technet.microsoft.com/ja-jp/library/cc962289(en-us).aspx

    これによって、コンピューターはドメインコントローラとのパスワードリセットを行わなくなります。

    ちなみに、パスワードの有効期間を(限りなく)長くする…という方法もあります。

    MaximumPasswordAge
    http://technet.microsoft.com/ja-jp/library/cc937922(en-us).aspx

    なお、この設定はグループポリシーからも行えます。

    image
    [コンピュータの構成]-[ポリシー]-[Windowsの設定]-[セキュリティの設定]-[ローカル ポリシー]-[セキュリティオプション] の中の[ドメインメンバ:コンピュータアカウント パスワード: 定期的な変更を無効にする]

    コンピューターパスワードのリセットを無効にすることにより、もちろん、セキュリティレベルは落とすことになります。

    スナップショットは大変便利な機能ではあるのですが、本番運用系の場合には、こうした留意点もあることを覚えて置いてください。

  • 【相互運用性】マイクロソフトの相互運用性プロジェクトの全てがわかる~Interoperability Bridges & Labs Center

    Interoperability Bridges & Labs Center というサイトをご存知でしょうか?

    なんとなく、バラバラといろんな相互運用性プロジェクトが存在しているような感じですが、このサイトでマイクロソフトの相互運用性に関するプロジェクトの全てを見ることができます。

    このサイトはMicrosoft Interoperability Strategy Group が中心となって運営されており、活動の様子は以下のBLOGでも継続的に報告されています。

    Microsoft Interoperability Strategy Group のBLOG
    Interoperability @ Microsoft

    一見、開発系に占領されているように見えますが、いえいえ、ITPRO向けの相互運用性プロジェクトに関する情報も多く掲載されています。

    ※2009/06/17 リンクを修正しました。失礼いたしました。

    このサイトを基点として、各プロジェクトのサイトに移動できるので重宝するでしょう。

    とかくオープンソース系からの攻撃にさらされているマイクロソフトですが、現在のマイクロソフトは以前とはガラリと変わっていますので、是非ともご認識いただけると幸いです。

    で、なんでこんなことを突然書いたかと言い���すと、6月4日にアメリカで開催された 2009 JavaOne Conference においてマイクロソフトがKeynoteに登壇したからなのです。

    MS登壇時のビデオは JavaOneサイトで公開されています

    理由はもちろん、Sunとの相互運用性プロジェクトに関する重要な発表なのですが、その名も Stonehenge プロジェクト と言います。

    Stonehenge プロジェクトの狙いは、W3CやOASISで定義されている既存のプロトコルを使用して(つまりSOAベースということですね)、Java, .NET, PHPなどによる相互運用性のあるアプリケーション開発に関するベストプラクティスを示すことです。サンプルコードや開発のためのガイダンスなどがマイクロソフト、サン、その他のベンダーによって整備される予定です。

    興味のある方(すみません、英語なのですが)、是非とも以下をご覧ください。

  • 【Hyper-V】統合サービスの「データ交換」ってなに? その2

    前回の投稿はこちら

    【Hyper-V】統合サービスの「データ交換」ってなに?

    では実際に、データ交換 機能を介して、ゲストOSの情報を取得してみましょう。

    まずは以下の図をご覧ください。これは、ゲストOS上のレジストリエントリです。

    image

    ご覧いただくとお分かりのように、HKLM\Software\Microsoft\Virtual Machine\Auto 配下のエントリが表示されています。IPアドレスやOSのビルド番号、コンピュータ名などの基本的なOSの情報が格納されていることがわかります。

    実は、ここに表示されているエントリは、ゲストOSにインストールされている「Hyper-V Data Exchange Service」によって生成されています。

    image 
    統合サービスがインストールされたゲストOSのサービス。ちなみに、赤で囲んだサービスが、それぞれの統合サービス機能に対応している。

    Hyper-V Data Exchange Service が起動するときに、OSの基本情報を収集し、このレジストリキー配下に書き込んでくれます。言い換えれば、このレジストリエントリをでたらめに書き換えても、Hyper-V Data Exchange Service を再起動すれば正しい値に戻すことが出来ます。

    ホストOSを経由し、ゲストOSの「データ交換」を介して収集できる情報の1つが、ここに羅列されているレジストリエントリです。

    以下の図はここまでの話をまとめたものです。

    プレゼンテーション1

    実際にAutoキー配下の値を取得するには、以下のようなコマンドを使用します(今回は PowerShellを使用しますが、WMI なので VBS を使用することもできます)。

    まずはゲストOSの名前を使用して、以下のコマンドを実行します。これにより、Hyper-V上のゲストOSのインスタンスを取得できます($VM)。ここで使用しているのが、Msvm_ComputerSystem クラスであす。このクラスは通常使用する root\CIMV2 ネームスペースではなく、root\virtualication ネームスペースに定義されていることに注意してください。

    PS C:\>$VM = Get-WmiObject -Namespace root\virtualization -Query "Select * From Msvm_ComputerSystem Where ElementName='ゲストOSの名前' " -ComputerName ホストコンピュータ名
    -Credential administrator

    ちなみに、上のコマンドでは、別ドメインのサーバーを操作しているため –Credential でHyper-Vサーバーに接続する際のユーザー名を指定しています。これによって、以下のようなダイアログボックスが表示され、パスワードを入力することができます。

    image

    次に、以下のコマンドを入力します。

    PS C:\> $Kvp = Get-WmiObject -Namespace root\virtualization -Query "Associators of {$Vm} Where AssocClass=Msvm_SystemDevice ResultClass=Msvm_KvpExchangeComponent" -ComputerName ホストコンピュータ名 -Credential administrator

    {$VM} は前回のコマンドで取得したゲストOSのインスタンスです。注意していただきたいのは、「Associators of」というクエリーを使用しているところです。Associators of により、{$VM} に関連付けられている全てのインスタンスを収集することができます。その中には、ゲストOSの設定や、スナップショット情報、仮想ネットワーク情報などありとあらゆる情報が含まれています。

    それらは有用な場合もあるのですが、今回行いたいのはゲストOSとの「データ交換」です。よって、Where句でデータ交換に関するインスタンスのみを取得するように指示します。それが、AssocClass=Msvm_SystemDevice ResultClass=Msvm_KvpExchangeComponent です。

    これで必要な情報は取得できたはずです。以下のようにして、「GuestIntrinsicExchangeItems」を参照してみてください。

    PS C:\> $kvp.GuestIntrinsicExchangeItems

    以下のように、KVPデータがずらずらっと表示されたはずです。

    image

    これだと判読しづらいので、以下のスクリプトをPowerShell プロンプトにコピペしちゃってください。難しいことは考えなくてよいです(説明が面倒なんだろうって?いえいえ、そうではなく…笑)。


    filter Import-CimXml
    {
        $CimXml = [Xml]$_
        $CimObj = New-Object -TypeName System.Object
        foreach ($CimProperty in $CimXml.SelectNodes("/INSTANCE/PROPERTY"))
        {
            $CimObj | Add-Member -MemberType NoteProperty -Name $CimProperty.NAME -Value $CimProperty.VALUE
        }
        $CimObj
    }

    image

    これによって、Import-CimXml という名前のフィルタが作成されました。

    今度は、フィルタも指定して、以下のように入力してみてください。

    PS C:\> $kvp.GuestIntrinsicExchangeItems | Import-CimXml

    以下のように表示されればOKです。

    image 

    ゲストOSのレジストリの値と、PowerShellプロンプト上の表示を見比べてみてください。同じ値が表示されているはずです。

    ためしに、ゲストOS上のレジストリエントリを修正し、再度 $KVPの取得を行っていただければ、修正後のレジストリの値を参照することができるでしょう。

    修正したレジストリの値を元に戻すには、手で修正してもよいですが、Hyper-V Data Exchange Service を再起動したほうが間違いがありません。

    今回は、データ交換によってゲストOSから情報を取得しました。

    次回は、データ交換機能によって、ゲストOSのレジストリ上にデータを書き込む方法について解説します。

    次回はゲストOSのサービスの状態をホストOSから取得する方法について解説します。

    つづき

    参考サイト

    MSDN - Virtual PC Guy’s Weblog : Hyper-V Scripting
    http://blogs.msdn.com/b/taylorb/archive/2008/05/06/hyper-v-wmi-using-powershell-scripts-part-3-kvp-s-guest-os-version.aspx
    http://blogs.msdn.com/b/taylorb/archive/2008/07/06/hyper-v-wmi-kvp-exchange-aka-data-exchange-adding-new-items-from-parent-host.aspx

  • 【Hyper-V】統合サービスの「データ交換」ってなに?

    Hyper-VのゲストOSに「統合サービス」をインストールすると、ゲストOSで以下の機能が使用できるようになります。

    • オペレーティングシステムのシャットダウン
    • 時刻の同期
    • データ交換
    • ハードビート
    • バックアップ(ボリュームスナップショット)

    これらの機能は、以下の画面から一部を無効にすることも可能です。

    image

    この中で、「データ交換」とはどんな機能なのか?というご質問をいただきました。実は、恥ずかしながら私もきちんと把握していなかったので調べてみました。

    当初、ホストとゲストの間でファイルを交換できるのかな?と思いこんでおりましたが、どうやら違うようですね…。

    要は、

    ホストとゲストの間で情報を交換(実際にはレジストリの値)するしくみ

    です…といっても、なんだかよくわからないですよね。すみません。

    ここで、以下の図をご覧ください。

    プレゼンテーション1
    ※上のPPTのクリップアートが気になる方は、ここをクリック

    管理者が操作するPCと、ゲストOSがネットワーク的に通信が可能であれば、WMIのWin32_OperatingSystem等を通じてゲストOSの情報を収集することが可能です。

    しかし、ゲストOSが使用しているネットワークが「プライベート」であったり、IPアドレスの体系が全く異なる場合には、いくら管理者といえどもゲストOSに接続することができません。セキュアな環境を構築したいと考える場合には、ゲストOSが使用するネットワークカードは、物理ネットワークカードから切り離すことになるでしょう。それでも、ゲストOSが大量に存在する場合には、スクリプト等でちょちょいと「ゲストOSリスト」なんてものを作成したいはずです。

    そんなときは、ホストOSを介してゲストOSの情報を収集することが可能です。これを実現してくれるのが、ゲストOSにインストールされた「データ交換」機能なのです。

    ちなみに、「データ交換」機能は、直訳すれば「Data Exchange」ですが、WEB等で記事を探そうとすると、これではヒットしずらいようです。多くの記事では 「KVP Exchange」という言葉が使われています。KVPとは Key Value Pair のことで、ご想像とおりXML形式のデータを指しています。つまり、ゲストOSの情報を KVPで交換できるということを意味しています。

    実際にデータ交換を行うには、おなじみ WMI(Windows Management Instrumentation)に用意された仮想マシン用のクラス(msvm_*)を使用します。つまり、スクリプトの出番であると..。

     

    具体的な使い方は次の投稿で..。

    つづき http://blogs.technet.com/b/junichia/archive/2009/06/13/3253986.aspx

  • 【Management】FSRM 記憶域レポートの上限値を変更するには

    FSRMはご存知でしょうか? ファイル サーバー リソース マネージャ です。Windows Server 2003 R2 から実装された機能で、ディレクトリレベルのクオーター管理機能やファイルスクリーン機能などが実装されています。無償で使えるすごく便利な機能なのですが、案外知られていないんですねぇ。

    よろしければ、以前ThinkITで書いた記事もご覧ください。

    考までに、Windows Server 2008 R2 では「分類管理(File Classification Infrastructure)」という機能が実装されます。これは、ファイルが持つ各種属性(サイズ、作成日時、所有者など)によってファイルを分類するという機能です。ファイルごとにフォルダを分けるのは当然ながら、独自のスクリプトを走らせることでドキュメントのプロビジョニングを柔軟に行うことができます。たとえば、最終アクセスが1年前のファイルをバックアップ用フォルダに移動するとか、サイズの大きなファイルの所有者にメールを出すとか。

    残念ながら日本語RC版では実装されていないようなのですが、特定の文字列を含んだOfficeファイルやTIFFファイルに対してアクションを起こすなんてことも可能になるようです。たとえば、xxx-xxxx-xxxx というパターンに合致する文字列が含まれている場合には、個人情報(この場合は電話番号を想定)が含まれているとして自動的に暗号化するとか…いやぁ、夢が膨らみますね。

    さて、本題です。

    FSRM の「記憶域レポート」という機能を使用すると、ハードディスク内のファイルを調査して、さまざまなレポートを出力することができます。

    • 100MB以上のファイル一覧
    • 所有者が junichia のファイル一覧

    などなど。

    これまでスクリプト等で対応してきた方には非常に有用な機能でして、是非ともお使いいただきたいのですが、ちょっとだけハマりがちな点があります。それは、レポートに表示されるファイルの数です。

    Windows Server 2008/2008R2(RC)共に、規定では 1000 が設定されており、たとえ100MB以上のファイルが10000個あっても、レポートには1000個しか表示されません。これはちょっと困りますよね。

    この上限値はスクリプトで変更することが可能です。スクリプトのサンプルが MS の Storage Team の BLOG に掲載されています。

    A script to increase FSRM report limit
    http://blogs.technet.com/filecab/pages/a-script-to-increase-fsrm-report-limit.aspx

    が、ちょっと使い勝手が悪いところと、2008 R2 の 分類管理機能に関する上限値が実装されていなかったので、修正したものをこちらに 掲載しました。拡張子を vbs として保存してください。

    書式は以下の通りです。/value を指定しなければ、現在の設定値を表示します。

    保存したファイル名  /limit <name> [/value <value>]

             <name>  - 変更したい上限値の識別名
                         MaxFiles
                         MaxFileGroups
                         MaxFileOwners
                         MaxFilesPerFileGroup
                         MaxFilesPerFileOwner
                         MaxFilesPerDuplGroup
                         MaxDuplicateGroups
                         MaxQuotas
                         MaxFileScreenEvents
                         MaxPropertyValues – 2008 R2 で有効 
                         MaxFilesPerPropertyValue – 2008 R2 で有効

             <value> - 変更後の上限値

    識別名ごとに設定された上限値によって、レポートに表示する最大数が決まります。識別名はそれぞれ以下を意味しています。

    • MaxFiles
      レポートに表示するファイル数の最大値。全てのレポートに対して有効。
      規定値は 1000。
    • MaxFileGroups
      レポートに表示するファイルグループ数の最大値。「ファイルグループごとのファイル」レポートで有効。
      規定値は10。
    • MaxFileOwners
      レポートに表示する所有者数の最大値。「所有者ごとのファイル」レポートで有効。
      規定値は10。
    • MaxFilesPerFileGroup
      レポートに表示する、ファイルグループごとのファイル数の最大値。「ファイルグループごとのファイル」レポートで有効。
      規定値は100。
    • MaxFilesPerFileOwner
      レポートに表示する、ファイル所有者ごとのファイル数の最大値。「所有者ごとのファイル」レポートで有効。
      規定値は100。
    • MaxFilesPerDuplGroup
      レポートに表示する、重複ファイル群ごとのファイル数の最大値。「重複しているファイル」レポートで有効。
      規定値は10。
    • MaxDuplicateGroups
      レポートに表示する、重複ファイル群の最大数。「重複しているファイル」レポートで有効。
      規定値は100。
    • MaxQuotas
      レポートに表示するクオータ設定の最大数。「クオータの使用率」レポートで有効。
      規定値は1000。
    • MaxFileScreenEvents
      レポートに表示するファイルスクリーンイベントの最大数。「ファイルスクリーン処理の監査」レポートで有効。
      規定値は1000。
    • MaxPropertyValues – 2008 R2 で有効
      レポートに表示するプロパティの最大数。「プロパティごとのファイル」レポートで有効。
      規定値は10。
    • MaxFilesPerPropertyValue – 2008 R2 で有効
      レポートに表示する、プロパティごとのファイルの最大数。「プロパティごとのファイル」レポートで有効。
      規定値は
      100。

    最大値を超えると、レポートには以下のようなワーニングが表示されるので、上記のスクリプトで必要に応じて最大値を修正する必要があります。

    image image

  • Script to change FSRM Strage Report Limit

    拡張子VBSで保存してください。

    ----------------------- 

    const scriptName = "fsrmReportLimit"

    DIM limitNames
    limitNames = Array("MaxFiles", "MaxFileGroups", "MaxFileOwners", "MaxFilesPerFileGroup", "MaxFilesPerFileOwner", "MaxFilesPerDuplGroup", "MaxDuplicateGroups", "MaxQuotas", "MaxFileScreenEvents", "MaxPropertyValues", "MaxFilesPerPropertyValue")

    const optLimit = "/limit"
    const optValue = "/value"

    DIM objArgs, fsrm, strLimitName, strLimitValue

    set objArgs = wscript.Arguments
    if objArgs.count = 0 then
        PrintUsage()
        wscript.quit
    end if

    if objArgs.count = 1 then
        if objArgs(0) = "/?" then
            PrintUsage()
            wscript.quit
        end if
    end if

    DIM i, j
    DIM strOption, strNewOption
    DIM nModifyProperties
    nModifyProperties = 0
    for i = 0 to objArgs.count-1
        if (LCase(objArgs(i)) = optLimit) then
            strLimitName = objArgs(i+1)
            i = i + 1
        elseif (LCase(objArgs(i)) = optValue) then
            strLimitValue = objArgs(i+1)
            i = i + 1
        else
            wscript.echo "Error: invalid argument, " & objArgs(i)
            PrintUsage()
            wscript.quit
        end if
    next

    DIM limitNameCode
    limitNameCode = -1
    for i = LBound(limitNames) to UBound(limitNames)
        if (LCase(strLimitName) = LCase(limitNames(i))) then
      limitNameCode = i + 1
      exit for
        end if
    next

    if (limitNameCode = -1) then
        wscript.echo "Error: invalid limit name, " & strLimitName
        PrintUsage()
        wscript.quit
    end if

    set fsrm = WScript.createobject("fsrm.FsrmReportManager")

    DIM newLimit

    wscript.echo strLimitName & " = " & fsrm.GetReportSizeLimit(limitNameCode)

    If trim(strLimitValue) = "" then Wscript.Quit

    call fsrm.SetReportSizeLimit(limitNameCode, strLimitValue)
    newLimit = fsrm.GetReportSizeLimit(limitNameCode)

    if (Int(newLimit) = Int(strLimitValue)) then
        wscript.echo "Report size limit " & limitNames(limitNameCode - 1) & " was changed to " & strLimitValue
    else
        wscript.echo "unable to change limit " & limitNames(limitNameCode - 1) & ".  Limit is set to " & newLimit
    end if

    function PrintUsage()
    wscript.echo ""
    wscript.echo scriptName & "  /limit <name> [/value <value>]"
    wscript.echo "         <name>  - name of the report size limit to modify"
    wscript.echo "         <value> - new value for the size limit"
    wscript.echo ""
    wscript.echo "Report limit values:"
    for i = LBound(limitNames) to UBound(limitNames)
        wscript.echo "    " & limitNames(i)
    next
    end function

     

  • 【すみません】TechNet Flash(2009/6/3 Vol. 341)トップストーリーのリンクが間違えておりました

    本日は TechNet Flash の配信日です。皆さまとろころには無事届いたでしょうか?

    実は私のせいでリンクのミスが発生してしまいましたため、とりいそぎ、ここで修正を告知させていただきます。

    ご迷惑をおかけしてもうしわけございませんです。

    今後とも、TechNet Flash をどうぞよろしくお願い申し上げます。

    -------------------------------

    【Hyper-V の設計方法をご存知ですか?】 最適なインフラ計画、設計に役立つガイドを新公開!

    新しい技術を導入するときに困ること...それはこれまでの経験則が活かしづらいという点です。特に仮想化技術。概念としては理解していても、いざ設計しようとしたらどこから手をつけてよいかわからない。そんな悩みに答えるのが IPD (Infrastructure Planning and Design Guide) です。
    あなたのインフラに最適な仮想化技術は何か? 必要なサーバー台数は? サイジングの計算式は? パフォーマンスを引き出すためのハードウェア構成は?
    IPD ではそんな疑問に答���るべく、インフラの設計工程で判断すべき事項や考え方を段階的にそして詳細に解説しています。仮想化技術以外にも、Active Directory や Windows 展開サービス用の IPD も公開されています。IT Pro の方は必見です!

    IPD シリーズ

    マイクロソフト株式会社 IT Pro エバンジェリスト 安納 順一

     

    マイクロソフト株式会社
    IT Pro エバンジェリスト
    安納 順一

    安納 順一のブログ

  • 執筆・監修・監訳のお仕事(あたらしい順) 09/12/28 更新

    2009年12月25日 @IT Windows Server 2008 R2 強化されたGroup・Policy 機能

    2009年12月10日 @IT Windows Server 2008 R2 進化したActive Directory

    2009年06月25日 @IT Windows Server 2008 ターミナル・サービス・ゲートウェイ実践構築入門(後編)

    2009年05月25日 Windows Server World 誌 7月号 特集 スクリプトが苦手な管理者のためのグループポリシー基本設定 活用講座

    2009年05月13日 @IT Windows Server 2008ターミナル・サービス・ゲートウェイ実践構築入門(前編)

    2009年02月18日 Software Design 誌 3月号 Active Directoryの基礎を学ぶ

    2009年01月26日 Think IT Windows Server 2008で作る! 第3回 グループポリシーを使って楽々管理

    2009年01月19日 Think IT Windows Server 2008で作る! 第2回 DFSによるファイルサーバーの可用性向上

    2009年01月05日 Think IT Windows Server 2008で作る! 第1回 ここまでできる!標準ファイルサービス

    2008年11月25日 日経BPソフトプレス Windows Server 2008 リソースキット グループポリシー編 監訳

    2008年09月29日 日経BPソフトプレス Windows Servevr 2008 リソースキット Active Directory編 監訳

    2008年04月10日 @IT Windows Server 2008 の基礎知識 第10回 ターミナル・サービスによるクライアントの仮想化(後編)

    2008年02月21日 @IT Windows Server 2008 の基礎知識 第9回 ターミナル・サービスによるクライアントの仮想化(中編)

    2008年02月07日 @IT Windows Server 2008 の基礎知識 第8回 ターミナル・サービスによるクライアントの仮想化(前編)

    2008年06月05日 @IT 第4回 System Center Essentials 2007を使用した運用管理手順(2)

    2008年02月27日 @IT 第3回 System Center Essentials 2007を使用した運用管理手順(1) 

    2007年12月06日 @IT 第2回 System Center Essentials 2007のインストール

    2007年10月18日 @IT 第1回 System Center Essentials 2007によるデスクトップのライフサイクル管理

     

  • 【Management】Set-GPRegistryValue で複数のレジストリエントリを一度に設定する

    ■PR<無償提供中!>■■■■■■■■■■■■
    PowerPoint 用 素材集 に アイツ が登場
    いますぐダウンロード■■■■■■■■■■■■■■■■■■■■■■■■■
    (注)これは Tech Fielders からのお知らせです。あやしくありません。

    さて、前回、前々回と、Windows Server 2008 R2 のあたらしいグループポリシー機能についてご紹介しました。

    既にご紹介したとおり、2008 R2 では、Set-GPRegistryValue コマンドレットを使用することで、ADMXファイルを作らなくても業務アプリの設定をグループポリシーに組みこむことができるようになりました。

    この Set-GPRegistryValue で複数のエントリを一度に設定するには、以下のように書きます。

    PS C:\> Set-GPRegistryValue -Name "TestPolicy" -Key "HKCU\Software\MyApp" -ValueName "InstallPath","InstallDate","AdminUsers","Operators" -Type String -Value "C:\Program Files\MyApp","2009/06/1","yamada","user01"

    ちなみに、上の書式は、以下のエントリを書き込んでいます。

    キーのパス
    値のタイプ
    値の名前と値

    :HKCU\Software\MyApp
    :文字列 
    :InstallPath = C:\Program Files\MyApp
    :InstallDate = 2009/6/1
    :AdminUsers = yamada
    :Operators = user01

    ただし、複数のエントリを一度に書き込むことができるのは��値のタイプが 文字列(String)か展開可能な文字列(ExpandString)の場合のみであることに注意してください。

    また、あまり汎用性は無いように思えますが、以下のような書き方も可能です。上記との違いは –ValueName のかわりに、-ValuePrefix を使用しているところです。

    PS C:\> Set-GPRegistryValue -Name "TestPolicy" -Key "HKCU\Software\MyApp" -Value
    Prefix
    "Operators" -Type String -Value "user01","user02","user10","tanaka"

    結果は、以下をご覧いただいたほうがわかりやすいでしょう。

    image 

    ご覧のとおり、指定した文字列を Prefixとして使用し、連番を付加して複数の値を設定することができます。

  • 【Managemnt】WS2008 R2:ADMXファイルを作らずに業務アプリのレジストリ設定をグループポリシー化する その2

    前回の投稿では業務アプリのレジストリ設定を、グループポリシーに組み込む手順を書きました。

    【Managemnt】WS2008 R2:ADMXファイルを作らずに業務アプリのレジストリ設定をグループポリシー化する

    今回は、一度組み込んだ設定を「無効化」「削除」する方法について書きます。

    「無効化」と「削除」は動作が異なるので注意してください。

    ■無効化するには

    「無効化」とは、ポリシーエディタで設定するところの「未構成」と同等です。つまり、ポリシーの設定自体は残しつつ、クライアントやユーザーには「適用しない状態を維持する」という意味になります。

    結果として、無効化された値はレジストリから消されるため、アプリケーションはデフォルト値で動作することになります。

    ポリシー化した設定値を無効にするには、以下のように –Disable を指定するだけです。

    PS C:\> Set-GPRegistryValue -Name "Testpolicy" -key "HKCU\Software\MyApp" –ValueName "InstallPath" –Disable

    DisplayName      : TestPolicy
    DomainName       : demodomain.com
    Owner            : DEMODOMAIN\Domain Admins
    Id               : 1eeb4b61-df4f-48eb-8e71-eb15d79bd855
    GpoStatus        : AllSettingsEnabled
    Description      :
    CreationTime     : 2009/06/01 11:48:21
    ModificationTime : 2009/06/01 19:14:22
    UserVersion      : AD Version: 10, SysVol Version: 10
    ComputerVersion  : AD Version: 2, SysVol Version: 2
    WmiFilter        :

    PS C:\>

    上記の例では特定のエントリ(InstallPath)が対象となっていますが、以下のように -ValueName を指定しなければ、MyAppキー配下の全てのエントリを一度に無効にすることができます。

    PS C:\> Set-GPRegistryValue -Name "Testpolicy" -key "HKCU\Software\MyApp" -Disable

    DisplayName      : TestPolicy
    DomainName       : demodomain.com
    Owner            : DEMODOMAIN\Domain Admins
    Id               : 1eeb4b61-df4f-48eb-8e71-eb15d79bd855
    GpoStatus        : AllSettingsEnabled
    Description      :
    CreationTime     : 2009/06/01 11:48:21
    ModificationTime : 2009/06/01 19:18:36
    UserVersion      : AD Version: 11, SysVol Version: 11
    ComputerVersion  : AD Version: 2, SysVol Version: 2
    WmiFilter        :

    PS C:\>

    -Disable したあとで同じパスにレジストリエントリを書き込んでも、次回のバックグラウンド更新時にエントリが削除されてしまうことに注意してください。

    ■削除するには

    ポリシー自体を削除するには、Remove-GPRegistryValue を使用します。これを使うと、きれいさっぱりGPOから削除されます。GPOから削除されたタイミングで、実際のレジストリパスからも削除されます。

    Remove-GPRegistryValue を実行後に、手動で同じパスにエントリを追加しても、無効化したときのようにポリシーのバックグラウンド更新によって削除されることはありません。

    以下は、特定のエントリ(InstallPath)のみを削除しています。よって、MyApp配下の他のエントリは削除されずに残ります。

    PS C:\> Remove-GPRegistryValue -Name "Testpolicy" –key  "HKCU\Software\MyApp" -ValueName "InstallPath"

    DisplayName      : TestPolicy
    DomainName       : demodomain.com
    Owner            : DEMODOMAIN\Domain Admins
    Id               : 1eeb4b61-df4f-48eb-8e71-eb15d79bd855
    GpoStatus        : AllSettingsEnabled
    Description      :
    CreationTime     : 2009/06/01 11:48:21
    ModificationTime : 2009/06/01 19:44:56
    UserVersion      : AD Version: 16, SysVol Version: 16
    ComputerVersion  : AD Version: 2, SysVol Version: 2
    WmiFilter        :

    PS C:\>

    MyAppキーごと削除する場合には、-ValueName を指定しないようにします。

    PS C:\> Remove-GPRegistryValue -Name "Testpolicy" –key  "HKCU\Software\MyApp"

    DisplayName      : TestPolicy
    DomainName       : demodomain.com
    Owner            : DEMODOMAIN\Domain Admins
    Id               : 1eeb4b61-df4f-48eb-8e71-eb15d79bd855
    GpoStatus        : AllSettingsEnabled
    Description      :
    CreationTime     : 2009/06/01 11:48:21
    ModificationTime : 2009/06/01 20:14:30
    UserVersion      : AD Version: 21, SysVol Version: 21
    ComputerVersion  : AD Version: 2, SysVol Version: 2
    WmiFilter        :

    PS C:\>

  • 【Managemnt】WS2008 R2:ADMXファイルを作らずに業務アプリのレジストリ設定をグループポリシー化する

    タイトルからでは意味がわかりずらいですね。というか完全に意味不明ですね…。すみません。

    面白い機能なので早くお伝えしようとしていたのですが、そう思いつつ2ヶ月が経過してしまいました。

    少し前に、USのグループポリシーチームBLOGに以下の投稿がありました。

    Set a registry key value from the command line using Group Policy PowerShell cmdlets
    http://blogs.technet.com/grouppolicy/archive/2009/04/01/set-a-registry-key-value-from-the-command-line-using-group-policy-cmdlets.aspx

    曰く…

    たとえばこんなシチュエーションを考えます。

    • クライアントに業務アプリケーションがインストールされている
    • 業務アプリの環境設定はレジストリで持っている
    • 業務アプリの環境変更は、レジストリを直接変更することで行っている
    • 業務アプリの利用者が間違えて環境を変えてしまう(レジストリが変わってしまう)ことがある
    • 本当は、ADMXファイルを作って、業務アプリの環境設定をグループポリシーに組み込みたい
    • そうすれば定期的に設定値がリフレッシュされることはわかっている
    • が、ADMXファイルを作るのは面倒…orz

    さぁ、こんなときにどうしましょう?と。

    上にも書かれているとおり、グループポリシーの良いところは「定期更新」機能があるところです。デフォルトでは90分に1回、バックエンドで再適用してくれるため、ユーザーが設定を変えてしまっても一定時間経過すれば管理者が意図した設定値に戻してくれます。更新間隔は変更することができますから、極端ですが1分に1回再適用なんてことも可能です。

    ちなみに、更新間隔の変更は以下のノードで設定できます。

    • [コンピュータの構成]-[ポリシー]-[管理用テンプレート]-[システム]-[グループポリシー]-[コンピュータのグループポリシーの更新間隔]
    • [ユーザーの構成]-[ポリシー]-[管理用テンプレート]-[システム]-[グループポリシー]-[ユーザーのグループポリシーの更新間隔]

    その恩恵にあずかるには、業務アプリ用のADMXファイルを作成しなければなりません。

    でも、書式を勉強しなければならないため、ちょいと面倒です。

    こで、Windows Server 2008 R2 GPMC で提供されている グループポリシー用の PowerShellコマンドレットを使用します。

    その名も set-GPRegistryValue  です。

    これを使うには手順を踏まなければならないので、以下にStep-By-Stepで書きます。

    1.Windows Server 2008 R2 で PowerShell プロンプトを開く

    グループポリシーを操作するので管理者モードで開いてください。

    2.Group Policy用のコマンドレットをインポートする

    規定のままでは set-GPRegistryValue は使用できません。まずは、GroupPolicy関連のコマンドレットをインポートする必要があります。以下のコマンドを、プロンプトから入力してください。

    PS C:\> Import-Module GroupPolicy –verbose
    image

    上の画面のように、インポートされたコマンドレットの一覧が表示されればOKです。念のために、
    Get-Command *-GP* で Group Policy 関連のコマンドレットが参照できるかどうか確認してみましょう。以下のように、全部で25個のコマンドレットが表示されるはずです。

    PS C:\> Get-command *-GP*

    CommandType     Name                            Definition
    -----------     ----                            ----------
    Cmdlet          Backup-GPO                      Backup-GPO -Guid <Guid> -Pat...
    Cmdlet          Copy-GPO                        Copy-GPO -SourceGuid <Guid> ...
    Cmdlet          Get-GPInheritance               Get-GPInheritance [-Target] ...
    Cmdlet          Get-GPO                         Get-GPO [-Guid] <Guid> [[-Do...
    Cmdlet          Get-GPOReport                   Get-GPOReport [-Guid] <Guid>...
    Cmdlet          Get-GPPermissions               Get-GPPermissions -Guid <Gui...
    Cmdlet          Get-GPPrefRegistryValue         Get-GPPrefRegistryValue -Gui...
    Cmdlet          Get-GPRegistryValue             Get-GPRegistryValue -Guid <G...
    Cmdlet          Get-GPResultantSetOfPolicy      Get-GPResultantSetOfPolicy [...
    Cmdlet          Get-GPStarterGPO                Get-GPStarterGPO -Guid <Guid...
    Cmdlet          Import-GPO                      Import-GPO -BackupId <Guid> ...
    Cmdlet          New-GPLink                      New-GPLink -Guid <Guid> -Tar...
    Cmdlet          New-GPO                         New-GPO [-Name] <String> [-C...
    Cmdlet          New-GPStarterGPO                New-GPStarterGPO [-Name] <St...
    Cmdlet          Remove-GPLink                   Remove-GPLink -Guid <Guid> -...
    Cmdlet          Remove-GPO                      Remove-GPO -Guid <Guid> [-Do...
    Cmdlet          Remove-GPPrefRegistryValue      Remove-GPPrefRegistryValue [...
    Cmdlet          Remove-GPRegistryValue          Remove-GPRegistryValue [-Gui...
    Cmdlet          Rename-GPO                      Rename-GPO -Guid <Guid> -Tar...
    Cmdlet          Restore-GPO                     Restore-GPO -BackupId <Guid>...
    Cmdlet          Set-GPInheritance               Set-GPInheritance [-Target] ...
    Cmdlet          Set-GPLink                      Set-GPLink -Guid <Guid> -Tar...
    Cmdlet          Set-GPPermissions               Set-GPPermissions -Guid <Gui...
    Cmdlet          Set-GPPrefRegistryValue         Set-GPPrefRegistryValue -Gui...
    Cmdlet          Set-GPRegistryValue             Set-GPRegistryValue -Guid <G...

    PS C:\>

    これらのコマンドレットは、グループポリシー管理機能がインストールされたWindows Server 2008 R2 だけでなく、RSAT(の中のグループポリシー管理ツール)がインストールされたWindows 7でも使用することができます。

    (余談)Windows 7 RC にグループポリシー管理ツールを入れた場合には、規定のモジュールとして組み込まれるようです。つまり、Import-Module しなくても使えました。

    ちなみに、Import-Module でロードしたモジュールは、現在のPowerShellセッションのみで有効となるため、毎回 Import-Module を行う必要があります。毎回自動的にImport-Moduleするには、プロファイルに書き込んでおく必要があります。

    3.set-GPRegistryValue を使用してレジストリの値を設定する

    これで Set-GPRegistryValue コマンドレットが使えるようになりました。

    ではさっそく、業務に必要なレジストリ設定を行ってみます。仮に、以下のレジストリ設定が必要であると想定します。

    キーのパス:HKEY_CURRENT_USER\Software\MyApp
    値の名前 :InstallPath
    値のタイプ:REG_SZ
    値 :C:\Program Files\MyApp

    これをグループポリシーの一部として組み込むには、以下のコマンドをPowerShellのプロンプトから入力します。

    PS C:\> Set-GPRegistryValue -Name TestPolicy -Key "HKEY_CURRENT_USER\Software\My
    App
    " -ValueName "Installpath" -Value "C:\Program Files\MyApp" -Type String

    DisplayName      : TestPolicy
    DomainName       : demodomain.com
    Owner            : DEMODOMAIN\Domain Admins
    Id               : 1eeb4b61-df4f-48eb-8e71-eb15d79bd855
    GpoStatus        : AllSettingsEnabled
    Description      :
    CreationTime     : 2009/06/01 11:48:21
    ModificationTime : 2009/06/01 12:09:10
    UserVersion      : AD Version: 3, SysVol Version: 3
    ComputerVersion  : AD Version: 2, SysVol Version: 2
    WmiFilter        :

    PS C:\>

    赤い文字で書かれている「TestPolicy」とは、すでに存在するGPOの名前です。レジストリの設定をポリシーの一部として組み込むわけですから、どのポリシーに組み込むかを指定する必要があります。

    「-Type String」は値のタイプです。今回は Reg_SZ を意味する String を指定しました。このほかに、ExpandString、Binary、DWord、MultiString、QWord を指定することができます。詳しくは、Get-Help Set-GPRegistryValue でヘルプを参照してください。

    以上で設定は完了です。複数のレジストリ値が存在する場合には同じ処理を繰り返せばよいわけです。

    この操作によって、SYSVOL配下のPoliciesフォルダに格納されているGPOに、上記の設定が書き込まれます。

    image

    しばらくすると、上で設定した値が実際のレジストリに反映されます。強制的に反映したい場合には、従来通り、コマンドプロンプト(PSプロンプトでもOKです)から gpupdate /force を実行しましょう。

    image

    レジストリエディタ上からこのエントリを消したり変更しても、バックグラウンド更新機能によって強制的に値が書き戻されます。

    4. 設定されている値を確認する

    設定されている値を確認するには、Get-GPRegistryValue を使用します。

    PS C:\> Get-GPRegistryValue -Name testpolicy  -Key "hkey_local_machine\software\myapp"

    KeyPath     : software\myapp
    FullKeyPath : HKEY_LOCAL_MACHINE\software\myapp
    Hive        : LocalMachine
    PolicyState : Set
    Value       : C:\Program Files\MyApp

    PS C:\>

    設定した値は、あとで削除したり無効にしたくなることもあります。

    その方法については次回。