Считаем DNS зоны в Windows Server 2008/2012 с помощью Microsoft Jscript

1 minute read

Пришлось мне как-то раз автоматизировать процесс получения информации и DNS зонах, которые находятся на абстрактном сервере под управлением Windows. Опять мой мозг режет мысль о том, что пишу заметку про окна, когда изначально блог задумывался о задачах, связанных с Linux.

Итак задача ясна. Выбор инструмента пал на Jscript, поскольку тело основного модуля написано на нем, писать вторую часть на PowerShell - не комильфо. Решил: Буду считать файлы с расширением *.dns в папке C:\Windows\System32\dns, убирать у них расширение, считать их количество

Объявляем изначальные переменные, инициализируем работу с shell:

var env = new ActiveXObject("WScript.Shell").Environment("Process");
var fso = new ActiveXObject("Scripting.FileSystemObject");
var path = env("WINDIR") + '\\System32\\dns';

В обязательном порядке нужно удостовериться, что папка существует и зоны в ней тоже есть, иначе скрипт будет выпадать с ошибкой. Добавляем условие существования объекта fso (file system object):
if (fso.FolderExists(path) == true){

Дальше читаем содержимое папки, убираем путь к ней, и записываем получение данные в массив dnsfiles

var folder = fso.GetFolder(path);
var myEnum = new Enumerator(myFolder.Files);

myEnum.moveFirst();
while(!myEnum.atEnd()){
	var re =new RegExp('[^\\\\]*dns$', "gi");
	var file = re.exec(myEnum.item());
	if ((file != null) && (file != "cache.dns") && (file != "CACHE.DNS")){
		var dnsrecord = new RegExp("\.dns", "i");
		dnsrecord.exec(file);
	}
	myEnum.moveNext();
}

Этот же принцип можно использовать для листинга содержимого других каталогов.

Полный скрипт:
var env = new ActiveXObject("WScript.Shell").Environment("Process");
	var fso = new ActiveXObject("Scripting.FileSystemObject");
	var path = env("WINDIR") + '\\System32\\dns';

	if (fso.FolderExists(path) == true){

  	var myFolder = fso.GetFolder(path);
  	var myEnum = new Enumerator(myFolder.Files);
  	var nn = 1;

  	WScript.Echo("");
  	WScript.Echo("System DNS zones: ");

  	myEnum.moveFirst();

  	while(!myEnum.atEnd()){
  		var re =new RegExp('[^\\\\]*dns$', "gi");
  		var file = re.exec(myEnum.item());
  		if ((file != null) && (file != "cache.dns") && (file != "CACHE.DNS")){
 				var dnsrecord = new RegExp("\.dns", "i");
 				dnsrecord.exec(file)
 				WScript.Echo(nn+': '+RegExp.leftContext);
 				num += nn;
  		}
  		myEnum.moveNext();
  	}
  }

Ссылки на MSDN: