1 (изменено: inock, 2021-06-01 18:01:10)

Тема: VBScript: DNS WMI Provider

Граждане, кто-нибудь работал с этой шнягой?
https://docs.microsoft.com/en-us/window … i-provider
Что-то я читаю-читаю, и никак не разберусь. Возможно, уровень английского не позволяет.

Мне надо в цикле пройтись по записям и изменить их свойства.
Получить список записей удается:

+ открыть спойлер
strServer = "bte-dc-01"
strNameSpace = "root\microsoftDNS"
strDomain = "ats.teplo.local"

Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer (strServer, strNameSpace)
set objDNS = objService.Get("MicrosoftDNS_Server.name="".""")


'Проверяем подключение:
ObjService.Security_.impersonationlevel = 3
    If Err.Number then
        Call Wscript.Echo( "Error 0x" & CStr(Hex(Err.Number)) & _
                           " occurred in connecting to server " _
           & strServer & ".")
        If Err.Description <> "" Then
            Call Wscript.Echo( "Error description: " & Err.Description & "." )
        End If
        Err.Clear
        blnConnect = True     'An error occurred
    End If


'Запрос записей
Set objDNS = objService.ExecQuery("Select * from MicrosoftDNS_ResourceRecord where DomainName=""" & strDomain & """",,48)
        For Each objInst in objDNS    
             wscript.echo objInst.TextRepresentation
        Next

Код выводит в консоль список имеющихся записей. Но вот как изменить их свойства - никак не могу разобраться. По сути, мне нужно отключить вот эту опцию (см приложенную картинку). То есть, как я понимаю, надо как-то сделать get записи, изменить ее свойства и сохранить. Кто-нибудь может показать пример кода, а то я что-то голову сломал... Из примеров на docs.microsoft.com ничего не понятно, в гугле примеров практически нет. На powershell еще встречаются, а на vbs практически ничего не нашел.

Спасибо.

Post's attachments

2021-06-01_15-55-05.png
2021-06-01_15-55-05.png 14.68 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

2

Re: VBScript: DNS WMI Provider

inock, иногда пониманию способствует поиграться «ручками» посредством WMI CIM Studio из WMITools (если нужно — скажите, выложу).

3

Re: VBScript: DNS WMI Provider

alexii, выложите. Мне нужно.

4 (изменено: inock, 2021-06-03 15:35:00)

Re: VBScript: DNS WMI Provider

alexii

Был бы признателен )

UPD:
выкачал WMI code creater. Действительно все становится существенно понятнее. Спасибо за наводку.

5

Re: VBScript: DNS WMI Provider

Но все-таки я выскажусь.

Вот рабочий код. Все переменные раскрыты, чтобы было максимально наглядно.

+ открыть спойлер
strServer = "bte-dc-01" 
Set objWMIService = GetObject("winmgmts:\\" & strServer & "\root\MicrosoftDNS") 
' Obtain an instance of the the class 
' using a key property value.
Set objShare = objWMIService.Get("MicrosoftDNS_AType.ContainerName='teplo.local',DnsServerName='BTE-DC-01.teplo.local',DomainName='ats.teplo.local',OwnerName='1046.ats.teplo.local',RecordClass='1',RecordData='10.32.99.81'")


' Obtain an InParameters object specific
' to the method.
Set objInParam = objShare.Methods_("CreateInstanceFromTextRepresentation"). _
    inParameters.SpawnInstance_()


' Add the input parameters.
objInParam.Properties_.Item("ContainerName") =  "teplo.local"
objInParam.Properties_.Item("DnsServerName") =  "BTE-DC-01.teplo.local"
objInParam.Properties_.Item("TextRepresentation") =  "1046.ats.teplo.local IN A 10.32.99.81"


' Execute the method and obtain the return status.
' The OutParameters object in objOutParams
' is created by the provider.
Set objOutParams = objWMIService.ExecMethod("MicrosoftDNS_AType.ContainerName='teplo.local',DnsServerName='BTE-DC-01.teplo.local',DomainName='ats.teplo.local',OwnerName='1046.ats.teplo.local',RecordClass='1',RecordData='10.32.99.81'", "CreateInstanceFromTextRepresentation", objInParam)

' List OutParams
'Wscript.Echo "Out Parameters: "
'Wscript.echo "RR: " & objOutParams.RR

То есть он работает, все хорошо. Но сам код!

Сначала мы делаем objWMIService.Get, где указываем все эти свойства записи, типа ContainerName, DnsServerName и всякое прочее. Хорошо. Захватили объект, теперь будем применять к нему методы. И что? Создаем еще один объект objInParam, который по сути является списком входных параметров, все тех же .Item("ContainerName") и прочее. Мы же это уже все указали, зачем снова все повторять?

Но и это еще не все. Теперь мы создаем выходной объект, который возвращается методом .ExecMethod и тут вообще феерично. Сначала мы опять как зайцы на барабане  вдалбливаем  уже два раза указанные  данные в виде строки, потом указываем собственно метод, который хотим Exec, и через запятую еще раз указываем все те же данные, уже в виде objInParam.

Что за логика? Кто писал этот фреймворк?
Нет, правда... Или это я дебил и ничего не понимаю в программировании? Ладно бы это был метод, который может изменять разные свойства объекта. Тогда мы в get указываем данные, которые сейчас, а в objOutParams - данные, которые должны примениться в результате действия метода. Но нет же. Единственное назначение этого метода - очищать поле TextRepresentation.


Description: 
This method parses the resource record in the TextRepresentation string, and along with the input DNS server 
and Container names, defines and instantiates a ResourceRecord object. The method returns a reference to 
the new object as an output parameter.

6 (изменено: inock, 2021-06-04 09:31:19)

Re: VBScript: DNS WMI Provider

Конечный вариант. Может кому пригодится, пусть интернет помнит.

+ открыть спойлер
' просматриваем записи в домене strDomain
' метод CreateInstanceFromTextRepresentation обнуляет поле Timestamp
' (переводит запись DNS в статус "статический")


strServer = "bte-dc-01"
strZoneDNS = "teplo.local"
strDomain = "ats." & strZoneDNS

Set objWMIService = GetObject("winmgmts:\\" & strServer & "\root\MicrosoftDNS")
'Set objDNS = objWMIService.Get("MicrosoftDNS_Server.name="".""")

'Запрос записей
Set objDNS = objWMIService.ExecQuery("Select * from MicrosoftDNS_ResourceRecord where DomainName=""" & strDomain & """",,48)
        For Each objInst in objDNS    
          
          If (objInst.Timestamp <> 0) Then
            strProperties = "MicrosoftDNS_AType.ContainerName='" & objInst.ContainerName & _ 
                "',DnsServerName='" & objInst.DnsServerName & _
                "',DomainName='" & objInst.DomainName & _
                "',OwnerName='" & objInst.OwnerName & _
                "',RecordClass='1',RecordData='" & objInst.RecordData & "'"
                

            ' Obtain an instance of the the class 
            ' using a key property value.
            Set objShare = objWMIService.Get(strProperties)

            ' Obtain an InParameters object specific
            ' to the method.
            Set objInParam = objShare.Methods_("CreateInstanceFromTextRepresentation"). _
                inParameters.SpawnInstance_()

            ' Add the input parameters.
            objInParam.Properties_.Item("ContainerName") =  objShare.ContainerName
            objInParam.Properties_.Item("DnsServerName") =  objShare.DnsServerName
            objInParam.Properties_.Item("TextRepresentation") =  objShare.TextRepresentation


            ' Execute the method and obtain the return status.
            ' The OutParameters object in objOutParams
            ' is created by the provider.
            Set objOutParams = objWMIService.ExecMethod(strProperties, "CreateInstanceFromTextRepresentation", objInParam)

            ' List OutParams
            'Wscript.Echo "Out Parameters: "
            'Wscript.echo "RR: " & objOutParams.RR
          
          End If
        Next

7

Re: VBScript: DNS WMI Provider

Cytrus, inock, пробуйте: WMI CIM Studio. Плюс, не забудьте про:

Since it took me a bit to learn these nuances of getting WMI CIM Studio to run under Windows 7 or Windows 8 and IE11 (IE9 or later), I thought I'd share it here...

    1. Install CIM Studio (WMI Administrative Tools, as indicated in @knb's answer)
    2. Add <meta http-equiv="X-UA-Compatible" content="IE=8" /> into the <HEAD> section ahead of SCRIPT LANGUAGE="VBS" in the C:\Program Files (x86)\WMI Tools\studio.htm file. This override is necessary because CIM Studio uses VBScript code and IE11+ has dropped support for that.
    3. Create a shortcut to "C:\Program Files (x86)\Internet Explorer\iexplore.exe" "C:\Program Files (x86)\WMI Tools\studio.htm"
    4. Configure the shortcut to run as Admin (Properties -> Advanced...)

8

Re: VBScript: DNS WMI Provider

Ага. А я вот хочу оставить ссылку на WMI Code Creator.

Небольшое описание этой утилиты на одном из сайтов:

+ открыть спойлер

WMI Code Creator — волшебная палочка для системного администратора


Такой заголовок придумал, аж самому понравилось. Но что интересно, заголовок справедлив на все 100%. И еще справедливо то, что половина системных администраторов не слышала об этом дивном инструменте, а половина тех, что слышали — его не используют

Итак, где может быть полезен это чудо-продукт? В первую очередь для всех скриптописателей под Windows.  И еще — для  фильтрации по каким-либо признакам из недр WMI в сторонних продуктах (SCCM, например, или еще какой монстр)

9

Re: VBScript: DNS WMI Provider

Не… WMI Code Creator — такое себе.