Служба Active Directory (AD) привнесла абсолютно новый подход к написанию сценариев. В Windows NT 4.0 или NT 3.51 разработчики сценариев оперировали доменами. На уровне доменов придумывались способы запрашивать информацию о группах, членстве в группах, отдельных пользователях и компьютерах. С переходом на AD множество доменов организации преобразовалось в один или несколько доменов. Отделения или подразделения, которые были доменами, теперь стали организационными подразделениями (OU). Разработчики сценариев столкнулись с проблемой сбора информации на уровне домена, уровне OU и уровнях поддеревьев OU.

Некоторые инструменты, включая сценарий Search.vbs из Windows 2000 Support Tools, могут помочь разработчику сценариев взять под контроль информацию из OU. Я написал сценарий, OS-SP-Report.bat, который использует Search.vbs, чтобы взять из нескольких OU информацию об операционных системах и пакетах обновлений. OS-SP-Report.bat можно изменить так, чтобы собирать информацию о пользователях, компьютерах или других объектах AD. Описание других инструментов AD для командной строки можно найти во врезке «Инструменты AD для разработчика сценариев».

OS-SP-Report.bat был создан с целью дать полный отчет об операционных системах и состоянии пакетов обновлений на компьютерах в нескольких нужных OU. В некоторых OU оказались неизвестные OS, видимо, из-за того, что администраторы создали учетные записи для компьютеров, но не установили соответствующие серверы или компьютеры, либо не включили системы в домен. Некоторые серверы и системы оказались так глубоко в дереве OU, что состояние их пакетов обновлений просто затерялось. Требовался отчет, который давал бы некоторую информацию об OU, чтобы потом можно было связаться с владельцем OU и привести в порядок процесс установки пакетов обновлений.

OS-SP-Report.bat опрашивает несколько OU на предмет информации об OS и SP и создает отчет в формате HTML, который можно поместить на административном web-сайте. При каждом запуске сценарий переименовывает предыдущий отчет, так что можно получить доступ к 11 предыдущим отчетам. Еще сценарий ведет лог-файл, по которому можно отследить изменения в предыдущих версиях отчета.

Синтаксис Search.vbs

В Листинге 1 показан пример базового синтаксиса Search.vbs, который использовался для того, чтобы найти все компьютеры с Windows 2000 Professional в следующих OU: ou=sales, ou=computers, dc=seattle, dc=yourcompany, dc=com. Ключ /S:subtree позволяет искать в нужном OU и его ветвях. Можно, наоборот, искать объекты только в пределах указанного OU, игнорируя ветви (/S:onelevel).

Если нужны компьютеры Windows 2000 Pro с установленным SP1, можно задействовать критерии фильтра, как в Листинге 2. Я использую в основном тот же синтаксис в OS-SP-Report.bat, чтобы найти системы с Windows Server 2003, Windows XP и Windows 2000 Server и соответствующими пакетами обновлений.

«Джентльменский набор» инструментов для сценариев

Сценарий OS-SP-Report.bat использует несколько удобных инструментов и методов. Команда Set /a позволяет производить в сценариях элементарные математические операции.

Часто в сценарии требуется «перепрыгнуть» через кусок кода. Это можно сделать с помощью инструкции GOTO. OS-SP-Report.bat проверяет конкретную операционную систему, и, если система не соответствует проверяемой, пропускает все проверки на пакеты обновлений в этой OS, как показано в Листинге 3. Инструкция GOTO также использовалась для того, чтобы пропустить код, относящийся к будущим пакетам обновлений.

Создание отчета в формате HTML - простой способ придать результату работы сценария более профессиональный вид. Вместо того чтобы отправлять отчет в файл .tsv, .csv или .txt, можно использовать таблицы HTML и получить отчет, который будет выглядеть должным образом.

Запуск сценария

Чтобы запустить OS-SP-Report.bat, просмотрите код в конце статьи (Листинг 5). Также понадобится установить Windows 2000 Support Tools с диска Windows 2000.

Потом следует создать файл OUTargets.txt, в котором в каждой строке будет указан один путь к AD-объекту. После пути нужно вставить символ табуляции, чтобы отделить путь от области поиска. Задайте область поиска как subtree или onelevel. Полученный файл должен выглядеть как в Примере 1.

Также потребуется задать местоположение входного файла OUTargets.txt, местоположение выходного HTML отчета и файла журнала и положение утилиты Search.vbs, как в коде Листинга 4. Кроме того, вы, скорее всего, захотите, чтобы планировщик задач автоматически запускал ваш сценарий.

На момент написания этой статьи самыми последними были XP SP1 и Windows 2000 SP3. По мере выпуска новых пакетов обновлений сценарию понадобятся дополнительный код и строки в отчете, чтобы отразить произошедшие изменения. Чтобы упростить этот процесс, я включил код, который ищет пакеты обновлений до шестого включительно. Сейчас сценарий просто пропускает этот код; чтобы его активировать, найдите комментарий во фрагменте B Листинга 3 и удалите или закомментируйте инструкцию GOTO после этой строки. В дальнейшем сценарий будет искать некоторые или все указанные пакеты обновлений.

OS-SP-Report.bat предоставляет хороший способ следить за операционными системами и их обновлениями в вашей организационной единице AD. Также в нем есть примеры, которые можно изменять по своему усмотрению и использовать в своих сценариях, чтобы запрашивать у AD ту информацию, которая будет нужна.


Инструменты AD для разработчика сценариев

Я стараюсь совершенствовать свои навыки написания сценариев на VBScript, но жизнь не стоит на месте, и мне регулярно приходится запрашивать у AD различную информацию. Microsoft предоставила несколько инструментов, которые существенно облегчают задачу разработчикам сценариев, и независимые разработчики тоже начинают обращаться к ним. С помощью этих инструментов можно сохранять данные AD и управлять ими, используя в сценариях те подходы, которым я вот уже четыре года обучаю читателей в своих статьях. В Таблице А представлены некоторые инструменты для командной строки, которые помогут сохранить или изменить информацию AD.


Пример 1

ou=sales,ou=computers,dc=seattle,dc=yourcompany,dc=com 	subtree
ou=acctg,ou=computers,dc=seattle,dc=yourcompany,dc=com 	subtree
ou=marketing,ou=computers,dc=seattle,dc=yourcompany,dc=com 	onelevel

Листинг 1: Синтаксис Search.vbs для поиска систем с Windows 2000 Pro
cscript C:SupportToolssearch.vbs
  "LDAP://ou=sales,ou=computers,dc=seattle,dc=yourcompany,dc=com"
  /S:subtree /Q /C:"&(ObjectCategory=computer)(operatingsystem=Windows
  2000 Professional)В?

Листинг 2: Синтаксис Search.vbs для поиска систем с Windows 2000 Pro SP1
cscript C:SupportToolssearch.vbs
  "LDAP ou=sales,ou=computers,dc=seattle,dc=yourcompany,dc=com"
  /S:subtree /Q /C:"&(ObjectCategory=computer)(operatingsystem=Windows
  2000 Professional)(operatingsystemservicepack=service pack 1)"

Листинг 3: Выдержка из OS-SP-Report.bat
SET Nosp=0
Начало фрагмента А
for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
  "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
  (operatingsystem=Windows 2000 Professional)"^| find " objects."')
  do Set totSPnum=%%j
If  '%totSPnum%'=='0' ECHO No W2K Pro nodes found
 >>"%PathToFiles%
unninglog.txt"&ECHO. 
>>"%PathToFiles%
unninglog.txt"&goto :XPpro
Конец фрагмента А
for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
  "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
  (operatingsystem=Windows 2000 Professional)
  (operatingsystemservicepack=service pack 1)"^| find " objects."')
  do Set SP1num=%%j
Set /A W2KRemainder=%W2KRemainder%+%SP1num%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
  "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
  (operatingsystem=Windows 2000 Professional)
  (operatingsystemservicepack=service pack 2)"^| find " objects."')
  do Set SP2num=%%j
Set /A W2KRemainder=%W2KRemainder%+%SP2num%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
  "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
  (operatingsystem=Windows 2000 Professional)
  (operatingsystemservicepack=service pack 3)"^| find " objects."')
  do Set SP3num=%%j
Set /A W2KRemainder=%W2KRemainder%+%SP3num%
Начало фрагмента В
Начало комментария
::Код для SP6, SP5, и SP4 на данный момент пропущен.
Конец комментария
GOTO :W2Kskip
Конец фрагмента B

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
  "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
  (operatingsystem=Windows 2000 Professional)
  (operatingsystemservicepack=service pack 4)"^| find " objects."')
  do Set SP4num=%%j
Set /A W2KRemainder=%W2KRemainder%+%SP4num%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
  "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
  (operatingsystem=Windows 2000 Professional)
  (operatingsystemservicepack=service pack 5)"^| find " objects."')
  do Set SP5num=%%j
Set /A W2KRemainder=%W2KRemainder%+%SP5num%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
  "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
  (operatingsystem=Windows 2000 Professional)
  (operatingsystemservicepack=service pack 6)"^| find " objects."')
  do Set SP6num=%%j
Set /A W2KRemainder=%W2KRemainder%+%SP6num%

:W2Kskip
Set /a Nosp=%totSPnum%-%W2KRemainder%

Листинг 4: Код, устанавливающий путь к файлам, которые использует сценарий
Начало фрагмента А
Начало комментария
:: Настройте путь к файлу, содержащему пути к AD-объектам
 и область поиска в них.
Конец комментария
SET OUTargets=D:htmlStatsOUTargets.txt
Начало комментария
:: Настройте путь к папке, в которой хотите хранить выходные файлы.
Конец комментария
SET PathToFiles=D:htmlStats
Начало комментария
:: Настройте путь к файлу Search.vbs.
Конец комментария
SET PathToSearchUtil=C:SupportToolssearch.vbs
Конец фрагмента А
ECHO.>>"%PathToFiles%
unninglog.txt"
ECHO ************** %DATE% %TIME% ************************
>>"%PathToFiles%
unninglog.txt"
ECHO.>>"%PathToFiles%
unninglog.txt"

if exist "%PathToFiles%ADoutputTemp.html" del
  "%PathToFiles%ADoutputTemp.html"

Листинг 5. OS-SP-Report.bat
@echo off
@TITLE OS-SP-Report.bat Script


:: Note: The code below is currently configured to support W2K Pro,
 XP Pro, W2K Server and 2003 Server with SP1, 2 or 3.
:: Code has been created for SP4, 5 and 6 but has been commented
 out by skipping over that code.
:: Just go into the script and move or remove the GOTO commands
 that move flow around these sections.
   

:: Configure the path to the file that contains the ADSpath targets and scope info.
SET OUTargets=D:htmlStatsOUTargets.txt

:: Configure the folder path where you want to store the output files.
SET PathToFiles=D:htmlStatsfinder2

:: Configure the path to the Search.vbs file
SET PathToSearchUtil=C:SupportToolssearch.vbs

ECHO.>>"%PathToFiles%
unninglog.txt"
ECHO ************** %DATE% %TIME% ************************>>"%PathToFiles%
unninglog.txt"
ECHO.>>"%PathToFiles%
unninglog.txt"

if exist "%PathToFiles%ADoutputTemp.html" del "%PathToFiles%ADoutputTemp.html"


:: ******************************************************

ECHO ^>>"%PathToFiles%ADoutputTemp.html"

ECHO ^>>"%PathToFiles%ADoutputTemp.html"
ECHO ^>>"%PathToFiles%ADoutputTemp.html"
ECHO ^O/S Service Pack Report^>>"%PathToFiles%ADoutputTemp.html"
ECHO ^>>"%PathToFiles%ADoutputTemp.html"
ECHO ^>>"%PathToFiles%ADoutputTemp.html"
ECHO ^^^O/S Service Pack
 Report^^^>>"%PathToFiles%ADoutputTemp.html"
ECHO ^^Last Updated: %DATE%
 %TIME%^>>"%PathToFiles%ADoutputTemp.html"
ECHO See Current Report ^ ^ ^ ^|
 ^Current^>>"%PathToFiles%ADoutputTemp.html"
ECHO ^|^>>"%PathToFiles%ADoutputTemp.html"
ECHO See Previous Reports ^| ^1^>>"%PathToFiles%ADoutputTemp.html"
ECHO ^| ^2^>>"%PathToFiles%ADoutputTemp.html"
ECHO ^| ^3^>>"%PathToFiles%ADoutputTemp.html"
ECHO ^| ^4^>>"%PathToFiles%ADoutputTemp.html"
ECHO ^| ^5^>>"%PathToFiles%ADoutputTemp.html"
ECHO ^| ^6^>>"%PathToFiles%ADoutputTemp.html"
ECHO ^| ^7^>>"%PathToFiles%ADoutputTemp.html"
ECHO ^| ^8^>>"%PathToFiles%ADoutputTemp.html"
ECHO ^| ^9^>>"%PathToFiles%ADoutputTemp.html"
ECHO ^| ^10^>>"%PathToFiles%ADoutputTemp.html"
ECHO ^|^>>"%PathToFiles%ADoutputTemp.html"


:: **************************************************************


For /F "tokens=1,2 delims=	" %%i in (%OUTargets%) do (set Target=%%i)
 & (set Scope=%%j) & (call :test)

ECHO ^>>"%PathToFiles%ADoutputTemp.html"

ECHO ^>>"%PathToFiles%ADoutputTemp.html"

If Exist "%PathToFiles%ADoutput9.html" Move /Y "%PathToFiles%ADoutput9.html"
 "%PathToFiles%ADoutput10.html"
If Exist "%PathToFiles%ADoutput8.html" Move /Y "%PathToFiles%ADoutput8.html"
 "%PathToFiles%ADoutput9.html"
If Exist "%PathToFiles%ADoutput7.html" Move /Y "%PathToFiles%ADoutput7.html"
 "%PathToFiles%ADoutput8.html"
If Exist "%PathToFiles%ADoutput6.html" Move /Y "%PathToFiles%ADoutput6.html"
 "%PathToFiles%ADoutput7.html"
If Exist "%PathToFiles%ADoutput5.html" Move /Y "%PathToFiles%ADoutput5.html"
 "%PathToFiles%ADoutput6.html"
If Exist "%PathToFiles%ADoutput4.html" Move /Y "%PathToFiles%ADoutput4.html"
 "%PathToFiles%ADoutput5.html"
If Exist "%PathToFiles%ADoutput3.html" Move /Y "%PathToFiles%ADoutput3.html"
 "%PathToFiles%ADoutput4.html"
If Exist "%PathToFiles%ADoutput2.html" Move /Y "%PathToFiles%ADoutput2.html"
 "%PathToFiles%ADoutput3.html"
If Exist "%PathToFiles%ADoutput1.html" Move /Y "%PathToFiles%ADoutput1.html"
 "%PathToFiles%ADoutput2.html"
If Exist "%PathToFiles%ADoutput.html" Move /Y "%PathToFiles%ADoutput.html"
 "%PathToFiles%ADoutput1.html"
Move /Y "%PathToFiles%ADoutputTemp.html" "%PathToFiles%ADoutput.html"


ECHO run complete
goto :EOF


:test

ECHO Search Target: %Target% >>"%PathToFiles%
unninglog.txt"
ECHO.>>"%PathToFiles%
unninglog.txt"
ECHO Search scope: %Scope:onelevel=One level%>>"%PathToFiles%
unninglog.txt"
ECHO.>>"%PathToFiles%
unninglog.txt"


SET Totalnum=0
for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)"^|
 find " objects."') do Set Totalnum=%%j
ECHO Total nodes in AD:	%Totalnum% >>"%PathToFiles%
unninglog.txt"
ECHO.>>"%PathToFiles%
unninglog.txt"



SET KnownOS=0
SET UnknownOS=0
Set W2KRemainder=0

SET totSPnum=0
SET SP1num=0
SET SP2num=0
SET SP3num=0
SET SP4num=0
SET SP5num=0
SET SP6num=0

SET Nosp=0

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows 2000 Professional)"^| find " objects."')
 do Set totSPnum=%%j
If  '%totSPnum%'=='0' ECHO No W2K Pro nodes found
 >>"%PathToFiles%
unninglog.txt"&ECHO.
 >>"%PathToFiles%
unninglog.txt"&goto :XPpro

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%" 
"LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows 2000 Professional)(operatingsystemservicepack=service pack 1)"^|
 find " objects."') do Set SP1num=%%j
Set /A W2KRemainder=%W2KRemainder%+%SP1num%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%" 
"LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows 2000 Professional)(operatingsystemservicepack=service pack 2)"^|
 find " objects."') do Set SP2num=%%j
Set /A W2KRemainder=%W2KRemainder%+%SP2num%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows 2000 Professional)(operatingsystemservicepack=service pack 3)"^|
 find " objects."') do Set SP3num=%%j
Set /A W2KRemainder=%W2KRemainder%+%SP3num%

:: ********* SP4-6 code currently skipped over *********
GOTO :W2Kskip

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows 2000 Professional)(operatingsystemservicepack=service pack 4)"^|
 find " objects."') do Set SP4num=%%j
Set /A W2KRemainder=%W2KRemainder%+%SP4num%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows 2000 Professional)(operatingsystemservicepack=service pack 5)"^|
 find " objects."') do Set SP5num=%%j
Set /A W2KRemainder=%W2KRemainder%+%SP5num%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows 2000 Professional)(operatingsystemservicepack=service pack 6)"^|
 find " objects."') do Set SP6num=%%j
Set /A W2KRemainder=%W2KRemainder%+%SP6num%

:W2Kskip
Set /a Nosp=%totSPnum%-%W2KRemainder%


ECHO W2K total nodes:	%totSPnum% >>"%PathToFiles%
unninglog.txt"
ECHO *************************** >>"%PathToFiles%
unninglog.txt"
ECHO W2K no SP:		%Nosp% >>"%PathToFiles%
unninglog.txt"
ECHO W2K SP1:		%SP1num% >>"%PathToFiles%
unninglog.txt"
ECHO W2K SP2:		%SP2num% >>"%PathToFiles%
unninglog.txt"
ECHO W2K SP3:		%SP3num% >>"%PathToFiles%
unninglog.txt"

:: ********* SP4-6 code currently skipped over *********
GOTO :XPpro

ECHO W2K SP4:		%SP4num% >>"%PathToFiles%
unninglog.txt"
ECHO W2K SP5:		%SP5num% >>"%PathToFiles%
unninglog.txt"
ECHO W2K SP6:		%SP6num% >>"%PathToFiles%
unninglog.txt"

:XPpro
ECHO.>>"%PathToFiles%
unninglog.txt"
SET XPRemainder=0

SET totSPXPnum=0
SET SP1XPnum=0
SET SP2XPnum=0
SET SP3XPnum=0
SET SP4XPnum=0
SET SP5XPnum=0
SET SP6XPnum=0
SET XPNosp=0

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows XP Professional)"^| find " objects."')
 do Set totSPXPnum=%%j
If  '%totSPXPnum%'=='0' ECHO No XP nodes found
 >>"%PathToFiles%
unninglog.txt"&ECHO.
 >>"%PathToFiles%
unninglog.txt"&goto :W2Ksrvr

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows XP Professional)(operatingsystemservicepack=service pack 1)"^|
 find " objects."') do Set SP1XPnum=%%j
Set /A XPRemainder=%XPRemainder%+%SP1XPnum%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows XP Professional)(operatingsystemservicepack=service pack 2)"^|
 find " objects."') do Set SP2XPnum=%%j
Set /A XPRemainder=%XPRemainder%+%SP2XPnum%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows XP Professional)(operatingsystemservicepack=service pack 3)"^|
 find " objects."') do Set SP3XPnum=%%j
Set /A XPRemainder=%XPRemainder%+%SP3XPnum%

:: ********* SP4-6 code currently skipped over *********
GOTO :XPskip

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows XP Professional)(operatingsystemservicepack=service pack 4)"^|
 find " objects."') do Set SP4XPnum=%%j
Set /A XPRemainder=%XPRemainder%+%SP4XPnum%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows XP Professional)(operatingsystemservicepack=service pack 5)"^|
 find " objects."') do Set SP5XPnum=%%j
Set /A XPRemainder=%XPRemainder%+%SP5XPnum%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows XP Professional)(operatingsystemservicepack=service pack 6)"^|
 find " objects."') do Set SP6XPnum=%%j
Set /A XPRemainder=%XPRemainder%+%SP6XPnum%

:XPskip
Set /a XPNosp=%totSPXPnum%-%XPRemainder%

ECHO.>>"%PathToFiles%
unninglog.txt"
ECHO.>>"%PathToFiles%
unninglog.txt"
ECHO XP total nodes:	 %totSPXPnum% >>"%PathToFiles%
unninglog.txt"
ECHO *************************** >>"%PathToFiles%
unninglog.txt"
ECHO XP no SP:		%XPNosp% >>"%PathToFiles%
unninglog.txt"
ECHO XP SP1:		%SP1XPnum% >>"%PathToFiles%
unninglog.txt"
ECHO XP SP2:		%SP2XPnum% >>"%PathToFiles%
unninglog.txt"
ECHO XP SP3:		%SP3XPnum% >>"%PathToFiles%
unninglog.txt"

:: ********* SP4-6 code currently skipped over *********
GOTO :W2Ksrvr

ECHO XP SP4:		%SP4XPnum% >>"%PathToFiles%
unninglog.txt"
ECHO XP SP5:		%SP5XPnum% >>"%PathToFiles%
unninglog.txt"
ECHO XP SP6:		%SP6XPnum% >>"%PathToFiles%
unninglog.txt"


:W2Ksrvr
ECHO.>>"%PathToFiles%
unninglog.txt"
SET W2KSrvrRemainder=0

SET totSPW2KSrvrnum=0
SET SP1W2KSrvrnum=0
SET SP2W2KSrvrnum=0
SET SP3W2KSrvrnum=0
SET SP4W2KSrvrnum=0
SET SP5W2KSrvrnum=0
SET SP6W2KSrvrnum=0
SET W2KSrvrNosp=0

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows 2000 Server)"^| find " objects."')
 do Set totSPW2KSrvrnum=%%j
If  '%totSPW2KSrvrnum%'=='0' ECHO No W2K srvr nodes found
 >>"%PathToFiles%
unninglog.txt"&ECHO.
 >>"%PathToFiles%
unninglog.txt"&goto :NETsrvr

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows 2000 Server)(operatingsystemservicepack=service pack 1)"^|
 find " objects."') do Set SP1W2KSrvrnum=%%j
Set /A W2KSrvrRemainder=%W2KSrvrRemainder%+%SP1W2KSrvrnum%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows 2000 Server)(operatingsystemservicepack=service pack 2)"^|
 find " objects."') do Set SP2W2KSrvrnum=%%j
Set /A W2KSrvrRemainder=%W2KSrvrRemainder%+%SP2W2KSrvrnum%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows 2000 Server)(operatingsystemservicepack=service pack 3)"^|
 find " objects."') do Set SP3W2KSrvrnum=%%j
Set /A W2KSrvrRemainder=%W2KSrvrRemainder%+%SP3W2KSrvrnum%

:: ********* SP4-6 code currently skipped over *********
GOTO :W2KSrvrskip

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows 2000 Server)(operatingsystemservicepack=service pack 4)"^|
 find " objects."') do Set SP4W2KSrvrnum=%%j
Set /A W2KSrvrRemainder=%W2KSrvrRemainder%+%SP4W2KSrvrnum%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows 2000 Server)(operatingsystemservicepack=service pack 5)"^|
 find " objects."') do Set SP5W2KSrvrnum=%%j
Set /A W2KSrvrRemainder=%W2KSrvrRemainder%+%SP5W2KSrvrnum%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows 2000 Server)(operatingsystemservicepack=service pack 6)"^|
 find " objects."') do Set SP6W2KSrvrnum=%%j
Set /A W2KSrvrRemainder=%W2KSrvrRemainder%+%SP6W2KSrvrnum%

:W2KSrvrskip
Set /A W2KSrvrNosp=%totSPW2KSrvrnum%-%W2KSrvrRemainder%

ECHO.>>"%PathToFiles%
unninglog.txt"
ECHO W2K Srvr total nodes:	%totSPW2KSrvrnum% >>"%PathToFiles%
unninglog.txt"
ECHO ***************************>>"%PathToFiles%
unninglog.txt"
ECHO W2K no SP:		%W2KSrvrNosp% >>"%PathToFiles%
unninglog.txt"
ECHO W2K SP1:		%SP1W2KSrvrnum% >>"%PathToFiles%
unninglog.txt"
ECHO W2K SP2:		%SP2W2KSrvrnum% >>"%PathToFiles%
unninglog.txt"
ECHO W2K SP3:		%SP3W2KSrvrnum% >>"%PathToFiles%
unninglog.txt"

:: ********* SP4-6 code currently skipped over *********
GOTO :NETsrvr

ECHO W2K SP4:		%SP4W2KSrvrnum% >>"%PathToFiles%
unninglog.txt"
ECHO W2K SP5:		%SP5W2KSrvrnum% >>"%PathToFiles%
unninglog.txt"
ECHO W2K SP6:		%SP6W2KSrvrnum% >>"%PathToFiles%
unninglog.txt"


:NETsrvr
ECHO.>>"%PathToFiles%
unninglog.txt"
SET NETSrvrRemainder=0

SET totSPNETSrvrnum=0
SET SP1NETSrvrnum=0
SET SP2NETSrvrnum=0
SET SP3NETSrvrnum=0
SET SP4NETSrvrnum=0
SET SP5NETSrvrnum=0
SET SP6NETSrvrnum=0
SET NETSrvrNosp=0

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows .NET Server)"^| find " objects."') do Set totSPNETSrvrnum=%%j
If  '%totSPNETSrvrnum%'=='0' ECHO No .NET srvr nodes found
 >>"%PathToFiles%
unninglog.txt"&ECHO.
 >>"%PathToFiles%
unninglog.txt"&goto :last

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows .NET Server)(operatingsystemservicepack=service pack 1)"^|
 find " objects."') do Set SP1NETSrvrnum=%%j
Set /A NETSrvrRemainder=%NETSrvrRemainder%+%SP1NETSrvrnum%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows .NET Server)(operatingsystemservicepack=service pack 2)"^|
 find " objects."') do Set SP2NETSrvrnum=%%j
Set /A NETSrvrRemainder=%NETSrvrRemainder%+%SP2NETSrvrnum%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows .NET Server)(operatingsystemservicepack=service pack 3)"^|
 find " objects."') do Set SP3NETSrvrnum=%%j
Set /A NETSrvrRemainder=%NETSrvrRemainder%+%SP3NETSrvrnum%

:: ********* SP4-6 code currently skipped over *********
GOTO :NETSrvrskip

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows .NET Server)(operatingsystemservicepack=service pack 4)
"^| find " objects."') do Set SP4NETSrvrnum=%%j
Set /A NETSrvrRemainder=%NETSrvrRemainder%+%SP4NETSrvrnum%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows .NET Server)(operatingsystemservicepack=service pack 5)"^|
 find " objects."') do Set SP5NETSrvrnum=%%j
Set /A NETSrvrRemainder=%NETSrvrRemainder%+%SP5NETSrvrnum%

for /f "tokens=1,2,3,4" %%i in ('cscript "%PathToSearchUtil%"
 "LDAP://%Target%" /S:%Scope% /Q /C:"&(ObjectCategory=computer)
(operatingsystem=Windows .NET Server)(operatingsystemservicepack=service pack 6)
"^| find " objects."') do Set SP6NETSrvrnum=%%j
Set /A NETSrvrRemainder=%NETSrvrRemainder%+%SP6NETSrvrnum%

:NETSrvrskip
Set /A NETSrvrNosp=%totSPNETSrvrnum%-%NETSrvrRemainder%

ECHO.>>"%PathToFiles%
unninglog.txt"
ECHO .NET Srvr total nodes:	%totSPNETSrvrnum% >>"%PathToFiles%
unninglog.txt"
ECHO *************************** >>"%PathToFiles%
unninglog.txt"
ECHO .NET no SP:		%NETSrvrNosp% >>"%PathToFiles%
unninglog.txt"
ECHO .NET SP1:		%SP1NETSrvrnum% >>"%PathToFiles%
unninglog.txt"
ECHO .NET SP2:		%SP2NETSrvrnum% >>"%PathToFiles%
unninglog.txt"
ECHO .NET SP3:		%SP3NETSrvrnum% >>"%PathToFiles%
unninglog.txt"
ECHO .NET SP4:		%SP4NETSrvrnum% >>"%PathToFiles%
unninglog.txt"
ECHO .NET SP5:		%SP5NETSrvrnum% >>"%PathToFiles%
unninglog.txt"
ECHO .NET SP6:		%SP6NETSrvrnum% >>"%PathToFiles%
unninglog.txt"
ECHO.>>"%PathToFiles%
unninglog.txt"


:last

Set /A KnownOS=%totSPnum%+%totSPXPnum%+%totSPW2KSrvrnum%+%totSPNETSrvrnum%

Set /A UnknownOS=%Totalnum%-%KnownOS%

ECHO Unknown O/S nodes:	%UnknownOS% >>"%PathToFiles%
unninglog.txt"
ECHO.>>"%PathToFiles%
unninglog.txt"
ECHO ********************************************************** >>"%PathToFiles%
unninglog.txt"
ECHO ^^>>"%PathToFiles%ADoutputTemp.html"

::*************************************************

ECHO ^^OU: %Target%^>>"%PathToFiles%ADoutputTemp.html"
ECHO Scope: %Scope:onelevel=One level%^>>"%PathToFiles%ADoutputTemp.html"
ECHO Total nodes:^ %Totalnum%^>>"%PathToFiles%ADoutputTemp.html"
ECHO Unknown OS: %UnknownOS%^<^/strong^>^<^/p^>>>"%PathToFiles%ADoutputTemp.html"
ECHO ^<^/font^>>>"%PathToFiles%ADoutputTemp.html"
ECHO ^
>>"%PathToFiles%ADoutputTemp.html" ECHO ^>>"%PathToFiles%ADoutputTemp.html" ECHO ^>>"%PathToFiles%ADoutputTemp.html" :: ****************************************************** ECHO ^>>"%PathToFiles%ADoutputTemp.html" ECHO ^
^^Service pack^<^/small^>^<^/strong^>^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^^^W2K Pro^<^/small^>^<^/strong^>^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^^^XP Pro^<^/small^>^<^/strong^>^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^^^W2K Server^<^/small^>^<^/strong^>^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^^^.NET Server^<^/small^>^<^/strong^>^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^<^/tr^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^>>"%PathToFiles%ADoutputTemp.html" ECHO ^^^No SP^<^/small^>^<^/strong^>^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%Nosp%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%XPNosp%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%W2KSrvrNosp%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%NETSrvrNosp%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^<^/tr^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^>>"%PathToFiles%ADoutputTemp.html" ECHO ^^^SP1^ <^/small^>^<^/strong^>^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP1num%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP1XPnum%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP1W2KSrvrnum%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP1NETSrvrnum%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^<^/tr^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^>>"%PathToFiles%ADoutputTemp.html" ECHO ^^^SP2^ <^/small^>^<^/strong^>^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP2num%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP2XPnum% ^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP2W2KSrvrnum%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP2NETSrvrnum%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^<^/tr^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^>>"%PathToFiles%ADoutputTemp.html" ECHO ^^^SP3^ <^/small^>^<^/strong^>^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP3num%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP3XPnum% ^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP3W2KSrvrnum% ^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP3NETSrvrnum%^<^/td^ >>>"%PathToFiles%ADoutputTemp.html" ECHO ^<^/tr^>>>"%PathToFiles%ADoutputTemp.html" :: ********* SP4-6 code currently skipped over ********* GOTO :Total ECHO ^>>"%PathToFiles%ADoutputTemp.html" ECHO ^^^SP4^ <^/small^>^<^/strong^>^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP4num%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP4XPnum% ^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP4W2KSrvrnum% ^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP4NETSrvrnum%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^<^/tr^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^>>"%PathToFiles%ADoutputTemp.html" ECHO ^^^SP5^ <^/small^>^<^/strong^>^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP5num%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP5XPnum% ^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP5W2KSrvrnum% ^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP5NETSrvrnum%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^<^/tr^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^>>"%PathToFiles%ADoutputTemp.html" ECHO ^^^SP6^ <^/small^>^<^/strong^>^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP6num%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP6XPnum% ^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP6W2KSrvrnum% ^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%SP6NETSrvrnum%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^<^/tr^>>>"%PathToFiles%ADoutputTemp.html" :Total ECHO ^>>"%PathToFiles%ADoutputTemp.html" ECHO ^^^Total^ <^/small^>^<^/strong^>^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%totSPnum%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%totSPXPnum%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%totSPW2KSrvrnum%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^%totSPNETSrvrnum%^<^/td^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^<^/tr^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^<^/table^>>>"%PathToFiles%ADoutputTemp.html" ECHO ^<^/div^>>>"%PathToFiles%ADoutputTemp.html" GOTO :EOF
Таблица А: Инструменты командной строки для запросов AD
НазваниеИсточникДействия
Dsadd.exeWindows Server 2003 Administration ToolsДобавляет объекты
Dsget.exe Windows Server 2003 Administration ToolsПоказывает объекты
Dsmod.exe Windows Server 2003 Administration ToolsИзменяет объекты
Dsmove.exe Windows Server 2003 Administration ToolsПеремещает объекты
Dsquery.exeWindows Server 2003 Administration ToolsНаходит объекты по критериям
Dsrm.exe Windows Server 2003 Administration ToolsУдаляет объекты. (Внимание! Эта команда потенциально опасна, будьте осторожны)
Csvde.exe Windows 2000 ServerИмпортирует информацию в AD или экспортирует ее из AD
Gpresult.exeMicrosoft Windows 2000 Resource KitСохраняет информацию о Group Policy Object (GPO) Resultant Set of Policies (RSoP)
Search.vbsWindows 2000 Support ToolsИщет объекты по критериям и с учетом области поиска
ADfind.exehttp://www.joeware.netПохож на Search.vbs, но более функционален
GetADCount.exehttp://www.joeware.netПодсчитывает количество объектов в AD
MemberOf.exe http://www.joeware.netПеречисляет группы, членом которых является пользователь в AD
SecData.exe http://www.joeware.netСохраняет индивидуальную информацию о защищенности определенного ID
UserName.exe http://www.joeware.netВозвращает Имя Пользователя в нескольких форматах
NetPWAge.exe http://www.systemtools.comВыводит возраст пароля пользователя или компьютера, распознает неиспользованные или устаревшие учетные записи