WMI経由でのDNSサーバーの設定の仕方

[戻る]
RYO 2010/02/17(水) 12:55:40
はじめまして。RYOと申します。
VS2008(MFC)からWindows 2008 Server上のDNSサーバーに対して
レコードの追加、削除を行うツールを作ろうとしています。

レコード追加に関しては以下のMSDNサンプルを参考に作ることができました。
http://msdn.microsoft.com/en-us/library/ms682130(VS.85).aspx

しかし削除がどうしてもできません。
C#などからSystem.Managementクラスを利用すると以下のような感じで
簡単に実現できるのですが…(サンプルなので色々省略してあります)
using System;
using System.Management;

ManagementObjectSearcher sercher = 
 new ManagementObjectSearcher("root\MicrosoftDNS", "SELECT * FROM
MicorosoftDNS_AType")
foreach(ManagementObject queryObj in searcher.Get())
{
 queryObj.Delete();
}

これをC++に直すと
pWbemService->ExecQuery(b_str_t(L"WQL", L"SELECT * FROM MicrosoftDNS_AType" 0,
NULL, &pWbemEnumerator);
while(pWbemEnumerator)
{
 pWbemEnumerator->Next()WBEM_INFINITE, 1, pWbemObject, &returned);
 if (returned ==0)
  return;
 pWbemObject->Delete();
}
こんな感じかな、と思ったのですがMSDNには
IWbemClassObject::Delete(LPCWSTR wszName)はwszNameで指定されたプロパティを削除す
るためのものとあります。

何かご存知の方がいらっしゃいましたらよろしくお願いいたします。

subaru 2010/02/17(水) 21:28:07
http://msdn.microsoft.com/ja-jp/library/ms974547.aspx
上記ページの後半にある「マネージ リソースのインスタンスの削除」のところを参考に
して、環境変数に関しては、
strInstance = "Win32_Environment.Name='TMPSHARE',UserName='<SYSTEM>'"
のような文字列を IWbemServices::DeleteInstance に渡してやると削除できることを確
認しました。

Win32_Environment の場合は Name と UserName が Key になっているようで
この2つの指定が必要みたいです。
MicrosoftDNS_AType の場合はどうなるのかはわかりませんが、同様の方法でできるかも
しれません。

ダメなら Microsoft WMI Scripting の方で VBScript のサンプル同様に
ISWbemServices::Delete or ISWbemObject::Delete_ を使うとか。

subaru 2010/02/17(水) 21:44:04
ISWbemServices::Delete でも結局渡すパラメータがわからないかもしれませんでした
ね。。。
一応以下のようなスクリプトを用意しておくとパス(?)を確認できるかもしれません。

strComputer = "."
strNamespace = "\root\cimv2"
strClass = "Win32_Environment"

Set objSWbemServices = GetObject("winmgmts:\\" & strComputer & strNamespace)
Set colSWbemObjectSet = objSWbemServices.ExecQuery("SELECT * FROM " & strClass)

For Each objSWbemObject In colSWbemObjectSet
    WScript.Echo objSWbemObject.Path_
Next

subaru 2010/02/18(木) 11:07:21
IWbemClassObject からパスを取得する方法がわかりませんでしたが
システムプロパティーというものがありました。

WMI System Properties
http://msdn.microsoft.com/en-us/library/aa394584%28VS.85%29.aspx

列挙したオブジェクトに対して IWbemClassObject::Get メソッドで
"__Relpath" という文字列を渡せば、
IWbemServices::DeleteInstance に渡すべきパラメータが取れそうです。

RYO 2010/02/18(木) 11:53:56
[[解決]]
subaruさん、返信ありがとうございます。

> 列挙したオブジェクトに対して IWbemClassObject::Get メソッドで
> "__Relpath" という文字列を渡せば、
> IWbemServices::DeleteInstance に渡すべきパラメータが取れそうです。
ここが肝でした。以下のような感じでレコード削除ができました。

pWbemService->ExecQuery(_bstr_t(L"WQL"), _bstr_t(L"SELECT * FROM
MicrosoftDNS_AType"), 0,
NULL, &pWbemEnumerator);
while(pWbemEnumerator)
{
 pWbemEnumerator->Next()WBEM_INFINITE, 1, pWbemObject, &returned);
 if (returned ==0)
  return;
 COleVariant varInstanceName;
 pWbemObject->Get(_bstr_t(L"__Relpath"), 0, &varInstanceName, NULL, NULL);
 pWbemService->DeleteInstance(varInstanceName.bstrVal, 0, NULL, NULL);
}

ISWbemServicesも少し試してみたんですが、
こちらは一層情報が少ないですね。
時間のあるときにじっくり調べてみようと思います。

今回、色々な可能性を探っていただき本当にありがとうございます。
自分の情報収集能力がまだまだであることを痛感いたしました…

RYO 2010/02/18(木) 12:39:08
先ほど書き込んだコードにミスがあったので訂正します。
[誤]
pWbemService->ExecQuery(_bstr_t(L"WQL"), _bstr_t(L"SELECT * FROM
MicrosoftDNS_AType"), 0,
NULL, &pWbemEnumerator);

[正]
pWbemService->ExecQuery(_bstr_t(L"WQL"), _bstr_t(L"SELECT * FROM
MicrosoftDNS_ResourceRecord"), 0,
NULL, &pWbemEnumerator);

古いスレッドには追加発言できません。