среда, 17 декабря 2008 г.

СИМУЛЯТОР CISCO: GNS3 > DYNAGEN > DYNAMIPS.

Не так давно начал испытывать нехватку в знаниях первых трех уровней модели OSI и вот решил пополнить знания. Лидер в данной области, безусловно, корпорация Cisco. Решил сдавать экзамен CCNA 640-802.. и знания пополню, и бумажка будет на стене красоваться :)

Первым делом нашел литературу, после этого начал искать симуляторы/эмуляторы оборудования cisco (реальное оборудование стоит достаточно дорого). В поле зрение попали следующие программные продукты: Packet Tracer, Boson Netsim, Dynamips.

Больше всего заинтересовал последний продукт – Dynamips, потому как другие названные продукты поддерживают ограниченное количество команд.

Dynamips позволяет эмулировать Cisco IOS на компьютере под управление Windows или Linux, нечто похожее на VMWare или Virtual PC.

Чистый Dynamips не очень удобен в плане конфигурирования. Если необходимо создать тестовую среду, состоящую из трех и более маршрутизаторов, то это может оказаться проблемой и отнимет много времени. Для упрощения настройки тестовой среды используется Dynagen. Dynagen – это некая надстройка над Dynamips, с ее помощью создается ini-файлы с описанием запускаемой среды. Достаточно хороший инструмент, но было бы хорошо использовать графическую оболочку для конфигурирования. Для это как раз есть GNS3 (Graphical Network Simulator) – это графическая надстройка над Dynagen. О ней и пойдет речь в этом посте. :)

Для начала необходимо загрузить необходимые инструменты.

Нам понадобится:

После того как все перечисленное загружено, можно приступать к установке.

Для начала устанавливаем GNS3. Тут проблем не должно возникнут. В ходе установки будет установлен WinPCAP – некий драйвер(ы)/библиотека(и) для доступа к нижним сетевым уровням.

Далее необходимо распаковать образы Cisco IOS. Я проделывал это с помощью Winrar.

После этого запускаем GNS3.

При первом запуске появляется окно, в котором предлагается указать первоначальные настройки – расположение образов Cisco IOS [2], расположение Dynamips [1].

Для начала нажимаем на [1] (тоже самое можно сделать позже, используя главное меню Edit > Preference), появляется диалоговое окно Preference. На вкладке Dynamips, в Executable path указываем путь к Dynamips. Если при установке использовался полный пакет (GNS3-x.x-win32-all-in-one), то ничего менять не надо, просто нажимаем кнопку Test. Должна появиться зеленая надпись: Dynamips successfully started. Нажимаем кнопку Apply, затем ОК.

Далее необходимо указать путь к образам Cisco IOS. Для этого жмем на кнопку [2] или, если вы закрыли это диалоговое окно, выбираем пункт меню Edit > IOS images and hypervisors. Появится диалоговое окно, в котором необходимо указать образы Cisco IOS, которые будут использоваться для запуска. Для этого нажимаем кнопку […] рядом с Image File и выбираем образ Cisco IOS. В поле Platform и Model указываем платформу и модель. IDLE PC оставляем пустым. Нажимаем Save.

Необходимо продолжить эти действия для других образов, которые вы будете запускать.

Нажимаем кнопку Close для закрытия диалогового окна.

На данный момент поддерживаются следующие платформы:

1710, 1720, 1721, 1750, 1751, 1760, 2610, 2610XM, 2611, 2611XM, 2620, 2620XM, 2621, 2621XM, 2650XM, 2651XM, 2691, 3620, 3640, 3660, 3725, 3745, 7200

Теперь можно приступать к созданию тестовой среды.

Попробуем создать простенькую тестовую среду, состоящую из одного маршрутизатора, Ethernet-коммутатора и компьютера.

Для этого в главном окне программы из левой панели Nodes Types перетаскиваем необходимые нам устройства в рабочую панель, она расположена по центру главного окна.

Сначала перетаскиваем маршрутизатор. Я настроил Cisco IOS для маршрутизатора 2691, поэтому помещаю в рабочую область маршрутизатор 2691 (Router 2691).


Нажимаем правой кнопкой на добавленном маршрутизаторе и выбираем меню Configure. Появляется диалоговое окно Node configuration. В данном окне можно задать различные параметры маршрутизатора (память, диски, слоты, конфигурационные регистры). В данный момент нас ничего не интересует в этом окне, поэтому закрываем его.

Стартуем маршрутизатор. Нажимаем правой кнопкой на маршрутизаторе и выбираем в контекстном меню Start. Заметно как комп начал немного подтормаживать. Открыв диспетчер задач можно увидеть, что загрузка процессора 100%.


Для того чтобы уменьшить загрузку цп, необходимо сконфигурировать параметр idlepc. Для этого нажимаем правой кнопкой на пиктограмме маршрутизатора и выбираем пункт меню Idle pc. После этого начинается подсчет значений idlepc. После этого появится диалоговое окно IDLE PC в котором предлагается выбрать одно из подсчитанных значений. Наиболее лучшее значение помечается звездочкой (“*”). Если не появились записи помеченные звездочкой или загрузка ЦП не уменьшилась, следует выбрать другие значения, для этого повторите описанную выше процедуру. Загрузка процессора происходит по причине того что Dynamips не знает когда Cisco IOS находится в режиме бездействия, или когда производит какие-то операции.

После этого подсоединяемся к консоли маршрутизатора. Для этого нажимаем правой кнопкой на пиктограмме маршрутизатора и выбираем пункт меню Console. Попадаем в консоль маршрутизатора.


Далее добавим в нашу сеть Ethernet-коммутатор. (Node Types – Ethernet switch).

Соединим Ethernet-интерфейс маршрутизатора с интерфейсом коммутатора.

Для этого на панели инструментов нажимаем на кнопку Add a link и соединяем маршрутизатор с коммутатором. На панели Topology Summary можно увидеть задействованные интерфейсы.


Теперь добавим в нашу сеть рабочую станцию.

В качестве рабочей станции я буду использовать Virtual PC Simulator. Простенький инструмент, не требует много памяти, для Ping’ов и tracert’ов сойдет. Также можно использовать в качестве рабочей станции другой маршрутизатор или реальную/виртуальную машину.

Для начала распаковываем скачанный архив. Запускаем vpcs.exe.

Если появляется сообщение

*** fatal error - system shared memory version mismatch detected - 0x8A88009C/0x2D1E009C. This problem is probably due to using incompatible versions of the cygwin DLL. Search for cygwin1.dll using the Windows Start->Find/Search facility and delete all but the most recent version. The most recent version *should* reside in x:\cygwin\bin, where 'x' is the drive on which you have installed the cygwin distribution. Rebooting is also suggested if you are unable to find another cygwin DLL.,

то находим более новую версию библиотеки cygwin1.dll (версию можно посмотреть в свойствах файла) и копируем ее в папку с vpcs.exe.

vpcs.exe – консольное приложение. Для того чтобы просмотреть информацию о прослушиваемых портах, назначенных ip адресах, вводим команду show.

Для переключения между виртуальными рабочими станциями вводим ее номер.

После этого необходимо сконфигурировать в GNS3 объект-компьютер.

Для этого в главном меню выбираем пункт Edit > Symbol Manager.

Появляется одноименное диалоговое окно, в котором в левой панели (Available symbols) выбираем Computer и нажимаем на кнопку [ > ]. В правой панели в Name указываем Computer, TypeCloud и нажимаем кнопку Apply. После этого нажимаем кнопку ОК для закрытия диалогового окна.


В панели Node Types должен появиться объект-компьютер Computer.

Перетаскиваем его в рабочую область.

Нажимаем на пиктограмме компьютера правой кнопкой и выбираем Configure.


Переходим на вкладку NIO UDP и вбиваем следующие настройка для нашего первого виртуального компьютера:

Local port: 30000

Remote host: 127.0.0.1

Remote port: 20000

Соединяем с коммутатор с компьютером.

В данном случае используется следующая схема:


То есть получается Virtual PC Simulator, 1 компьютер слушает на порту UDP:20000, а передает на порт UDP:30000, в свою очередь Dynamips слушает на порту UDP:30000, а передает на порт UDP:20000.

Затем конфигурируем ip адрес для компьютера №1. Для этого в консоли vpcs вводим следующее:

VPCS 1 >1

VPCS 1 >ip 192.168.1.50 192.168.1.1 24

PC1 : 192.168.1.50 255.255.255.0 gateway 192.168.1.1

VPCS 1 >

Далее консолью подсоединяемся к маршрутизатору и вводим следующее:

Router>ena

Router#conf term

Enter configuration commands, one per line. End with CNTL/Z.

Router(config)#int fa0/0

Router(config-if)#ip addr 192.168.1.1 255.255.255.0

Router(config-if)#no shut

Router(config-if)#

Router(config-if)#^Z

Router#

Командой ping посылаем эхо-запрос ICMP.

Router#ping 192.168.1.50

Type escape sequence to abort.

Sending 5, 100-byte ICMP Echos to 192.168.1.50, timeout is 2 seconds:

.!!!!

Success rate is 80 percent (4/5), round-trip min/avg/max = 20/36/48 ms

Router#

Получаем в ответ 4 удачных ICMP это-ответа.

Все работает.

Думаю не составит труда сконфигурировать более сложную сеть.

Ну и на последок ссылки на сайты с более подробной информацией:




пятница, 12 декабря 2008 г.

Просмотр пароля анонимной записи в IIS6

Недавно настраивал IIS сервер версии 6.0, с помощью скриптов WMI, и заметил интересную вещь. Пароль от анонимной учетной записи можно получить в чистом виде.

В метабазе IIS он выглядит следующим образом:

AnonymousUserName="IUSR_XXXXXXXTMP"
AnonymousUserPass="496344627000000022000000400000005eac410058b00d8bf180e269365a59983a633e1ba3deb55ae1c27172669d1d9c6b7749004e004400c1332d1b1568f43ae380973a1b97dde8f70c1e3932b07ca0fb8bc54ccd49e44ddadc5be0d0705a66cec4f24d9e15f451898376a032facd9567c66910bb732cdf"

для получения его в открытом виде необходимо выполнить следующие команды:

1) для начала получить список виртуальных каталогов:

wmic.exe /namespace:\\root\MicrosoftIISv2 path IIsWebVirtualDir get Name /VALUE

--------------------------------------------------------------------------
Name=W3SVC/1/ROOT
Name=W3SVC/1/ROOT/sample
--------------------------------------------------------------------------

2) затем
wmic.exe /namespace:\\root\MicrosoftIISv2 path IIsWebVirtualDirSetting.Name="W3SVC/1/ROOT" get AnonymousUserName,AnonymousUserPass

--------------------------------------------------------------------------
AnonymousUserName AnonymousUserPass
IUSR_XXXXXXXTMP M*9~9*%xpRvI?{
--------------------------------------------------------------------------

конечно не все так просто, данные команды могут выполнять только привилегированные пользователи, но факт остается фактом, что можно прочитать чужой пароль неприбегая к сбросу. А ведь может быть использована более привилегированная учетная запись в качестве анонимной. :)


понедельник, 8 декабря 2008 г.

изменение серийного номера windows xp/2k3

запускаем wmic с параметрами:

wmic.exe path Win32_WindowsProductActivation.ServerName="dns.name" call SetProductKey "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX"

dns.name - FQDN компьютера. (можно узнать >>> echo %userdnsdomain%)
"XXXXX-XXXXX-XXXXX-XXXXX-XXXXX" - серийный номер

можно переписать параметры для выполнения на локальном компьютере:
wmic.exe path Win32_WindowsProductActivation.ServerName="%computername%.%userdnsdomain%" call SetProductKey "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX"


серийный номер установленной копии windows xp

'---xp-viewkey.vbs---
' by PaulD
Set WshShell = WScript.CreateObject("WScript.Shell")
strDigitalProductId="HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId"

strXPKey=GetKey(WshShell.RegRead(strDigitalProductId))
'strOffXPRUKey=GetKey(WshShell.RegRead(strOffXPRU))

'CopytoClipboard
set ie=CreateObject("internetExplorer.application")
ie.navigate "about:blank"
do until ie.readystate=4: wscript.sleep 1: loop
ie.document.parentwindow.clipboardData.setData "Text", strXPKey


MsgBox "WinXP:"&strXPKey&chr(13)&_
"key in clipboard"
' "OffXP:"&strOffXPRUKey

Function GetKey(rpk)

Const rpkOffset=52:i=28
szPossibleChars="BCDFGHJKMPQRTVWXY2346789"

Do 'Rep1
dwAccumulator=0 : j=14
Do
dwAccumulator=dwAccumulator*256
dwAccumulator=rpk(j+rpkOffset)+dwAccumulator
rpk(j+rpkOffset)=(dwAccumulator\24) and 255
dwAccumulator=dwAccumulator Mod 24
j=j-1
Loop While j>=0
i=i-1 : szProductKey=mid(szPossibleChars,dwAccumulator+1,1)&szProductKey
if (((29-i) Mod 6)=0) and (i<>-1) then
i=i-1 : szProductKey="-"&szProductKey
End If
Loop While i>=0 'Goto Rep1

GetKey=szProductKey
End Function


сохраняем в vbs файл.. запускаем cscript.exe файл.vbs

отображается окно с серийником, а также он копируется в буфер обмена


DNSChanger - троян подменяющий адреса dns серверов

Недавно столкнулся на одном из компьютер нестабильно работал интернет.. долго открывались страницы и т.д.

посмотрев в конфигурацию tcp/ip интерфейсов, увидел прописанные dns сервера 85.255.112.115 и 85.255.112.118. попытки поменять их увенчалась неудачей.
Они автоматом прописывались обратно (пытался поменять различными способами, реестр, netsh, в диалоговом окне, все бес толку).

Тут сразу стало понятно что в системе сидит какой то руткит, либо ядра, либо пользовательского уровня.

Характерная особенность данного трояна: наличие параметра System=kdbda.exe (или kbdda.exe) в разделе реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon.
При удалении данного параметра, он пересоздается вновь.. (как и было сказано выше из-за руткита).

Начал копать в интернете.. нашел следующее решение: Необходимо с помощью avz 4.30 выполнить следующий скрипт:

begin
SearchRootkit(true, true);
SetAVZGuardStatus(true);
// Удаление файла
DeleteFile('%system32%\kdbda.exe');
// Импорт списка удаленных файлов в настройки Boot Cleaner
BC_ImportDeletedList;
// Чистка ссылок на удаленные файлы
ExecuteSysClean;
// Активация драйвера Boot Cleaner
BC_LogFile(GetAVZDirectory + 'boot_clr.log');
BC_Activate;
// Перезагрузка

RebootWindows(true);
end.

avz можно скачать отсюда:
http://www.z-oleg.com/secur/avz/download.php
Аналогичная статья: http://www.z-oleg.com/secur/virlist/vir1278.php


четверг, 7 августа 2008 г.

Добавление объекта(ов) AD в группу(ы)

есть такая необходимость добавлять объекты определенного назначения или типа.. в группы...
например добавить все компьютеры начинающиеся на 22IVC в группы начинающиеся или содержащие IVC:

ну вот по такому случаю накидал небольшой скрипт :)

1) это для добавления объектов "Компьютеры" в группы

'-===================================================
const kErrorSuccess = 0
const KErrorFailure = 1
const ActionListObject = 1
const ActionAddObject = 2

main

sub main

dim strBaseDNObj
dim iScopeObj
dim strBaseDNGroup
dim iScopeGroup
dim strGroupMask
dim strObjMask
dim iRetval
dim iAction

strObjMask=""
StrGroupMask=""

iRetval = ParseCommandLine(iAction, strBaseDNObj, iScopeObj, strBaseDNGroup, iScopeGroup, strGroupmask, strObjMask)

if iRetval = kErrorSuccess then

if strBaseDNObj="" then
set rootDSE = GetObject("LDAP://RootDSE")
strBaseDNObj = rootDSE.get("DefaultNamingContext")
end if

if strBaseDNGroup="" then
set rootDSE = GetObject("LDAP://RootDSE")
strBaseDNGroup = rootDSE.get("DefaultNamingContext")
end if


if iScopeObj = "" then
iScopeObj = 2
end if

if iScopeGroup = "" then
iScopeGroup = 2
end if

AddObjectToGroup iAction, strBaseDNObj, iScopeObj, strBaseDNGroup, iScopeGroup, strGroupmask, strObjMask

end if

end sub


' Get Object List by Mask
sub AddObjectToGroup(iAction, strBaseDNObj, iScopeObj, strBaseDNGroup, iScopeGroup, strGroupmask, strObjMask)

set con = CreateObject("ADODB.Connection")
con.Provider = "ADSDsoObject"
con.open("Active Directory Provider")
'Find Objects
set command_ = CreateObject("ADODB.Command")
command_.ActiveConnection = con
command_.CommandText = "select name, distinguishedName from 'LDAP://" & StrBaseDNObj & _
"' where ObjectCategory='computer' and name='"&strObjMask&"'"

command_.Properties("searchscope") = IScopeObj

set rc = CreateObject("ADODB.Recordset")
set rc = command_.execute

'Find Group
set command02 = CreateObject("ADODB.Command")
command02.ActiveConnection = con
command02.Commandtext = "select name, distinguishedName from 'LDAP://" & StrBaseDNGroup & _
"' where ObjectCategory='Group' and name='"&strGroupMask&"'"

command02.Properties("searchscope") = IScopeGroup

set rc02 = CreateObject("ADODB.Recordset")
set rc02 = command02.execute

while not (rc02.EOF)
set Group_ = GetObject("LDAP://" & rc02.Fields("distinguishedName").Value)
WScript.Echo "Group "& group_.name
WScript.Echo "-----------------------------------------------"
while not (rc.EOF)
set User_ = GetObject("LDAP://" & rc.Fields("distinguishedName").Value)
if Group_.ismember(User_.AdsPath)=false then
WScript.Echo user_.name & " isn't member of " & Group_.name
if iAction=ActionAddObject then
Group_.add(User_.AdsPath)
group_.SetInfo
end if
else WScript.Echo user_.name & " member of " & Group_.name
end if
rc.movenext()
wEnd
rc.MoveFirst()
rc02.movenext()
WScript.Echo ""
wEnd
end sub


'
' Parse the command line into it's components
'
function ParseCommandLine(iAction, strBaseDNObj, iScopeObj, strBaseDNGroup, iScopeGroup, strGroupmask, strObjMask)

on error resume next

dim iIndex
iAction = ActionListObject
iIndex = 0

set oArgs = wscript.Arguments

while iIndex <> oArgs.Count
select case oArgs(iIndex)
case "-b1"
iIndex = iIndex + 1
strBaseDNObj = oArgs(iIndex)
case "-t1"
iIndex = iIndex + 1
iScopeObj = oArgs(iIndex)
case "-b2"
iIndex = iIndex + 1
strBaseDNGroup = oArgs(iIndex)
case "-t2"
iIndex = iIndex + 1
iScopeGroup = oArgs(iIndex)
case "-g"
iIndex = iIndex + 1
strGroupmask = oArgs(iIndex)
case "-m"
iIndex = iIndex + 1
strObjMask = oArgs(iIndex)
case "-a"
iAction = ActionAddObject
case "-?"
Usage(true)
exit function

case else
Usage(true)
exit function

end select

iIndex = iIndex + 1

wend

if Err = kErrorSuccess then

ParseCommandLine = kErrorSuccess

else

wscript.echo "Unable to parse command line, error 0x" & _
Hex(Err.Number) & ". " & Err.Description

ParseCommandLine = kErrorFailure

end if

end function



sub Usage(bExit)

wscript.echo "Usage: CompMaskAdd.vbs [-b1 base search dn] [-t1 search scope]"
wscript.echo " [-b2 base search dn] [-t2 search scope]"
wscript.echo " [-g group mask] [-m computer object mask]"
wscript.echo " [-a]"
wscript.echo ""
wscript.echo "Arguments:"
wscript.echo " -b1 - DN of base search for object. Default - default naming context"
wscript.echo " -t1 - search scope for object. 0 - base, 1 - one level, 2 - subtree. default - 2"
wscript.echo " -b2 - DN of base search for group. Default - default naming context"
wscript.echo " -t2 - search scope for group. 0 - base, 1 - one level, 2 - subtree. default - 2"
wscript.echo " -g - Mask of group. default - """
wscript.echo " -m - mask of computer. default - """
wscript.echo " -a - make change to group. if not specified list group and members"
wscript.echo " -? - display command usage"
wscript.echo ""

if bExit then
wscript.quit(1)
end if

end sub

'-==============================================

2) этот для добавления пользователей в группы

'-==============================================
const kErrorSuccess = 0
const KErrorFailure = 1
const ActionListObject = 1
const ActionAddObject = 2

main

sub main

dim strBaseDNObj
dim iScopeObj
dim strBaseDNGroup
dim iScopeGroup
dim strGroupMask
dim strObjMask
dim iRetval
dim iAction

strObjMask=""
StrGroupMask=""

iRetval = ParseCommandLine(iAction, strBaseDNObj, iScopeObj, strBaseDNGroup, iScopeGroup, strGroupmask, strObjMask)

if iRetval = kErrorSuccess then

if strBaseDNObj="" then
set rootDSE = GetObject("LDAP://RootDSE")
strBaseDNObj = rootDSE.get("DefaultNamingContext")
end if

if strBaseDNGroup="" then
set rootDSE = GetObject("LDAP://RootDSE")
strBaseDNGroup = rootDSE.get("DefaultNamingContext")
end if


if iScopeObj = "" then
iScopeObj = 2
end if

if iScopeGroup = "" then
iScopeGroup = 2
end if

AddObjectToGroup iAction, strBaseDNObj, iScopeObj, strBaseDNGroup, iScopeGroup, strGroupmask, strObjMask

end if

end sub


' Get Object List by Mask
sub AddObjectToGroup(iAction, strBaseDNObj, iScopeObj, strBaseDNGroup, iScopeGroup, strGroupmask, strObjMask)

set con = CreateObject("ADODB.Connection")
con.Provider = "ADSDsoObject"
con.open("Active Directory Provider")
'Find Objects
set command_ = CreateObject("ADODB.Command")
command_.ActiveConnection = con
command_.CommandText = "select name, distinguishedName from 'LDAP://" & StrBaseDNObj & _
"' where ObjectCategory='User' and name='"&strObjMask&"'"

command_.Properties("searchscope") = IScopeObj

set rc = CreateObject("ADODB.Recordset")
set rc = command_.execute

'Find Group
set command02 = CreateObject("ADODB.Command")
command02.ActiveConnection = con
command02.Commandtext = "select name, distinguishedName from 'LDAP://" & StrBaseDNGroup & _
"' where ObjectCategory='Group' and name='"&strGroupMask&"'"

command02.Properties("searchscope") = IScopeGroup

set rc02 = CreateObject("ADODB.Recordset")
set rc02 = command02.execute

while not (rc02.EOF)
set Group_ = GetObject("LDAP://" & rc02.Fields("distinguishedName").Value)
WScript.Echo "Group "& group_.name
WScript.Echo "-----------------------------------------------"
while not (rc.EOF)
set User_ = GetObject("LDAP://" & rc.Fields("distinguishedName").Value)
if Group_.ismember(User_.AdsPath)=false then
WScript.Echo user_.name & " isn't member of " & Group_.name
if iAction=ActionAddObject then
Group_.add(User_.AdsPath)
group_.SetInfo
end if
else WScript.Echo user_.name & " member of " & Group_.name
end if
rc.movenext()
wEnd
rc.MoveFirst()
rc02.movenext()
WScript.Echo ""
wEnd
end sub


'
' Parse the command line into it's components
'
function ParseCommandLine(iAction, strBaseDNObj, iScopeObj, strBaseDNGroup, iScopeGroup, strGroupmask, strObjMask)

on error resume next

dim iIndex
iAction = ActionListObject
iIndex = 0

set oArgs = wscript.Arguments

while iIndex <> oArgs.Count
select case oArgs(iIndex)
case "-b1"
iIndex = iIndex + 1
strBaseDNObj = oArgs(iIndex)
case "-t1"
iIndex = iIndex + 1
iScopeObj = oArgs(iIndex)
case "-b2"
iIndex = iIndex + 1
strBaseDNGroup = oArgs(iIndex)
case "-t2"
iIndex = iIndex + 1
iScopeGroup = oArgs(iIndex)
case "-g"
iIndex = iIndex + 1
strGroupmask = oArgs(iIndex)
case "-m"
iIndex = iIndex + 1
strObjMask = oArgs(iIndex)
case "-a"
iAction = ActionAddObject
case "-?"
Usage(true)
exit function

case else
Usage(true)
exit function

end select

iIndex = iIndex + 1

wend

if Err = kErrorSuccess then

ParseCommandLine = kErrorSuccess

else

wscript.echo "Unable to parse command line, error 0x" & _
Hex(Err.Number) & ". " & Err.Description

ParseCommandLine = kErrorFailure

end if

end function



sub Usage(bExit)

wscript.echo "Usage: CompMaskAdd.vbs [-b1 base search dn] [-t1 search scope]"
wscript.echo " [-b2 base search dn] [-t2 search scope]"
wscript.echo " [-g group mask] [-m computer object mask]"
wscript.echo " [-a]"
wscript.echo ""
wscript.echo "Arguments:"
wscript.echo " -b1 - DN of base search for object. Default - default naming context"
wscript.echo " -t1 - search scope for object. 0 - base, 1 - one level, 2 - subtree. default - 2"
wscript.echo " -b2 - DN of base search for group. Default - default naming context"
wscript.echo " -t2 - search scope for group. 0 - base, 1 - one level, 2 - subtree. default - 2"
wscript.echo " -g - Mask of group. default - """
wscript.echo " -m - mask of computer. default - """
wscript.echo " -a - make change to group. if not specified list group and members"
wscript.echo " -? - display command usage"
wscript.echo ""

if bExit then
wscript.quit(1)
end if

end sub

'-==============================================

запускается все cscript'ом

-b1 - базовый DN с которого ищем компьютеры/пользователей
-b2 - базовый DN с которого ищем группы
-t1 и t2 - область поиска.. 0 - база (тоесть в этом контейнере).. 1- один уровень.. 2 - по дереву...
-g -маска группы
-m - маска компа/пользователя
-a - осуществить добавление пользователей/компов в группы , если не указан.. то просто вывести на экран найденных пользователей/компов и групп...

примеры использования..

возьмем пример с компами... сохраним первый скрипт в файл AddCompToGroupWithMask.vbs
запускаем : cscript AddCompToGroupWithMask.vbs -m "22IVC*" -g "*IVC*" -a
это добавление всех объектов компов начинающихся с 22IVC в группы содержащие в названии IVC.. по всему контексту именования по умолчанию (DefaulNamingContext.. можно узнать с помощью скрипта в предыдущем сообщении)...

можно например выполнить cscript AddCompToGroupWithMask.vbs -m "*" -g "*" -a (добавление всех компов.. во все группы... :))



основная информация о AD DS

Иногда бывает необходимо быстро просмотреть информацию о каталоге AD.. н-р.: версию схемы.. режим и т.д...

'--===============================================

'Author - efimov (ge][) gennady
'date last change: 2008-04-23

set rootDSE = GetObject("LDAP://RootDSE")
set schema_ = GetObject("LDAP://" + rootDSE.Get("dnsHostName") + "/" + rootDSE.Get("schemaNamingContext"))
WSCript.Echo ">>> currentTime: " + rootDSE.Get("currentTime")
WSCript.Echo ">>> subschemaSubentry: " + rootDSE.Get("subschemaSubentry")
WSCript.Echo ">>> dsServiceName: " + rootDSE.Get("dsServiceName")
WSCript.Echo ">>> namingContexts: "
Dim namingcontext
For Each Item In rootDSE.Get("namingContexts")
WSCript.Echo " " + Item
Next
WSCript.Echo ">>> defaultNamingContext: " + rootDSE.Get("defaultNamingContext")
WSCript.Echo ">>> schemaNamingContext: " + rootDSE.Get("schemaNamingContext")
WSCript.Echo ">>> rootDomainNamingContext: " + rootDSE.Get("rootDomainNamingContext")
WSCript.Echo ">>> supportedControl: "
For Each Item In rootDSE.Get("supportedControl")
WSCript.Echo " "+ Item
Next
WSCript.Echo ">>> supportedLDAPVersion: "
For Each Item In rootDSE.Get("supportedLDAPVersion")
WSCript.Echo " " + Item
Next
WSCript.Echo ">>> supportedLDAPPolicies: "
For Each Item In rootDSE.Get("supportedLDAPPolicies")
WSCript.Echo " "+Item
Next
WSCript.Echo ">>> highestCommittedUSN: " + rootDSE.Get("highestCommittedUSN")
WSCript.Echo ">>> supportedSASLMechanisms: "
For Each Item In rootDSE.Get("supportedSASLMechanisms")
WSCript.Echo " " + Item
Next
WSCript.Echo ">>> dnsHostName: " + rootDSE.Get("dnsHostName")
WSCript.Echo ">>> ldapServiceName: " + rootDSE.Get("ldapServiceName")
WSCript.Echo ">>> serverName: " + rootDSE.Get("serverName")
WSCript.Echo ">>> supportedCapabilities: "
For Each Item In rootDSE.Get("supportedCapabilities")
WSCript.Echo " " + Item
Next
WSCript.Echo ">>> isSynchronized: " + rootDSE.Get("isSynchronized")
WSCript.Echo ">>> isGlobalCatalogReady: " + rootDSE.Get("isGlobalCatalogReady")
WSCript.Echo ">>> domainFunctionality: "
Select Case rootDSE.Get("domainFunctionality")
Case 0
WSCript.Echo " "+rootDSE.Get("domainFunctionality") + " - (Windows 2000 Domain Mode)"
Case 1
WSCript.Echo " "+rootDSE.Get("domainFunctionality") +" - (Windows Server 2003 Interim Domain Mode)"
Case 2
WSCript.Echo " "+rootDSE.Get("domainFunctionality") +" - (Windows Server 2003 Domain Mode)"
Case 3
WSCript.Echo " "+rootDSE.Get("domainFunctionality") +" - (Windows Server 2008 Domain Mode)"
Case Else
WSCript.Echo " "+rootDSE.Get("domainFunctionality") +" - (Unknown Domain Mode)"
End Select
WSCript.Echo ">>> forestFunctionality: "
Select Case rootDSE.Get("forestFunctionality")
Case 0
WSCript.Echo " " + rootDSE.Get("forestFunctionality") + " - (Windows 2000 Forest Mode)"
Case 1
WSCript.Echo " " + rootDSE.Get("forestFunctionality") + " - (Windows Server 2003 Interim Forest Mode)"
Case 2
WSCript.Echo " " + rootDSE.Get("forestFunctionality") + " - (Windows Server 2003 Forest Mode)"
Case 3
WSCript.Echo " " + rootDSE.Get("forestFunctionality") + " - (Windows Server 2008 Forest Mode)"
Case Else
WSCript.Echo " " + rootDSE.Get("forestFunctionality") + " - (Unknown Forest Mode)"
End Select
WSCript.Echo ">>> domainControllerFunctionality: "
Select Case rootDSE.Get("domainControllerFunctionality")
Case 0
WSCript.Echo " " + rootDSE.Get("domainControllerFunctionality") + " - (Windows 2000 Mode)"
Case 2
WSCript.Echo " " + rootDSE.Get("domainControllerFunctionality") + " - (Windows Server 2003 Mode)"
Case 3
WSCript.Echo " " + rootDSE.Get("domainControllerFunctionality") + " - (Windows Server 2008 Mode)"
Case Else
WSCript.Echo " " + rootDSE.Get("domainControllerFunctionality") + " - (Unknown DC Mode)"
End Select
WSCript.Echo ">>> schemaVersion: "
Select Case schema_.Get("ObjectVersion")
Case 13
WSCript.Echo " " + CStr(schema_.Get("ObjectVersion")) + " - (Windows 2000 Server)"
Case 30
WSCript.Echo " " + CStr(schema_.Get("ObjectVersion")) + " - (Windows Server 2003)"
Case 31
WSCript.Echo " " + CStr(schema_.Get("ObjectVersion")) + " - (Windows Server 2003 R2)"
Case 44
WSCript.Echo " " + CStr(schema_.Get("ObjectVersion")) + " - (Windows Server 2008 (AD/DS))"
End Select
'--===============================================


Пример запуска:
файл ADMainInfo.vbs
команда: cscript.exe ADMainInfo.vbs