Сначала необходимо определить, какого рода информацию нужно собирать для ее дальнейшего использования в работах по устранению типичных неисправностей. При этом следует учитывать, что одни внутренние команды и утилиты из пакета Resource Kit могут запускаться только на локальной системе, в то время как другие допускают запуск на удаленных компьютерах. В файле Diag.bat имеются модули локального и удаленного кода, предназначенные для запуска соответствующих утилит в двух этих ситуациях. Те же принципы следует применять и в тех случаях, когда создается сценарий, который вы собираетесь удаленно запускать на каком-либо компьютере, а количество команд, которые могут запускаться на удаленном компьютере, ограничено.

После того как выработаны требования к собираемой информации и сформирован перечень утилит, которые вы будете использовать для сбора данных, необходимо определить, будут ли эти утилиты устанавливаться на локальный компьютер или вы планируете разместить их в некотором сетевом каталоге. Утилиты, входящие в состав пакетов Microsoft Windows 2000 Server Resource Kit или Windows 2000 Support Tools, такие как Reg (reg.exe), Findgrp (findgrp.exe) и Srvinfo (srvinfo.exe), должны быть либо установлены локально на каждый клиентский компьютер, либо запускаться из общедоступного сетевого каталога. Необходимо также решить, кто именно должен запускать эти утилиты. Будете ли вы запускать этот сценарий сами от имени административной учетной записи, сидя за компьютером пользователя, или же сценарий должен запускаться под учетной записью пользователя? В большинстве случаев запуск утилит с административными полномочиями дает возможность собрать более полную информацию о компьютере, но этой информации будет недостаточно для диагностики проблем, связанных с правами пользователей. Следует также выяснить, какой пользовательский контекст необходим каждой из используемых утилит для обеспечения ее корректной работы. Вряд ли имеет смысл запускать утилиту Reg, обращающуюся к разделу реестра, если у пользователя отсутствуют права для запуска программ работы с реестром или для обращения к тому разделу реестра, из которого вам необходимо получить данные. В Таблице 1 приведен перечень собираемой мною диагностической информации и используемых для этого утилит. Данная таблица может использоваться в качестве отправной точки, далее вы сможете дополнять ее необходимыми утилитами и соответствующим образом модифицировать Diag.bat применительно к вашим условиям.

Отображение результатов диагностики может быть реализовано несколькими способами. В Diag.bat для этого используется Microsoft Internet Explorer (IE), но сценарий можно модифицировать так, чтобы вызывался Notepad или какое-либо другое приложение. После того как файл был создан сценарием и выведен на экран, он остается во временном (Temp) каталоге пользователя – так что далее его можно переместить или скопировать в некоторый административный каталог для дальнейшего анализа либо просто удалить. На Листинге 1 (фрагмент с меткой B) приведен код, реализующий все возможные варианты отображения.

Идентификация администраторов (Administrator) , опытных пользователей (Power User) и пользователей (User)

Начиная с Windows 2000 есть возможность создания вложенных групп, поэтому во многих случаях при простом просмотре состава групп "Администраторы" или "Опытные пользователи" не удается точно определить, какие именно локальные права имеет пользователь (для просмотра состава локальных групп нажмите "Пуск", "Программы", "Администрирование", "Управление компьютером"). Более точный метод определения уровня полномочий пользователей состоит в том, чтобы проверить, какие задачи они могут выполнять в системе. Для того чтобы определить, может ли пользователь выполнять операции, для которых нужны права уровня "Администратор", сценарий Diag.bat пытается запустить команду Dir применительно к общему ресурсу ADMIN$ (см. фрагмент с меткой A). Если это завершается неудачей, тогда предпринимается попытка запустить некоторую задачу, для выполнения которой нужны права уровня "Опытный пользователь". Если и эта попытка завершается неудачей, следовательно, данный пользователь имеет в локальной системе права, соответствующие уровню группы "Пользователи". В качестве тестовой задачи для уровня "Опытный пользователь" в сценарии используется запуск команды Net Session. Обратите внимание на фрагмент с меткой A, где при запуске последующей команды используется символ двойной вертикальной черты (||), в том случае, если предыдущая команда завершилась неудачно.

Перенаправление вывода

Для перенаправления вывода данных команды можно использовать одиночный (>) или двойной (>>) символы "больше чем". Если используется символ ">", то для сохранения данных создается новый выходной файл с заданным именем, либо (если файл с таким именем уже существует) его содержимое полностью переписывается. Если же для перенаправления используется символ ">>", то в этом случае либо создается новый выходной файл, либо (если файл с таким именем уже существует) новые данные дописываются в конец существующего файла.

Обратите внимание, что в Diag.bat в первой команде ECHO используется символ ">", в результате чего любой сохранившийся в каталоге Temp с момента последнего запуска сценария выходной файл будет создан заново. Далее во всех командах сценария используется символ ">>", поэтому вся диагностическая информация, собранная каждой из используемых утилит, будет дописываться в конец вновь созданного выходного файла. Для структурирования информации, получаемой от разных утилит, можно логически группировать ее, вставляя между соответствующими разделами пустые строки. Это может быть реализовано следующей командой:

ECHO.>C:yourfile.txt

Чтобы исключить вывод на экран ненужных сообщений об успешном выполнении и о возможных ошибках в сценарии Diag.bat применяется перенаправление данных в NUL. Рассмотрим, например, запуск команды Dir для разделяемого ресурса ADMIN$ (фрагмент с меткой A). Если команда запустилась, то нам не нужно выводить на экран содержимое всех каталогов данного ресурса. Если выполнение команды завершилось неудачно, то отображать сообщение об ошибке также не нужно. То есть здесь нас интересует только сам факт успешного или неудачного запуска команды. Поэтому в данном случае можно использовать следующий синтаксис перенаправления вывода:

Dir /B /AD \%computername 
%ADMIN$ 1>NUL 2>NUL

Для того чтобы понять, как работает данная команда, запустите сценарий, сначала удалив из текста параметр "1>NUL", а затем удалив "2>NUL".

В некоторых случаях бывает полезно удалять пустые строки из данных, выводимых той или иной командой. Примером команды, выводящей несколько пустых строк в своих выходных данных, является команда ipconfig. В данном случае для отсечения пустых cтрок можно воспользоваться командой Findstr, указав в ней соответствующий класс символов:

Ipconfig /all 
| Findstr /I "[A-Z0-9]"

В той секции сценария, которая реализует запуск команд на удаленном компьютере, используется утилита PsExec от Sysinternals. С помощью данной утилиты на удаленном компьютере запускается команда ipconfig, с помощью которой собираются детальные сведения о конфигурации сетевых параметров компьютера. При запуске утилиты ipconfig через PsExec в выводимые данные включается некоторая дополнительная информация, в частности название утилиты и несколько пустых строчек в начале и в конце полученных данных. Эту избыточную информацию можно отфильтровать. Наличие в команде For ключа "skip" позволяет задать необходимое количество строк в начале выходного потока, которые должны быть удалены из выводимых данных, а с помощью последовательности команд Find отфильтровываются нескольких строк в конце блока данных, которые содержат ненужную информацию. В результате синтаксис выглядит следующим образом:

For /f "tokens=* skip=4" %%i in 
('Psexec.exe \%1 Ipconfig
/all^|Findstr /I "[A-Z0-9]"^|find
/I /V "service"^|find /I /V
"exited"') do echo %%i

При использовании в сценарии Diag.bat команды Reg для обращения к разделу реестра из всей полученной от этой команды информации интерес представляет только последняя строка, которая выводится с помощью команды Echo. Дело в том, что компьютеры сети нашей компании могут перемещаться между несколькими организационными подразделениями (OU), но поскольку меня интересует только текущее OU, то для получения необходимой информации используется следующий синтаксис:

For /F "tokens=1,2,3 delims=/ 
" %%i in ('reg.exe query
"HKLMSOFTWAREMicrosoftWindowsCurrentVersionGroup PolicyHistory" /s
^|findstr "LDAP://OU"')
do set OU=%%j
ECHO PC OU: %OU%

Обратите внимание, что в рассмотренной команде For данные не направляются сразу в выходной файл. Вместо этого используется переменная, значение которой соответствует последней строке из списка OU, имеющегося в реестре. Таким образом, это OU соответствует наиболее актуальному размещению компьютера. Значение данной переменной выводится отдельной строкой при помощи команды echo.

Ввод сценария Diag.bat в эксплуатацию

Развертывание Diag.bat может осуществляться несколькими способами. С помощью механизмов групповых политик можно распространить на клиентские компьютеры либо сам сценарий, либо, что более предпочтительно, создать на каждом компьютере вашей сети ярлык, который будет указывать на место размещения сценария на соответствующем сервере. Сценарий можно размещать как в профиле All Users, так и в менее очевидном месте, с тем чтобы только специалисты службы технической поддержки знали, где он находится. Сценарий может запускаться при регистрации в системе пользователя или сотрудника службы поддержки, кроме этого специалисты службы поддержки могут запускать его с удаленного компьютера. Для обеспечения возможности диагностики компьютеров, не имеющих соединения с сетью, можно создать специальный компакт диск или любой другой подключаемый накопитель, на котором разместить сам файл сценария и необходимые для его работы утилиты из пакетов Resource Kit, Support Tools и т.д. Для того чтобы сконфигурировать Diag.bat под вашу конкретную среду выполните следующие действия:

  1. Загрузите с сайта Sysinternals утилиты PsLoggedOn и PsExec (адреса http://www.sysinternals.com/ntw2k/freeware/psloggedon.shtml и http://www.sysinternals.com/ntw2k/freeware/psexec.shtml, соответственно). Вообще говоря, обе утилиты включены в состав пакета PsTools, но их можно загрузить и по отдельности.
  2. Укажите пути к утилите Reg (Windows 2000 Support Tools), а также к утилитам Findgrp и Srvinfo (Windows 2000 Resource Kit). Следует иметь в виду, что на компьютерах с Windows XP утилита Reg.exe входит в состав поставки (см. комментарий в сценарии Diag.bat по поводу особенностей синтаксиса версии утилиты Reg для Windows XP).
  3. Сначала проверьте работу сценария Diag.bat на нескольких тестовых машинах, после чего включите в него команды запуска необходимых вам дополнительных утилит.
  4. Чтобы запустить сценарий на локальном компьютере наберите в командной строке
Diag.bat

без аргументов. Для запуска сценария на удаленном компьютере используйте следующий синтаксис:

Diag.bat .

Сценарий Diag.bat поможет вам и вашей службе технической поддержки в получении необходимой информации для быстрой диагностики проблем, связанных с ПК. А использованные в нем методы обработки данных командной строки предоставят в ваше распоряжение несколько новых приемов разработки сценариев, которые вы сможете применять в дальнейшем.


ТАБЛИЦА 1: Диагностическая информация и инструментарий для ее сбора
Собираемые данныеУтилитаВозможность локального запускаВозможность удаленного запуска
Переменные окруженияECHO ДаНет
Настройка параметров IPIpconfig /allДаДа, через PsExec
Запущенные и остановленные службыSrvinfo.exe (Windows 2000 Resource Kit)ДаДа
Емкость и использованное пространство дискаSrvinfo.exe (Windows 2000 Resource Kit)ДаДа
Установленные исправления (hotfix)Srvinfo.exe (Windows 2000 Resource Kit)ДаДа
Дата установкиSrvinfo.exe (Windows 2000 Resource Kit)ДаДа
Актуальные права пользователя на ПК (Administrator, Power User, или User)Запуск встроенных команд Net Use и Net SessionДаНет
Текущее размещение компьютера в OUЗапуск утилиты Reg для чтения ключа реестра OU History (Windows 2000 Support Tools)ДаДа
Показания локальных часов компьютера и доменное времяКоманды Date и Time для локальных часов и команда Net Time для доменного времениДаДа
Членство в группах зарегистрированного в системе пользователяFindgrp.exe (Windows 2000 Resource Kit)ДаДа
Членство в группах учетной записи компьютераFindgrp.exe (Windows 2000 Resource Kit)ДаДа
Данные о пользователе, зарегистрированном на удаленной системеPsLoggedOn.exe (http://www.sysinternals.com)Да, но эти же сведения проще получить, обратившись к переменной окружения %USERNAME%.Да

Листинг 1. Фрагмент сценария Diag.bat
@Title Diag.bat script
if "%1"=="" Goto :Local
Goto :Remote
BEGIN COMMENT LINE
:: Начало раздела локального запуска сценария.
END COMMENT LINE
:Local
BEGIN COMMENT LINE
:: Укажите путь к каталогу, в котором будет сохранен текстовый файл,
:: создаваемый сценарием.
END COMMENT LINE
Set file=%Temp%\%computername%-diag.txt
@Title Diag.bat script running locally
ECHO Сценарий Diag.bat запущен на локальном компьютере.>"%file%"
ECHO Для запуска Diag.bat на удаленной системе используйте
 синтаксис: Diag.bat ^<PCNAME^> >>"%file%"
ECHO Пример: Diag.bat SalesPC2>>"%file%"
ECHO.>>"%file%"
ECHO ********** Переменные окружения **********>>"%file%"
ECHO COMPUTERNAME: %COMPUTERNAME%>>"%file%"
ECHO HOMEDRIVE: %HOMEDRIVE%>>"%file%"
ECHO HOMESHARE: %HOMESHARE%>>"%file%"
ECHO LOGONSERVER: %LOGONSERVER%>>"%file%"
ECHO # OF PROCESSORS: %NUMBER_OF_PROCESSORS% >>"%file%"
ECHO DNS DOMAIN: %USERDNSDOMAIN%>>"%file%"
ECHO USERDOMAIN:%USERDOMAIN%>>"%file%"
ECHO USERNAME: %USERNAME%>>"%file%"
ECHO.>>"%file%"
ECHO ********** Полномочия пользователя на ПК **********>>"%file%"
BEGIN COMMENT LINE
:: В данном фрагменте предполагается, что на компьютере существует 
:: имеющийся по умолчанию в Windows 2000 общий ресурс ADMIN$;
:: в противном случае здесь нужно использовать другой встроенный ресурс,
:: для подключения к которому нужны административные полномочия.
END COMMENT LINE
' BEGIN CALLOUT A
@Dir /B /AD \%computername%ADMIN$ 1>NUL 2>NUL && goto
  :anadmin || goto :notadmin
:anadmin
ECHO Полномочия пользователя: Local Administrator>>"%file%"
goto :last
:notadmin
net session&&goto :poweruser
goto :user
:poweruser
ECHO Полномочия пользователя: Power User>>"%file%"
goto :last
:user
ECHO Полномочия пользователя: User>>"%file%"
' END CALLOUT A
:last
ECHO.>>"%file%"
ECHO ********** Данные о конфигурации параметров IP **********>>"%file%"
Ipconfig /all|Findstr /I "[A-Z0-9]">>"%file%"
ECHO.>>"%file%"
ECHO ********** Подробные данные о ПК **********>>"%file%"
BEGIN COMMENT LINE
:: Укажите путь к утилите Srvinfo.
END COMMENT LINE
srvinfo.exe -s>>"%file%"
ECHO.>>"%file%"
BEGIN COMMENT LINE
:: Приведенный ниже синтаксис используется при вызове утилиты Reg,
:: входящей в пакет  Windows 2000 Support Tools.
:: Если используется другая версия утилиты Reg,
:: то измените параметр "set OU=%%j" на "set OU=%%k".
END COMMENT LINE
SET OU=N/A
BEGIN COMMENT LINE
:: Укажите путь к утилите Reg.
END COMMENT LINE
For /F "tokens=1,2,3 delims=/ " %%i in (‘reg.exe query
  "HKLMSOFTWAREMicrosoftWindowsCurrentVersionGroup
 PolicyHistory" /s ^|findstr
  "LDAP://OU"') do set OU=%%j
ECHO.>>"%file%"
ECHO ********** Размещение компьютера в OU **********>>"%file%"
ECHO PC OU: %OU%>>"%file%"
ECHO.>>"%file%"
ECHO ******* Синхронизация времени с  logon-сервером *******>>"%file%"
For /F "tokens=*" %%i in ('Time /T')Do Set PCTime=%%i
For /F "tokens=2" %%i in ('Date /T')Do Set PCDate=%%i
ECHO Current time at \%COMPUTERNAME% is %PCDate% %PCTime%>>"%file%"
For /F "tokens=*" %%i in ('NET TIME %LOGONSERVER% ^| find /V /I "command"')
  do ECHO %%i>>"%file%"
ECHO.>>"%file%"
ECHO ********** Членство доменного пользователя в локальных группах - User **********>>"%file%"
BEGIN COMMENT LINE
:: Укажите путь к утилите Findgrp.
END COMMENT LINE
findgrp.exe /L %USERDOMAIN% %USERDOMAIN%\%USERNAME%| Find /I /V
  "Findgrp:">>"%file%" 
ECHO.>>"%file%"
ECHO ********** Членство доменной учетной записи компьютера в локальных группах **********>>"%file%"
BEGIN COMMENT LINE
:: Укажите путь к утилите Findgrp.
END COMMENT LINE
findgrp.exe /L %USERDOMAIN% %USERDOMAIN%\%COMPUTERNAME%$| Find /I /V
  "Findgrp:">>"%file%" 
"%ProgramFiles%Internet ExplorerIEXPLORE.EXE" "%file%"
' BEGIN CALLOUT B
BEGIN COMMENT LINE
:: Если оставить этот фрагмент кода без изменений, то выходной файл будет 
:: сохранен во временном (Temp) каталоге пользователя.
:: Если нужно удалить выходной файл после закрытия окна IE,
:: снимите комментарий с нижеследующей строки.
END COMMENT LINE
rem del "%file%"
BEGIN COMMENT LINE
:: Если после закрытия окна IE нужно переместить выходной файл
:: в другое место, снимите комментарий с нижеследующей строки.
END COMMENT LINE
rem Move "%file%" "servernamesharename\%computername%-diag.txt"
BEGIN COMMENT LINE
:: Если после закрытия окна IE нужно скопировать выходной файл
:: в другое место, снимите комментарий с нижеследующей строки.
END COMMENT LINE
rem Copy "%file%" "servernamesharename\%computername%-diag.txt"
' END CALLOUT B
BEGIN COMMENT LINE
:: Завершение раздела локального запуска сценария.
END COMMENT LINE
Goto :EOF