SlideShare une entreprise Scribd logo
1  sur  53
WF4 + WMI + PS + α
で構築する運用管理
             小尾 智之(Ahf)
自己紹介

•インディー団体を含むプロレス全般と
クマ(クマー含む)やもふもふしたもの好き
•   Workflow Foundation マエストロが目標
•   @IT エンジニアライフで色々書いてます
•   Twitter/FB ぜひ気軽にフォローしてください
アジェンダ


•       管理技術の流れ
    – WMI
    – WMF

•       WF を用いての管理ツール
    –   WMI / PS のアクティビティ化
運用管理に必要な要素
 管理対象はさらに増えている
                 携帯電話・モバイル
ネットワーク




各種サーバー・クライアント
                 アプリケーション

                 今回の領域
Windows 管理方法の変遷




Win32API   WMI         WMF
• アクセスする
  アプリが必要   • COM を利用   • PowerShell
           • WSH       • http/https
                         でのアクセス
WMI
Windows Management
     Instrumentation
•   情報収集と通知を行うインターフェース
•   オブジェクト DB を採用し CIM リポジトリを実装
    – Common    Information Model
•   オープンな仕様による管理情報の提供
•   SNMP や DMI 等の既存標準の関連を用意
    – Sinmple Network Management Protocol
    – Desktop Management Interface (※ 現在は利用しない)

•Windows のバージョンアップに伴い WMI クラスとして
新機能の管理用インターフェースを追加し続けている
    – Windows   のほとんどにアクセス可能
WMI アーキテクチャ

C/C++ アプリ     .NET アプリ     スクリプト

                                      アプリケーション

             WMI COM API



               WMI core                   WMI
                                         リポジトリ


                                        プロバイダ
WMI プロバイダ   WMI プロバイダ        COM
                                        管理層


                           .NET WMI
     SNMP や WIN32          プロバイダ
Wmic コマンドの利用

 •   WMI から情報を取得や設定の更新を行うコマンド
 •   対話形式でもバッチ処理でも利用可能




                    /node オプションで
                   リモート接続も行える
WMI のリモート呼出

1.   RPC 経由にて呼び出した           WMI プロバイダホスト
     ホスト上で wmiprvse.exe が起     (wmiprvse.exe)
     動する
2.   wmiprvse が必要な WMI
     プロバイダを判断し
     モジュールをロード                プロバイダホストが
3.   ロードしたモジュールが              モジュールのロード
     処理を実行
4.   モジュールが結果を wmiprvse
     に返却
                               モジュールにて
5.   wmiprvse が呼び出し元の
     PC へと結果を返却                 処理の実行
WMI のポート設定

 •   WMI は DCOM を利用して別ホストと通信を行う
     –   DCOM は RPC を利用して通信を行う
 •   RPC は動的ポート割り当てを利用する仕組み
     – ポートを特定した静的な通信は行わない
     – レジストリの設定で利用するポート範囲指定は可能

 •   Vista 以降では利用するポートの固定化が可能

 ポート番号の固定化 (Vista 以降)
 [Winmgmt –standalonehost] 後にWMI サービスの再起動
 ※管理者権限が必要
 http://msdn.microsoft.com/en-us/library/bb219447(VS.85).aspx
アクセスする経路の違い
          エージェントやリスナー
          へのアクセス(WMF 等)
 エージェント




                  直接アクセス
   WMI
          • 直接的なアクセスの場合 WMI で利用する
            ポート設定と権限のあるアカウントが
            呼び出し元に必要
          • エージェントを利用する場合は
 リポジトリ      エージェント側に権限が必要
            (通信方法によってはポート設定は不要)
エージェントの展開と利用

•運用管理ツールにおいてエージェント的な仕組みを
利用すると情報採取を行いやすい
    –   エージェントレスでは採取するための設定が必要
        • WMI を利用するための設定等
        • 社内ルール等で WMI 用ポートを利用できない事も
    –   企業内では ActiveDirectory を利用した方法にて
        設定する事が可能
•   小規模ワークグループでは手作業もあり
    – ログオン時にエージェントのインストールを行う
      スクリプトの配布など、手作業を減らす方法も
    – メールに添付して配布とかもあり

                   配布方法も事前に設計しておく必要がある
PowerShell で WMI 操作


 •Get-WmiObject コマンドレット等
 WMI 操作用コマンドレットが
 標準で提供されている
WMI 関係のコマンドレット

         コマンド名                      処理内容
   Get-WmiObject       WMI オブジェクトの取得
   Invoke-WmiMethod    WMI クラスメソッドの呼び出し
   Register-Wmievent   WMI イベントの登録
                       ※削除は Unregister-Event にて行う
   Remove-WmiObject    WMI オブジェクトの削除
   Set-WmiInstance     WMI オブジェクトの作成・更新



Get-WmiObject で Win32_Process より特定のプロセス情報を取得し
その結果を Remove-WmiObject することでタスクの終了が行えるなど
使い方は幅広い
WMI イベント


  •   WMI が提供する通知の仕組み
      –   WQL の WITHIN 句にてイベントのチェックタイミングを指定
  •   アンマネージでのみ実装可能
WMI イベントの一例
イベントクラス                          利用例
__InstanceCreationEvent          何かしらのインスタンス生成をトラップ
__InstanceModificationEvent      インスタンスの状態変化をトラップ
__RegistryValueChangeEvent レジストリの値の変化をトラップ

$query = "Select * from __InstanceCreationEvent WITHIN 10 WHERE
TargetInstance ISA 'Win32_Process'“

Register-WmiEvent -Query $query -Action { Write-Host
“新しいプロセスが起動しました" }
コードから WMI を利用する

 •   管理者権限が必要
 •   System.Management に参照設定
Dim result = ""
Dim wmScope As New ManagementScope("" + My.Computer.Name + "rootcimv2")
wmScope.Connect
Dim wmQuery As New ObjectQuery("SELECT * FROM Win32_ComputerSystem")

Using searcher As New ManagementObjectSearcher(wmScope, wmQuery)
  Using queryCollection = searcher.Get()
    For Each wmResult In queryCollection
       result = wmResult("CSName").ToString
       Exit For
    Next
  End Using                                                                   VB.NET
End Using


string result = "";
ManagementScope wmScope = new ManagementScope("" + System.Environment.MachineName +
"rootcimv2");
wmScope.Connect();
ObjectQuery wmQuery = new ObjectQuery("SELECT * FROM Win32_ComputerSystem");

using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmScope,wmQuery)){
     using (ManagementObjectCollection querycollection = searcher.Get()){
        foreach (ManagementBaseObject wmresult in querycollection){
           result = (string)wmresult["CSName"];
        }
     };                                                                          C#
};
WMF / WinRM
Windows 管理フレームワーク


•   Windows Mangement Framework(WMF)
    – Windows PowerShell
    – Windows Remote Management(WinRM)
      • Windows Remote Shell(WinRS)
    – Windows Management Instrumentation
    – BITS
     バックグラウンドインテリジェント転送サービス

         WinRM       PowerShell
                                  これら 4 パッケージを
          WMI          BITS       併せて WMF と呼ぶ
WinRM アーキテクチャ


            WS-Management プロトコルで
            クライアント/サーバー通信を行う
WMF の機能要件


 •   WMF 2.0 まで
     – .NET   Framework 2.0~3.5
      • 共通言語ランタイム 2.0 が必要
     – Windows   XP SP3 以降
 •   WMF 3.0
     – .NETFramework 4.0
     – Windows 7 SP1 以降
     – Windows Server 2008 R2 以降


      WMF は PowerShell がコアを担っているので
      PowerShell の機能要件と同一
WinRM 初期設定

                               ポートやサービス
              Winrm qc          FWの設定を
                                一括で行う




             PowerShell の Enable-PSRemoting はこれ
                        を呼び出している
グループポリシーの WinRM 設定

[コンピューターの管理]-[管理用テンプレート]
-[Windows コンポーネント]-[WinRM]




クライアント側設定




 サービス側設定
利用する HTTP ポート

                                  バージョン確認




                        Windows XP SP3



          Windows 7

WinRM は 1.0 と 2.0 とでデフォルトで利用するポートが異
なっていますが、バージョンが同じであればホスト OS の違
いに関係なく初期に利用するポートは同一です
※WinRM 1.0/ 80(443) WinRm 2.0/5985(5986)
WinRM の利用




winrm [operation] [URI] [switch]
     -r スイッチにて接続対象となるホスト名を指定
WinRS

 •   WinRM で提供されるリモートシェル用コマンド
                 -r で接続先のホスト名を指定




                      リモートホスト上で
                      指定したコマンドの
                      実行結果
コードから WinRM を利用する

 •   管理者権限が必要
 •   wsmAuto.dll に参照設定
Dim wsAuto As New WSMan                                                      VB.NET
'ホスト名を指定してセッション作成
Dim wrmSession As IWSManSession = wsAuto.CreateSession(“HOSTNAME", 0, Nothing)
'ローカルへのセッション作成
'Dim wrmSession As IWSManSession = wsAuto.CreateSession(Nothing, 0, Nothing)

'値を取得
Dim res = wrmSession.Get("wmi/root/cimv2/win32_currenttime")
Console.WriteLine(res)

'WQL を実行して値を列挙
Dim resURI = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/*"
Dim dialect = "http://schemas.microsoft.com/wbem/wsman/1/WQL"
Dim wql = "SELECT * FROM Win32_Service WHERE Name='winrm'"
Dim resProc As IWSManEnumerator = wrmSession.Enumerate(resURI, wql, dialect)
Do While Not resProc.AtEndOfStream
  Console.WriteLine(resProc.ReadItem)
Loop
          WSMan wsAuto = new WSMan();
         IWSManSession wrmSession = wsAuto.CreateSession(@“HOSTNAME", 0, null);

        //WQL を実行して値を列挙
        string resURI = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/*";
        string dialect = "http://schemas.microsoft.com/wbem/wsman/1/WQL";
        string wql = "SELECT * FROM Win32_Service WHERE Name='winrm'";

        IWSManEnumerator resProc = wrmSession.Enumerate(resURI, wql, dialect);
        while (!resProc.AtEndOfStream) {
          Console.WriteLine(resProc.ReadItem());
                                                                                        C#
        }
WMI プロバイダ
自作アプリの運用管理


 •   自作アプリの運用管理に WMI を利用可能
     – WMI  プロバイダを自作・公開
     – System Center Operations Manager 等の
       運用管理ツールでは WMI からの取得を
       サポートしている



     統一した運用管理プラットフォームの構築


     個別に運用管理機能を作り込む必要がない
WMI プロバイダ
 •アプリケーションから WMI に情報を
 配信するための仕組みが用意されており
 独自に実装することができる

              インプロセス
     分離型
                型
• セルフホスト型    • WMI サービスホスト
• 実行中のみ可能    • 常に利用可能
• 管理者権限が必要   • GAC への配置が必要
•作成したアセンブリを
InstallUtil.exe
で登録する必要がある
    – 管理者権限で実行

•インプロセス型の場合
GAC に登録が必要
    – アセンブリの署名必須
strComputer = "."
objWMIService = GetObject("winmgmts:" & strComputer & "rootclrh")

colSettings = objWMIService.ExecQuery("Select * from clrh")

For Each objSetting In colSettings
  Wscript.Echo("(" & objSetting.Id & ") : " & objSetting.DisplayText)
Next

                                                                        テスト用 VBS




管理者権限で分離プロバイダ
   のアプリを実行




                                                 テスト用 VBS を実行すると
                                                 自作プロバイダより値が取得
                                                  できるのが確認できる
Imports System.Management.Instrumentation
                            Imports System.ComponentModel

                            ''' <summary>WMI プロバイダインストーラクラス</summary>
                            <RunInstaller(True)>
                            Public Class SampleWMIProviderInstaller
                                Inherits DefaultManagementInstaller
                                                                          インストーラクラス
                            End Class

Imports System.Management.Instrumentation
Public Class Form1
  Private wmiProvider As New SampleWMIProvider(Diagnostics.Process.GetCurrentProcess.Id)
  Private executeTimer As System.Threading.Timer = Nothing

  Private Sub Closed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
    InstrumentationManager.Revoke(wmiProvider)
  End Sub

  Private Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
    'タイマーにて1秒ごとにテキストボックスの内容を出力
    executeTimer = New Timer(New TimerCallback(AddressOf OutputData), Nothing, 0, 1000)
    ' WMI プロバイダの公開
    InstrumentationManager.Publish(wmiProvider)
  End Sub

  Private Sub OutputData()
    wmiProvider.DisplayText = TextBox1.Text
  End Sub                                                                    入力用フォーム
End Class
Imports System.Management.Instrumentation
                                                                      WMI プロバイダ
' アセンブリに対しての WMI 設定指定
<Assembly: WmiConfiguration("root/clrh",
                        HostingModel:=ManagementHostingModel.Decoupled,
                        IdentifyLevel:=False)>

<ManagementEntity(name:="clrh")>
<ManagementQualifier("Description", Value:="サンプル WMI プロバイダで誰でも利用可能です")>
Public Class SampleWMIProvider

#Region "プロパティ定義"
  <ManagementKey()>
  <ManagementQualifier("Description", value:="プロセス Id を取得します")>
  Public Property Id As Integer

  <ManagementConfiguration()>
  <ManagementQualifier("Description", value:="表示されている文字列を取得します")>
  Public Property DisplayText As String
#End Region

#Region "コンストラクタ"
  Public Sub New(ByVal Id As Integer)
    Me.Id = Id
  End Sub
#End Region

End Class
using System.Management.Instrumentation;
using System.ComponentModel;
namespace WMIProviderSampleCS
{
  [RunInstaller(true)]
  class SampleWMIProviderInstaller : DefaultManagementInstaller
  {
  }                                             インストーラクラス
}

using System;
using System.Windows.Forms;
using System.Management.Instrumentation;
using System.Threading;
namespace WMIProviderSampleCS{
  public partial class Form1 : Form
  { private SampleWMIProvider wmiProvider = new
SampleWMIProvider(System.Diagnostics.Process.GetCurrentProcess().Id);
     private Timer executeTimer = null;
     public Form1()
     { InitializeComponent();
        this.FormClosed += Closed;
        this.Shown += Showned;       }
     private void Closed(object sender, EventArgs e)
     { InstrumentationManager.Revoke(wmiProvider);       }
     private void Showned(object sender, EventArgs e)
     { executeTimer=new Timer(new TimerCallback(OutputData), null, 0, 1000);
        InstrumentationManager.Publish(wmiProvider);     }
     private void OutputData(object sender)                                    入力用フォーム
     { wmiProvider.DisplayText=textBox1.Text;       } }}
using System.Management.Instrumentation;
                                                                      WMI プロバイダ
[assembly: WmiConfiguration("root/clrh",
                         HostingModel=ManagementHostingModel.Decoupled,
                         IdentifyLevel=false)]
namespace WMIProviderSampleCS
{
   [ManagementEntity(Name="clrh")]
   [ManagementQualifier("Description", Value = "サンプル WMI プロバイダで誰でも利用可能です")]
   class SampleWMIProvider
   {

#region プロパティ定義
     [ManagementKey()]
     [ManagementQualifier("Description", Value = "プロセス Id を取得します")]
     public int Id;

    [ManagementConfiguration()]
    [ManagementQualifier("Description", Value = "表示されている文字列を取得します")]
    public string DisplayText;
#endregion

#region コンストラクタ
     public SampleWMIProvider(int id){
       this.Id=id;
     }
#endregion

    }
}
Demo.
WF を用いての管理ツール
ワークフロー化のメリット



スクリプト    VBS      処理の
ノウハウ    と .NET   見える化



   ワークフロー化することで
 既存ノウハウを多くの人が利用可能に
デザイナで構築するアプローチ

                                SQL Server Integration Services

                                DB に対しての保守タスクや
                                データの操作等をドラッグ&ド
                                ロップしてワークフロー化する




RunBook 上に何かしらの操作や
トリガとなるアクティビティを配置
結びつけてワークフロー化する


   System Center Orchestrator
ワークフロー化による見える化




MS 長沢さんの Blog より
(http://blogs.msdn.com/b/tomohn/archive/2010/06/16/essens-of-tfs-vol-8.aspx)
VBS のアクティビティ化


 •   VBS を直接呼び出すアクティビティ
     – Process.Start(“スクリプトファイル名”)

 •   .NET に変換したアクティビティ
                  を利用
     – System.Management
     – WMI を利用するロジックを作成
          VBS              System.Management


          WMI                    WMI


        リポジトリ                 リポジトリ
Dim objWMIResult
Dim objLocator
Dim objService                                          ローカルのホスト名を取得
Dim objWMIClass
Dim strPCName
                                                         する VBS スクリプト

'ローカルコンピュータに接続しクエリを実行する
objLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
objService = objLocator.ConnectServer
objWMIResult = objService.ExecQuery("Select * From Win32_OperatingSystem")

„結果の取得
For Each objWMIClass In objWMIResult
  strPCName = objWMIClass.CSName
Next

objWMIResult = Nothing
objWMIClass = Nothing
objService = Nothing
objLocator = Nothing



VBS スクリプトは構文的に VB.NET に近いので
C# 等を利用するよりも移植は行いやすい

                                                        (あくまでも個人的な感想です)
スクリプトを移植しアクティビティ化
Imports System.Activities
Imports System.Management

Public Class WMIComputerSystem
  Inherits CodeActivity(Of String)

  Protected Overrides Function Execute(context As CodeActivityContext) As String
    Dim result = ""
    Dim wmScope As New ManagementScope("" + My.Computer.Name + "rootcimv2")
    wmScope.Connect
    Dim wmQuery As New ObjectQuery("SELECT * FROM Win32_ComputerSystem")

    Using searcher As New ManagementObjectSearcher(wmScope, wmQuery)
      Using queryCollection = searcher.Get()
        For Each wmResult In queryCollection
           result = wmResult("CSName").ToString
           Exit For
        Next
      End Using
    End Using

    Return result
                                                           ローカルのホスト名を取得
  End Function                                             する WF4 アクティビティ
End Class
using System.Activities;
using System.Management;

namespace ConsoleApplication1
{
   class WMIComputerSystem :CodeActivity<string>
   {
      protected override string Execute(CodeActivityContext context)
      {
        string result = "";
        ManagementScope wmScope = new ManagementScope("" + System.Environment.MachineName
+ "rootcimv2");
        ObjectQuery wmQuery = new ObjectQuery("SELECT * FROM Win32_ComputerSystem");

     using (ManagementObjectSearcher searcher = new
ManagementObjectSearcher(wmScope,wmQuery)){
        using (ManagementObjectCollection querycollection = searcher.Get()){
           foreach (ManagementBaseObject wmresult in querycollection){
              result = (string)wmresult["CSName"];
           }
        };
     };

            return result;
        }
    }                                                               同一コードの C# 版
}
比較

'ローカルコンピュータに接続しクエリを実行する
objLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
objService = objLocator.ConnectServer
objWMIResult = objService.ExecQuery("Select * From Win32_OperatingSystem")




                                似通ったロジック


Dim wmScope As New ManagementScope("" + My.Computer.Name + "rootcimv2")
wmScope.Connect
Dim wmQuery As New ObjectQuery("SELECT * FROM Win32_ComputerSystem")

Using searcher As New ManagementObjectSearcher(wmScope, wmQuery)
  Using queryCollection = searcher.Get()




                                                           (あくまでも個人的な感想です)
PowerShell のアクティビティ化

 •PowerShell コマンドレットを直接
 呼び出すには若干手間が発生
 •パイプライン等を気にしないなら VBS を
 呼び出す方法と同一で可
 •WF4 サンプルとして提供されている
 InvokePowerShell アクティビティを
 利用する事も可




     http://msdn.microsoft.com/ja-jp/library/dd797586.aspx
PowerShell のアクティビティ化
  •PowerShell スクリプトと等価な処理を行う
  アクティビティを作成するのはお勧めできない
      – VBS で WMI を利用する事と比較して複雑
      – PowerShell コマンドレット自体が .NET の
        クラスなのであまり意味をなさない
  •   PowerShell 3.0 を利用可能なら利用が最適
      – 多数の   PowerShell アクティビティが提供
                     名前空間                     アクティビティ数
Microsoft.PowerShell.Activities               ※基本クラスのみ
Microsoft.PowerShell.Core.Activities             38
Microsoft.PowerShell.Security.Activities         10
Microsoft.PowerShell.Utilty.Activities           71
Microsoft.PowerShell.Diagnostics.Activities       5
Microsoft.PowerShell.Management.Activities       73
まとめ
 •   運用管理の基本は WMI で変わらず
 •WMI を利用しての情報取得は WinRM 等を
 利用する事で以前よりも容易に可能
     – 自作システムに
             WMI を通して情報提供する
      インターフェースを用意するのは効果あり
 •スクリプトをガシガシ作るのもいいが
 他の誰かでも作成できるような方向が吉
           Center Orchestrator や WF4 では
     – System
       アクティビティを追加する事で
       「誰でもできる」処理を簡単に増やせる
     – 特定の人間に頼らない仕組みへ
Appendix

•   WMI プロバイダの拡張機能サンプル
(http://msdn.microsoft.com/ja-jp/library/bb399711(VS.90).aspx)
• Winrows Remote Management Reference
(http://msdn.microsoft.com/en-us/library/aa384466(VS.85).aspx)
• Windows PowerShell Blog
(http://blogs.msdn.com/b/powershell/)
• Ron Jacobs – MSDN Blogs
(http://blogs.msdn.com/b/rjacobs/)
• てすとぶろぐ
(http://blogahf.blogspot.jp/)
WF4 + WMI + PS + αで運用管理

Contenu connexe

Similaire à WF4 + WMI + PS + αで運用管理

2010-11-02 第1回クラウドコンピューティング基盤シンポジウム(品川)
2010-11-02 第1回クラウドコンピューティング基盤シンポジウム(品川)2010-11-02 第1回クラウドコンピューティング基盤シンポジウム(品川)
2010-11-02 第1回クラウドコンピューティング基盤シンポジウム(品川)
Takahiro Shinagawa
 
「Vimrcリーディングに役立ちそうな」vimrcの設定とplugin管理
「Vimrcリーディングに役立ちそうな」vimrcの設定とplugin管理「Vimrcリーディングに役立ちそうな」vimrcの設定とplugin管理
「Vimrcリーディングに役立ちそうな」vimrcの設定とplugin管理
gu4
 
Windows Server 2012 で管理をもっと自動化する
Windows Server 2012 で管理をもっと自動化するWindows Server 2012 で管理をもっと自動化する
Windows Server 2012 で管理をもっと自動化する
junichi anno
 
App controllerとSPFで実現するハイブリッドクラウド
App controllerとSPFで実現するハイブリッドクラウドApp controllerとSPFで実現するハイブリッドクラウド
App controllerとSPFで実現するハイブリッドクラウド
Takashi Kanai
 
20120821 pronet study
20120821 pronet study20120821 pronet study
20120821 pronet study
Six Apart
 

Similaire à WF4 + WMI + PS + αで運用管理 (20)

VIOPS04: Intel VT ~仮想化を支える基礎技術~
VIOPS04: Intel VT ~仮想化を支える基礎技術~VIOPS04: Intel VT ~仮想化を支える基礎技術~
VIOPS04: Intel VT ~仮想化を支える基礎技術~
 
Interact2015:Host Guardian Service ってなに?(仮)
Interact2015:Host Guardian Service ってなに?(仮)Interact2015:Host Guardian Service ってなに?(仮)
Interact2015:Host Guardian Service ってなに?(仮)
 
Clrh 110716 wcfwf
Clrh 110716 wcfwfClrh 110716 wcfwf
Clrh 110716 wcfwf
 
Windows スクリプトセミナー WMI編 VBScript&WMI
Windows スクリプトセミナー WMI編 VBScript&WMIWindows スクリプトセミナー WMI編 VBScript&WMI
Windows スクリプトセミナー WMI編 VBScript&WMI
 
2010-11-02 第1回クラウドコンピューティング基盤シンポジウム(品川)
2010-11-02 第1回クラウドコンピューティング基盤シンポジウム(品川)2010-11-02 第1回クラウドコンピューティング基盤シンポジウム(品川)
2010-11-02 第1回クラウドコンピューティング基盤シンポジウム(品川)
 
次世代仮想化テクノロジー
次世代仮想化テクノロジー次世代仮想化テクノロジー
次世代仮想化テクノロジー
 
次世代仮想化テクノロジー
次世代仮想化テクノロジー次世代仮想化テクノロジー
次世代仮想化テクノロジー
 
SC2012 VMM SP1 Update ヒーロー島 版
SC2012 VMM SP1 Update ヒーロー島 版SC2012 VMM SP1 Update ヒーロー島 版
SC2012 VMM SP1 Update ヒーロー島 版
 
SCCM を用いた OS 展開
SCCM を用いた OS 展開SCCM を用いた OS 展開
SCCM を用いた OS 展開
 
Cloud OS Tech Day 2014:Windows Azure Pack プライベートクラウドとセルフポータル(仮)
Cloud OS Tech Day 2014:Windows Azure Pack プライベートクラウドとセルフポータル(仮)Cloud OS Tech Day 2014:Windows Azure Pack プライベートクラウドとセルフポータル(仮)
Cloud OS Tech Day 2014:Windows Azure Pack プライベートクラウドとセルフポータル(仮)
 
「Vimrcリーディングに役立ちそうな」vimrcの設定とplugin管理
「Vimrcリーディングに役立ちそうな」vimrcの設定とplugin管理「Vimrcリーディングに役立ちそうな」vimrcの設定とplugin管理
「Vimrcリーディングに役立ちそうな」vimrcの設定とplugin管理
 
Windows 7 オプショナルツール 一挙紹介
Windows 7 オプショナルツール 一挙紹介Windows 7 オプショナルツール 一挙紹介
Windows 7 オプショナルツール 一挙紹介
 
Windows Server 2012 で管理をもっと自動化する
Windows Server 2012 で管理をもっと自動化するWindows Server 2012 で管理をもっと自動化する
Windows Server 2012 で管理をもっと自動化する
 
App controllerとSPFで実現するハイブリッドクラウド
App controllerとSPFで実現するハイブリッドクラウドApp controllerとSPFで実現するハイブリッドクラウド
App controllerとSPFで実現するハイブリッドクラウド
 
Windows 展開の自動化ツール - Microsoft Deployment Toolkit
Windows 展開の自動化ツール - Microsoft Deployment ToolkitWindows 展開の自動化ツール - Microsoft Deployment Toolkit
Windows 展開の自動化ツール - Microsoft Deployment Toolkit
 
Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識
 
Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識
 
20120821 pronet study
20120821 pronet study20120821 pronet study
20120821 pronet study
 
INF-009_PowerShell を 使いこなして、自動化対応 エンジニア になろう!!
INF-009_PowerShell を 使いこなして、自動化対応 エンジニア になろう!!INF-009_PowerShell を 使いこなして、自動化対応 エンジニア になろう!!
INF-009_PowerShell を 使いこなして、自動化対応 エンジニア になろう!!
 
Wakame-VDC / Open Source Conferense 2012 - Cloud (JP)
Wakame-VDC / Open Source Conferense 2012 - Cloud (JP)Wakame-VDC / Open Source Conferense 2012 - Cloud (JP)
Wakame-VDC / Open Source Conferense 2012 - Cloud (JP)
 

Plus de Tomoyuki Obi

Plus de Tomoyuki Obi (20)

それは本当にAutomate? 改めて考えるPower Automate
それは本当にAutomate? 改めて考えるPower Automateそれは本当にAutomate? 改めて考えるPower Automate
それは本当にAutomate? 改めて考えるPower Automate
 
Only Logic Apps
Only Logic AppsOnly Logic Apps
Only Logic Apps
 
This is iPaas
This is iPaasThis is iPaas
This is iPaas
 
Miniacs Power Automate
Miniacs Power AutomateMiniacs Power Automate
Miniacs Power Automate
 
Work Automate with Power Automate
Work Automate with Power AutomateWork Automate with Power Automate
Work Automate with Power Automate
 
JSON Value into Power Automate
JSON Value into Power AutomateJSON Value into Power Automate
JSON Value into Power Automate
 
CodelessDevelop using iPaas
CodelessDevelop using iPaasCodelessDevelop using iPaas
CodelessDevelop using iPaas
 
20190727_DevelopUseiPaas
20190727_DevelopUseiPaas20190727_DevelopUseiPaas
20190727_DevelopUseiPaas
 
Logic Apps/Flow Update Summary
Logic Apps/Flow Update SummaryLogic Apps/Flow Update Summary
Logic Apps/Flow Update Summary
 
decode2019_HandsOn_Flow_04
decode2019_HandsOn_Flow_04decode2019_HandsOn_Flow_04
decode2019_HandsOn_Flow_04
 
decode2019_HandsOn_Flow_03
decode2019_HandsOn_Flow_03decode2019_HandsOn_Flow_03
decode2019_HandsOn_Flow_03
 
decode2019_HandsOn_Flow_02
decode2019_HandsOn_Flow_02decode2019_HandsOn_Flow_02
decode2019_HandsOn_Flow_02
 
decode2019_HandsOn_Flow_01
decode2019_HandsOn_Flow_01decode2019_HandsOn_Flow_01
decode2019_HandsOn_Flow_01
 
20190427 global azurebootcamp
20190427 global azurebootcamp20190427 global azurebootcamp
20190427 global azurebootcamp
 
20181215 PowerApps + Flow Handson
20181215 PowerApps + Flow Handson20181215 PowerApps + Flow Handson
20181215 PowerApps + Flow Handson
 
20181120 HowtoFlow
20181120 HowtoFlow20181120 HowtoFlow
20181120 HowtoFlow
 
20180929 lowcode developlogicflow
20180929 lowcode developlogicflow20180929 lowcode developlogicflow
20180929 lowcode developlogicflow
 
20180721 First Challenge Logicflow
20180721 First Challenge Logicflow20180721 First Challenge Logicflow
20180721 First Challenge Logicflow
 
20180630 data transformationusinglogicflow
20180630 data transformationusinglogicflow20180630 data transformationusinglogicflow
20180630 data transformationusinglogicflow
 
Create Bot using LogicApps
Create Bot using LogicAppsCreate Bot using LogicApps
Create Bot using LogicApps
 

Dernier

Dernier (10)

論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 

WF4 + WMI + PS + αで運用管理

  • 1. WF4 + WMI + PS + α で構築する運用管理 小尾 智之(Ahf)
  • 2. 自己紹介 •インディー団体を含むプロレス全般と クマ(クマー含む)やもふもふしたもの好き • Workflow Foundation マエストロが目標 • @IT エンジニアライフで色々書いてます • Twitter/FB ぜひ気軽にフォローしてください
  • 3. アジェンダ • 管理技術の流れ – WMI – WMF • WF を用いての管理ツール – WMI / PS のアクティビティ化
  • 4. 運用管理に必要な要素 管理対象はさらに増えている 携帯電話・モバイル ネットワーク 各種サーバー・クライアント アプリケーション 今回の領域
  • 5. Windows 管理方法の変遷 Win32API WMI WMF • アクセスする アプリが必要 • COM を利用 • PowerShell • WSH • http/https でのアクセス
  • 6. WMI
  • 7. Windows Management Instrumentation • 情報収集と通知を行うインターフェース • オブジェクト DB を採用し CIM リポジトリを実装 – Common Information Model • オープンな仕様による管理情報の提供 • SNMP や DMI 等の既存標準の関連を用意 – Sinmple Network Management Protocol – Desktop Management Interface (※ 現在は利用しない) •Windows のバージョンアップに伴い WMI クラスとして 新機能の管理用インターフェースを追加し続けている – Windows のほとんどにアクセス可能
  • 8. WMI アーキテクチャ C/C++ アプリ .NET アプリ スクリプト アプリケーション WMI COM API WMI core WMI リポジトリ プロバイダ WMI プロバイダ WMI プロバイダ COM 管理層 .NET WMI SNMP や WIN32 プロバイダ
  • 9. Wmic コマンドの利用 • WMI から情報を取得や設定の更新を行うコマンド • 対話形式でもバッチ処理でも利用可能 /node オプションで リモート接続も行える
  • 10. WMI のリモート呼出 1. RPC 経由にて呼び出した WMI プロバイダホスト ホスト上で wmiprvse.exe が起 (wmiprvse.exe) 動する 2. wmiprvse が必要な WMI プロバイダを判断し モジュールをロード プロバイダホストが 3. ロードしたモジュールが モジュールのロード 処理を実行 4. モジュールが結果を wmiprvse に返却 モジュールにて 5. wmiprvse が呼び出し元の PC へと結果を返却 処理の実行
  • 11. WMI のポート設定 • WMI は DCOM を利用して別ホストと通信を行う – DCOM は RPC を利用して通信を行う • RPC は動的ポート割り当てを利用する仕組み – ポートを特定した静的な通信は行わない – レジストリの設定で利用するポート範囲指定は可能 • Vista 以降では利用するポートの固定化が可能 ポート番号の固定化 (Vista 以降) [Winmgmt –standalonehost] 後にWMI サービスの再起動 ※管理者権限が必要 http://msdn.microsoft.com/en-us/library/bb219447(VS.85).aspx
  • 12. アクセスする経路の違い エージェントやリスナー へのアクセス(WMF 等) エージェント 直接アクセス WMI • 直接的なアクセスの場合 WMI で利用する ポート設定と権限のあるアカウントが 呼び出し元に必要 • エージェントを利用する場合は リポジトリ エージェント側に権限が必要 (通信方法によってはポート設定は不要)
  • 13. エージェントの展開と利用 •運用管理ツールにおいてエージェント的な仕組みを 利用すると情報採取を行いやすい – エージェントレスでは採取するための設定が必要 • WMI を利用するための設定等 • 社内ルール等で WMI 用ポートを利用できない事も – 企業内では ActiveDirectory を利用した方法にて 設定する事が可能 • 小規模ワークグループでは手作業もあり – ログオン時にエージェントのインストールを行う スクリプトの配布など、手作業を減らす方法も – メールに添付して配布とかもあり 配布方法も事前に設計しておく必要がある
  • 14. PowerShell で WMI 操作 •Get-WmiObject コマンドレット等 WMI 操作用コマンドレットが 標準で提供されている
  • 15. WMI 関係のコマンドレット コマンド名 処理内容 Get-WmiObject WMI オブジェクトの取得 Invoke-WmiMethod WMI クラスメソッドの呼び出し Register-Wmievent WMI イベントの登録 ※削除は Unregister-Event にて行う Remove-WmiObject WMI オブジェクトの削除 Set-WmiInstance WMI オブジェクトの作成・更新 Get-WmiObject で Win32_Process より特定のプロセス情報を取得し その結果を Remove-WmiObject することでタスクの終了が行えるなど 使い方は幅広い
  • 16. WMI イベント • WMI が提供する通知の仕組み – WQL の WITHIN 句にてイベントのチェックタイミングを指定 • アンマネージでのみ実装可能 WMI イベントの一例 イベントクラス 利用例 __InstanceCreationEvent 何かしらのインスタンス生成をトラップ __InstanceModificationEvent インスタンスの状態変化をトラップ __RegistryValueChangeEvent レジストリの値の変化をトラップ $query = "Select * from __InstanceCreationEvent WITHIN 10 WHERE TargetInstance ISA 'Win32_Process'“ Register-WmiEvent -Query $query -Action { Write-Host “新しいプロセスが起動しました" }
  • 17. コードから WMI を利用する • 管理者権限が必要 • System.Management に参照設定
  • 18. Dim result = "" Dim wmScope As New ManagementScope("" + My.Computer.Name + "rootcimv2") wmScope.Connect Dim wmQuery As New ObjectQuery("SELECT * FROM Win32_ComputerSystem") Using searcher As New ManagementObjectSearcher(wmScope, wmQuery) Using queryCollection = searcher.Get() For Each wmResult In queryCollection result = wmResult("CSName").ToString Exit For Next End Using VB.NET End Using string result = ""; ManagementScope wmScope = new ManagementScope("" + System.Environment.MachineName + "rootcimv2"); wmScope.Connect(); ObjectQuery wmQuery = new ObjectQuery("SELECT * FROM Win32_ComputerSystem"); using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmScope,wmQuery)){ using (ManagementObjectCollection querycollection = searcher.Get()){ foreach (ManagementBaseObject wmresult in querycollection){ result = (string)wmresult["CSName"]; } }; C# };
  • 20. Windows 管理フレームワーク • Windows Mangement Framework(WMF) – Windows PowerShell – Windows Remote Management(WinRM) • Windows Remote Shell(WinRS) – Windows Management Instrumentation – BITS バックグラウンドインテリジェント転送サービス WinRM PowerShell これら 4 パッケージを WMI BITS 併せて WMF と呼ぶ
  • 21. WinRM アーキテクチャ WS-Management プロトコルで クライアント/サーバー通信を行う
  • 22. WMF の機能要件 • WMF 2.0 まで – .NET Framework 2.0~3.5 • 共通言語ランタイム 2.0 が必要 – Windows XP SP3 以降 • WMF 3.0 – .NETFramework 4.0 – Windows 7 SP1 以降 – Windows Server 2008 R2 以降 WMF は PowerShell がコアを担っているので PowerShell の機能要件と同一
  • 23. WinRM 初期設定 ポートやサービス Winrm qc FWの設定を 一括で行う PowerShell の Enable-PSRemoting はこれ を呼び出している
  • 24. グループポリシーの WinRM 設定 [コンピューターの管理]-[管理用テンプレート] -[Windows コンポーネント]-[WinRM] クライアント側設定 サービス側設定
  • 25. 利用する HTTP ポート バージョン確認 Windows XP SP3 Windows 7 WinRM は 1.0 と 2.0 とでデフォルトで利用するポートが異 なっていますが、バージョンが同じであればホスト OS の違 いに関係なく初期に利用するポートは同一です ※WinRM 1.0/ 80(443) WinRm 2.0/5985(5986)
  • 26. WinRM の利用 winrm [operation] [URI] [switch] -r スイッチにて接続対象となるホスト名を指定
  • 27. WinRS • WinRM で提供されるリモートシェル用コマンド -r で接続先のホスト名を指定 リモートホスト上で 指定したコマンドの 実行結果
  • 28. コードから WinRM を利用する • 管理者権限が必要 • wsmAuto.dll に参照設定
  • 29. Dim wsAuto As New WSMan VB.NET 'ホスト名を指定してセッション作成 Dim wrmSession As IWSManSession = wsAuto.CreateSession(“HOSTNAME", 0, Nothing) 'ローカルへのセッション作成 'Dim wrmSession As IWSManSession = wsAuto.CreateSession(Nothing, 0, Nothing) '値を取得 Dim res = wrmSession.Get("wmi/root/cimv2/win32_currenttime") Console.WriteLine(res) 'WQL を実行して値を列挙 Dim resURI = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/*" Dim dialect = "http://schemas.microsoft.com/wbem/wsman/1/WQL" Dim wql = "SELECT * FROM Win32_Service WHERE Name='winrm'" Dim resProc As IWSManEnumerator = wrmSession.Enumerate(resURI, wql, dialect) Do While Not resProc.AtEndOfStream Console.WriteLine(resProc.ReadItem) Loop WSMan wsAuto = new WSMan(); IWSManSession wrmSession = wsAuto.CreateSession(@“HOSTNAME", 0, null); //WQL を実行して値を列挙 string resURI = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/*"; string dialect = "http://schemas.microsoft.com/wbem/wsman/1/WQL"; string wql = "SELECT * FROM Win32_Service WHERE Name='winrm'"; IWSManEnumerator resProc = wrmSession.Enumerate(resURI, wql, dialect); while (!resProc.AtEndOfStream) { Console.WriteLine(resProc.ReadItem()); C# }
  • 31. 自作アプリの運用管理 • 自作アプリの運用管理に WMI を利用可能 – WMI プロバイダを自作・公開 – System Center Operations Manager 等の 運用管理ツールでは WMI からの取得を サポートしている 統一した運用管理プラットフォームの構築 個別に運用管理機能を作り込む必要がない
  • 32. WMI プロバイダ •アプリケーションから WMI に情報を 配信するための仕組みが用意されており 独自に実装することができる インプロセス 分離型 型 • セルフホスト型 • WMI サービスホスト • 実行中のみ可能 • 常に利用可能 • 管理者権限が必要 • GAC への配置が必要
  • 33. •作成したアセンブリを InstallUtil.exe で登録する必要がある – 管理者権限で実行 •インプロセス型の場合 GAC に登録が必要 – アセンブリの署名必須
  • 34. strComputer = "." objWMIService = GetObject("winmgmts:" & strComputer & "rootclrh") colSettings = objWMIService.ExecQuery("Select * from clrh") For Each objSetting In colSettings Wscript.Echo("(" & objSetting.Id & ") : " & objSetting.DisplayText) Next テスト用 VBS 管理者権限で分離プロバイダ のアプリを実行 テスト用 VBS を実行すると 自作プロバイダより値が取得 できるのが確認できる
  • 35. Imports System.Management.Instrumentation Imports System.ComponentModel ''' <summary>WMI プロバイダインストーラクラス</summary> <RunInstaller(True)> Public Class SampleWMIProviderInstaller Inherits DefaultManagementInstaller インストーラクラス End Class Imports System.Management.Instrumentation Public Class Form1 Private wmiProvider As New SampleWMIProvider(Diagnostics.Process.GetCurrentProcess.Id) Private executeTimer As System.Threading.Timer = Nothing Private Sub Closed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed InstrumentationManager.Revoke(wmiProvider) End Sub Private Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown 'タイマーにて1秒ごとにテキストボックスの内容を出力 executeTimer = New Timer(New TimerCallback(AddressOf OutputData), Nothing, 0, 1000) ' WMI プロバイダの公開 InstrumentationManager.Publish(wmiProvider) End Sub Private Sub OutputData() wmiProvider.DisplayText = TextBox1.Text End Sub 入力用フォーム End Class
  • 36. Imports System.Management.Instrumentation WMI プロバイダ ' アセンブリに対しての WMI 設定指定 <Assembly: WmiConfiguration("root/clrh", HostingModel:=ManagementHostingModel.Decoupled, IdentifyLevel:=False)> <ManagementEntity(name:="clrh")> <ManagementQualifier("Description", Value:="サンプル WMI プロバイダで誰でも利用可能です")> Public Class SampleWMIProvider #Region "プロパティ定義" <ManagementKey()> <ManagementQualifier("Description", value:="プロセス Id を取得します")> Public Property Id As Integer <ManagementConfiguration()> <ManagementQualifier("Description", value:="表示されている文字列を取得します")> Public Property DisplayText As String #End Region #Region "コンストラクタ" Public Sub New(ByVal Id As Integer) Me.Id = Id End Sub #End Region End Class
  • 37. using System.Management.Instrumentation; using System.ComponentModel; namespace WMIProviderSampleCS { [RunInstaller(true)] class SampleWMIProviderInstaller : DefaultManagementInstaller { } インストーラクラス } using System; using System.Windows.Forms; using System.Management.Instrumentation; using System.Threading; namespace WMIProviderSampleCS{ public partial class Form1 : Form { private SampleWMIProvider wmiProvider = new SampleWMIProvider(System.Diagnostics.Process.GetCurrentProcess().Id); private Timer executeTimer = null; public Form1() { InitializeComponent(); this.FormClosed += Closed; this.Shown += Showned; } private void Closed(object sender, EventArgs e) { InstrumentationManager.Revoke(wmiProvider); } private void Showned(object sender, EventArgs e) { executeTimer=new Timer(new TimerCallback(OutputData), null, 0, 1000); InstrumentationManager.Publish(wmiProvider); } private void OutputData(object sender) 入力用フォーム { wmiProvider.DisplayText=textBox1.Text; } }}
  • 38. using System.Management.Instrumentation; WMI プロバイダ [assembly: WmiConfiguration("root/clrh", HostingModel=ManagementHostingModel.Decoupled, IdentifyLevel=false)] namespace WMIProviderSampleCS { [ManagementEntity(Name="clrh")] [ManagementQualifier("Description", Value = "サンプル WMI プロバイダで誰でも利用可能です")] class SampleWMIProvider { #region プロパティ定義 [ManagementKey()] [ManagementQualifier("Description", Value = "プロセス Id を取得します")] public int Id; [ManagementConfiguration()] [ManagementQualifier("Description", Value = "表示されている文字列を取得します")] public string DisplayText; #endregion #region コンストラクタ public SampleWMIProvider(int id){ this.Id=id; } #endregion } }
  • 39. Demo.
  • 41. ワークフロー化のメリット スクリプト VBS 処理の ノウハウ と .NET 見える化 ワークフロー化することで 既存ノウハウを多くの人が利用可能に
  • 42. デザイナで構築するアプローチ SQL Server Integration Services DB に対しての保守タスクや データの操作等をドラッグ&ド ロップしてワークフロー化する RunBook 上に何かしらの操作や トリガとなるアクティビティを配置 結びつけてワークフロー化する System Center Orchestrator
  • 43. ワークフロー化による見える化 MS 長沢さんの Blog より (http://blogs.msdn.com/b/tomohn/archive/2010/06/16/essens-of-tfs-vol-8.aspx)
  • 44. VBS のアクティビティ化 • VBS を直接呼び出すアクティビティ – Process.Start(“スクリプトファイル名”) • .NET に変換したアクティビティ を利用 – System.Management – WMI を利用するロジックを作成 VBS System.Management WMI WMI リポジトリ リポジトリ
  • 45. Dim objWMIResult Dim objLocator Dim objService ローカルのホスト名を取得 Dim objWMIClass Dim strPCName する VBS スクリプト 'ローカルコンピュータに接続しクエリを実行する objLocator = WScript.CreateObject("WbemScripting.SWbemLocator") objService = objLocator.ConnectServer objWMIResult = objService.ExecQuery("Select * From Win32_OperatingSystem") „結果の取得 For Each objWMIClass In objWMIResult strPCName = objWMIClass.CSName Next objWMIResult = Nothing objWMIClass = Nothing objService = Nothing objLocator = Nothing VBS スクリプトは構文的に VB.NET に近いので C# 等を利用するよりも移植は行いやすい (あくまでも個人的な感想です)
  • 46. スクリプトを移植しアクティビティ化 Imports System.Activities Imports System.Management Public Class WMIComputerSystem Inherits CodeActivity(Of String) Protected Overrides Function Execute(context As CodeActivityContext) As String Dim result = "" Dim wmScope As New ManagementScope("" + My.Computer.Name + "rootcimv2") wmScope.Connect Dim wmQuery As New ObjectQuery("SELECT * FROM Win32_ComputerSystem") Using searcher As New ManagementObjectSearcher(wmScope, wmQuery) Using queryCollection = searcher.Get() For Each wmResult In queryCollection result = wmResult("CSName").ToString Exit For Next End Using End Using Return result ローカルのホスト名を取得 End Function する WF4 アクティビティ End Class
  • 47. using System.Activities; using System.Management; namespace ConsoleApplication1 { class WMIComputerSystem :CodeActivity<string> { protected override string Execute(CodeActivityContext context) { string result = ""; ManagementScope wmScope = new ManagementScope("" + System.Environment.MachineName + "rootcimv2"); ObjectQuery wmQuery = new ObjectQuery("SELECT * FROM Win32_ComputerSystem"); using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmScope,wmQuery)){ using (ManagementObjectCollection querycollection = searcher.Get()){ foreach (ManagementBaseObject wmresult in querycollection){ result = (string)wmresult["CSName"]; } }; }; return result; } } 同一コードの C# 版 }
  • 48. 比較 'ローカルコンピュータに接続しクエリを実行する objLocator = WScript.CreateObject("WbemScripting.SWbemLocator") objService = objLocator.ConnectServer objWMIResult = objService.ExecQuery("Select * From Win32_OperatingSystem") 似通ったロジック Dim wmScope As New ManagementScope("" + My.Computer.Name + "rootcimv2") wmScope.Connect Dim wmQuery As New ObjectQuery("SELECT * FROM Win32_ComputerSystem") Using searcher As New ManagementObjectSearcher(wmScope, wmQuery) Using queryCollection = searcher.Get() (あくまでも個人的な感想です)
  • 49. PowerShell のアクティビティ化 •PowerShell コマンドレットを直接 呼び出すには若干手間が発生 •パイプライン等を気にしないなら VBS を 呼び出す方法と同一で可 •WF4 サンプルとして提供されている InvokePowerShell アクティビティを 利用する事も可 http://msdn.microsoft.com/ja-jp/library/dd797586.aspx
  • 50. PowerShell のアクティビティ化 •PowerShell スクリプトと等価な処理を行う アクティビティを作成するのはお勧めできない – VBS で WMI を利用する事と比較して複雑 – PowerShell コマンドレット自体が .NET の クラスなのであまり意味をなさない • PowerShell 3.0 を利用可能なら利用が最適 – 多数の PowerShell アクティビティが提供 名前空間 アクティビティ数 Microsoft.PowerShell.Activities ※基本クラスのみ Microsoft.PowerShell.Core.Activities 38 Microsoft.PowerShell.Security.Activities 10 Microsoft.PowerShell.Utilty.Activities 71 Microsoft.PowerShell.Diagnostics.Activities 5 Microsoft.PowerShell.Management.Activities 73
  • 51. まとめ • 運用管理の基本は WMI で変わらず •WMI を利用しての情報取得は WinRM 等を 利用する事で以前よりも容易に可能 – 自作システムに WMI を通して情報提供する インターフェースを用意するのは効果あり •スクリプトをガシガシ作るのもいいが 他の誰かでも作成できるような方向が吉 Center Orchestrator や WF4 では – System アクティビティを追加する事で 「誰でもできる」処理を簡単に増やせる – 特定の人間に頼らない仕組みへ
  • 52. Appendix • WMI プロバイダの拡張機能サンプル (http://msdn.microsoft.com/ja-jp/library/bb399711(VS.90).aspx) • Winrows Remote Management Reference (http://msdn.microsoft.com/en-us/library/aa384466(VS.85).aspx) • Windows PowerShell Blog (http://blogs.msdn.com/b/powershell/) • Ron Jacobs – MSDN Blogs (http://blogs.msdn.com/b/rjacobs/) • てすとぶろぐ (http://blogahf.blogspot.jp/)