WMI経由でのDNSサーバーの設定の仕方 – プログラミング – Home

WMI経由でのDNSサーバーの設定の仕...
 
通知
すべてクリア

[解決済] WMI経由でのDNSサーバーの設定の仕方


RYO
 RYO
(@RYO)
ゲスト
結合: 23年前
投稿: 252
Topic starter  

はじめまして。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(LWQL, LSELECT * 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
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

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
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

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
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

IWbemClassObject からパスを取得する方法がわかりませんでしたが
システムプロパティーというものがありました。

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

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


返信引用
RYO
 RYO
(@RYO)
ゲスト
結合: 23年前
投稿: 252
Topic starter  

subaruさん、返信ありがとうございます。

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

pWbemService->ExecQuery(_bstr_t(LWQL), _bstr_t(LSELECT * 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
 RYO
(@RYO)
ゲスト
結合: 23年前
投稿: 252
Topic starter  

先ほど書き込んだコードにミスがあったので訂正します。
[誤]
pWbemService->ExecQuery(_bstr_t(LWQL), _bstr_t(LSELECT * FROM
MicrosoftDNS_AType), 0,
NULL, &pWbemEnumerator);

[正]
pWbemService->ExecQuery(_bstr_t(LWQL), _bstr_t(LSELECT * FROM
MicrosoftDNS_ResourceRecord), 0,
NULL, &pWbemEnumerator);


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました