Использование VBScript для управления объектом MMC

Итак, я работаю над сценарием для выполнения некоторых команд в MMC Snapin, и у меня нет большого опыта в выполнении такого рода сценариев, но я добился большого прогресса... проблема, с которой я столкнулась. Имея, если я создаю новый объект каждый раз, когда запускается скрипт, это сильно задерживает мой общий скрипт, пока загружается оснастка и все в ней (что может занять до пяти минут). Если бы он мог загрузить содержимое оснастки один раз, а затем просто управлять им по мере необходимости и создавать новый объект только в том случае, если он еще не открыт, я сэкономлю огромное количество времени, когда запускаю скрипт иногда 100 раз в день.

Проблема в том, что я не совсем уверен, как этого добиться. После некоторых исследований я подумал, что это будет GetObject, но когда я

Dim objMMC
Set objMMC = GetObject("", "MMC20.Application")

Кажется, создается новое окно mmc без загруженных оснасток, а не загружается существующее окно с загруженными оснастками, которые я хочу.

Любой совет? Я просто полностью ошибся здесь, используя совершенно неправильную команду, или есть какое-то простое изменение, которое я могу внести, чтобы исправить это?

Редактировать: есть ли какой-то странный обходной путь, которым я мог бы добиться этого, например, сохранить объект во временный файл, чтобы я мог, по крайней мере, повторно использовать его в течение одного сеанса.

Я нахожусь в странной ситуации, когда я пытаюсь добавить функциональность в скрипт powershell и не могу найти способ сделать это непосредственно в powershell, поэтому я настраиваю vbscript для выполнения одной его части и вызываю vbscript из пауэршелла. Мне уже пришлось провести много исследований, чтобы выяснить, как это сделать в vbscript (и я до сих пор не уверен во всем этом), поэтому я думаю, прежде чем идти дальше, я попытаюсь выяснить, так ли это. даже жизнеспособным (в vbscript или С# или С++ или на любом другом языке, который кто-то может предложить)...

В целом, я хочу проверить, открыто ли окно MMC, содержащее оснастку DHCP. Если это так, назначьте его переменной. Если нет, создайте его. Затем он будет читать из файла csv или txt и использовать значения, чтобы определить, к какому узлу перейти в оснастке (DHCP> ServerName> IPv4> ScopeName> Scope Options). (Я в основном решил эту часть в vbscript, но не знаю, как это сделать на С++ или С#) Наконец, мне нужно иметь возможность выполнить пункт меню, вызываемый правой кнопкой мыши, чтобы «настроить параметры», перемещаться по вкладкам всплывающего окна, вводить значение и применять изменения / нажмите «ОК», чтобы закрыть всплывающее окно. В худшем случае, если я не могу сделать это «нормально», фактически отправляя команды самим объектам, эту часть я могу сделать, имитируя нажатия клавиш, но я не хочу этого делать, если этого можно избежать, потому что это неаккуратно. Затем мне в основном просто нужно как-то предупредить сценарий powershell о том, что я «завершил», чтобы он мог продолжить, или дать предупреждение, если есть ошибка.

Я не прошу никого проводить меня через все это, я просто хочу знать, являются ли какие-либо из этих шагов нежизнеспособными, как я их описал, особенно если мне придется переключиться на С++ или С# для достижения первую часть и, следовательно, заново выучить необходимые команды.


person Joshua May    schedule 07.01.2016    source источник


Ответы (1)


... и создавать новый объект только в том случае, если он еще не открыт...

Нет, в VBS это невозможно, нужно сделать

Dim objMMC
Set objMMC = WScript.CreateObject("MMC20.Application")

если я создаю новый объект каждый раз, когда запускается скрипт, это сильно задержит мой общий скрипт

В этом случае VBS неправильный язык, вам нужно использовать исполняемый файл C# или C++.

person Leo Chapiro    schedule 07.01.2016
comment
Если это действительно так, то для чего изначально нужен GetObject? Все, что я видел, казалось, предполагало, что это для получения существующего объекта вместо создания нового. Я уже знаю, как создать объект с помощью createobject. Но неужели нельзя получить контроль над ранее созданным объектом с помощью vbscript? Я не ожидаю, что одноэтапная команда автоматически определит, открыта ли она, и откроет ли ее, если нет, я просто хочу иметь возможность попытаться получить существующую, а затем написать оператор if, чтобы, если она не была найдена, он открывает новый. - person Joshua May; 07.01.2016
comment
Цель GetObject — вернуть ссылку на объект автоматизации из файла. : msdn.microsoft. com/ru-ru/library/ - person Leo Chapiro; 07.01.2016
comment
GetObject(, "foo.application") работает для некоторых объектов (например, приложений MS Office), но не для всех. - person Ansgar Wiechers; 07.01.2016