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#
};
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#
}
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
}
}
42. デザイナで构筑するアプローチ
SQL Server Integration Services
DB に対しての保守タスクや
データの操作等をドラッグ&ド
ロップしてワークフロー化する
RunBook 上に何かしらの操作や
トリガとなるアクティビティを配置
結びつけてワークフロー化する
System Center Orchestrator
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()
(あくまでも個人的な感想です)