Файлы рабочего столаPsTools Primer

Уес Миллер (Wes Miller)

Загрузить исходный код для этой статьи: MillerTheDesktopFiles2007_03.exe (150KB)

До прошлого года я работал в компании Winternals Software, которая в июле 2006 г. была приобретена корпорацией Майкрософт. Winternals продавала коммерческое программное обеспечение, но основатели компании, Марк Руссинович (Mark Russinovich) и Брайс Когсвелл (Bryce Cogswell) являлись также владельцами еще одной компании, Sysinternals, которая многие программы распространяла бесплатно. Некоторые из этих бесплатных приложений

даже стали компонентами пакета Winternals Administrator's Pak. Марк и Брайс также продавали лицензии на эти средства компаниям, которые хотели использовать их по истечении обычных сроков бесплатных лицензий.

Одно из моих любимых средств из библиотеки Sysinternals (точнее, это целая пачка программ) — комплект PsTools — сейчас можно найти по адресу microsoft.com/technet/sysinternals/utilities/pstools.mspx. Марк назвал эти средства в честь служебной программы ps, используемой в UNIX для перечисления процессов. На веб-узле загрузки этих средств упоминается, что в Windows® имеется встроенная служебная программа, работающая в режиме командной строки, которая может выполнять некоторые из функций этих средств. Однако, не говоря уже о замечательных, уникальных функциональных возможностях, главное различие между этими программами в том, что комплект PsTools может использоваться локально или дистанционно (если, конечно, удаленные системы правильно настроены). Более того, работать с этими средствами дистанционно почти так же просто, как и локально.

Комплект PsTools содержит несколько отдельных приложений, приведенных на рис. 1. Как и остальные служебные программы, разработанные Sysinternals, данный комплект не содержит установщиков, а только приложения. Достаточно поместить их в нужную папку и — вперед!

Figure 1 Служебные программы PsTools

Средство Описание
PsExec Исполнение процессов в контексте любого пользователя.
PsFile Получение сведений о файлах, открытых на удаленном компьютере.
PsGetSid Получение кода безопасности (SID) компьютера или пользователя.
PsInfo Получение сведений об операционной системе Windows.
PsKill Ликвидация процессов по имени или коду процесса.
PsList Получение подробных сведений о запущенных процессах.
PsLoggedOn Получение сведений обо всех локально подключенных пользователях, а также всех пользователях, подключенных к общим ресурсам.
PsLogList Создание дампа журнала событий Windows.
PsPasswd Изменение паролей учетных записей пользователей.
PsService Просмотр и управление службами Windows.
PsShutdown Выключение, перезапуск, перевод в спящий режим или приостановка работы компьютера.
PsSuspend Приостановка запущенных процессов.

Вы можете заметить, что некоторые из функций (особенно PsLogList) могут быть реализованы средствами инструментария управления Windows (WMI) и некоторых сложных сценариев. Но изюминка комплекта PsTools состоит в том, что каждая его программа предназначена для выполнения определенной задачи, причем наиболее просто и легко.

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

Как работают эти средства?

Все средства в основном работают одинаково. Вы запускаете средство PsTool на основном компьютере. Хотя многие средства можно запускать локально, вы обнаружите, что большинство из них имеет служебную программу для запуска в удаленной системе или нескольких системах сразу. (PsExec — это особое исключение, которое мне вспоминается; вы убедитесь в этом далее из примера.) Используя аргументы командной строки, служебная программа создает свою копию на административном общем ресурсе удаленной системы, что то же самое, что %SystemRoot% (каталог Windows) в удаленной системе.

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

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

Требования, необходимые для работы этих средств: Операционная система Windows NT®, Windows 2000, Windows XP или Windows Server® 2003 (поддерживаются 32-разрядные (x86) или 64-разрядные (x64) версии Windows, кроме версий Itanium); в удаленной системе, в которой запускаются средства, доступен используемый по умолчанию общий сетевой ресурс (admin$) и открыт общий доступ к файлам и принтерам в удаленной системе (при использовании брандмауэра Windows, брандмауэра подключения к Интернету или другого брандмауэра).

PsExec

PsExec — одно из моих любимых средств, но причина этого может показаться вам неожиданной. В течение двух лет я большую часть времени работал в своих системах не как администратор, а как пользователь. У меня есть коротенький сценарий, run.vbs, который я использую для запуска приложений от имени локального администратора (запуск происходит так же просто, как и от имени любого другого пользователя). На рис. 2 приведен код этого сценария (его также можно загрузить на веб-узле TechNet Magazine technetmagazine.com/code07.aspx). В сценарии предполагается, что путь к программе PsTools задан системной переменной Path.

Figure 2 Run.vbs

SET WshShell = WScript.CreateObject("WScript.Shell")
SET WshSysEnv = WshShell.Environment("SYSTEM")
SET FSO = CreateObject("Scripting.FileSystemObject")
IF WScript.Arguments.Count <> 0 Then
    FOR EACH arg IN WScript.Arguments
        iArgCount = iArgCount + 1
        strCmdArg = (arg)
        strCmdArray = Split(strCmdArg, " ", 2, 1)
        IF iArgCount = 1 THEN
        strExe = strCmdArray(0)
        ELSEIF iArgCount = 2 THEN
        strRun = strCmdArray(0)
        ELSE
        strParams = strParams&" "&strCmdArray(0)
        END IF
    NEXT
END IF
'/t:0A && title ***** Admin ***** 
        strExt = LCase(Right(strExe, 3))

IF strExt <> "exe" AND strExt <> "bat" AND strExt <> "cmd" THEN
WshShell.Run "psexec.exe -d -i -e -u COMPUTERNAME\USER -p PASSWORD  cmd /c start "&strExe&"
    "&strRun&" "&strParams, 0, FALSE
ELSE
WshShell.Run "psexec.exe -d -i -e -u COMPUTERNAME\USER -p PASSWORD "&strExe&" "&strRun&"
    "&strParams, 0, FALSE
END IF

    SET WshShell = NOTHING
    SET WshSysEnv = NOTHING
    SET FSO = NOTHING

Этот простой сценарий является примером использования функциональных возможностей PsExec, которые добавил Марк, когда мы работали над нашим продуктом Protection Manager в Winternals: возможность для пользователя с ограниченными правами получить расширенные права для локального запуска PsExec. Наиболее часто PsExec, конечно, запускается дистанционно, например для запуска служебной программы, которая не предполагает удаленное использование, поддержки сценариев или автоматизации рабочей среды. К ключевым особенностям PsExec относятся возможность копирования двоичного файла для исполнения в удаленной системе, а также возможность требовать привязку к процессору. Другая удобная функция PsExec — это возможность задавать файл сценария для выполнения одновременно на нескольких машинах.

Вот вариант упрощенного использования PsExec:

PsExec \\computer -u username -p password command

Эту командную строку можно расширить при помощи ключей, приведенных на рис. 3.

Figure 3 Параметры PsExec

Параметр Описание
-a Задает привязку к процессору.
-c Указывает, следует ли копировать приложение на удаленный компьютер.
-d Указывает, что до выхода не следует ожидать окончания процесса (не ожидать сообщения о завершении или об ошибке).
-e Загружает с использованием указанного профиля учетной записи.
-f Копирует приложение на удаленный компьютер, даже если оно уже существует. Гарантирует запуск текущей (или указанной) версии.
-i Интерактивный запуск приложения на удаленном компьютере (используется, если нужно, чтобы конечный пользователь видел интерфейс пользователя приложения).
-l Запускает приложение от имени пользователя с ограниченными правами. Удаляет маркер группы администраторов и понижает привилегии для процесса до уровня члена группы пользователей. Удобно для запуска опасных приложений для работы в Интернет с минимальными привилегиями.
-n Указывает время ожидания при неудачной попытке подключения к удаленным компьютерам.
-priority Запускает процесс с указанным приоритетом. Устанавливает приоритет, назначаемый Windows для указанной задачи: -low (низкий), -belownormal (ниже среднего), -abovenormal (выше среднего), -high (высокий) или –realtime(реального времени).
-s Запускает процесс, используя системную учетную запись (удобно для запуска программы Regedit для доступа к разделам реестра, защищенным привилегиями).
-v Копирует приложение только в случае, если копируемое приложение имеет более новую версию.
-x Отображает интерфейс пользователя на защищенном рабочем столе Winlogon — работает только в локальной системе.
@file Запускает команду на всех компьютерах, указанных в текстовом файле.

PsFile

PsFile — это более узконаправленное средство, чем PsExec. В частности, оно используется для проверки того, какие файлы открываются и кем они открываются в удаленной системе. Это может быть полезно в случае, когда перед перезагрузкой сервера нужно выяснить, какие файлы открыты. Чтобы узнать, какой пользователь заблокировал файл, например для предотвращения редактирования или удаления, можно вручную отправить пользователю уведомление или закрыть файл с помощью PsFile. PsFile используется следующим образом:

PsFile \\computer -u username -p password 

Эта строка возвращает список дескрипторов файлов, открытых в удаленной системе. Кроме того, к инструкции можно также добавить параметр Id, определяющий имя файла, информацию о котором вы хотите получить или который нужно закрыть. Можно также добавить ключ -c, который закрывает файл, определенный с помощью параметра Id.

PsGetSid

Средство PsGetSid также является узконаправленным. Программа сообщает код безопасности (SID) компьютера, пользователя или группы. Это может быть полезным, если вы хотите убедиться, что системы в вашем домене не имеют одинаковых SID, или просто проверить SID всех пользователей или групп в системе. PsGetSid используется следующим образом:

PsGetSid \\computer -u username -p password account

Обратите внимание, что учетная запись может обозначать пользователя, компьютер или группу. Хотя синтаксис PSGetSid прост, возможны также дополнительные параметры. Параметр SID указывает учетную запись (группы или компьютера), а @file запускает команду на всех компьютерах, перечисленных в указанном текстовом файле.

PsInfo

PsInfo используется для получения подробных сведений о системе. Это, очевидно, будет весьма полезно при запуске сценария в нескольких удаленных систем с записью результата в файл (например, в CSV-файл для чтения в Excel® и сохранения в базе данных). Обратите внимание, что, в отличие от большинства других средств, в данной служебной программе используется следующий важный алгоритм: если не указать имя компьютера, PsInfo по умолчанию попытается опросить все компьютеры домена. PsInfo используется следующим образом:

PsInfo  \\computer -u username -p password 

Хотя синтаксис команды прост, допускается использование дополнительных ключей и параметров, приведенных на рис. 4

Figure 4 Параметры PsInfo

Параметр Описание
-h Отображает все обновления Windows.
-s Отображает все приложения, установленные в системе.
-d Отображает сведения о дисках и томах системы.
-c Выводит результаты в формате CSV.
-t Задает другой разделитель для CSV-файлов вместо используемого по умолчанию \t.
Filter Отображает только данные, соответствующие данному фильтру.
@file Запускает команду на всех компьютерах, указанных в текстовом файле.

PsKill

PsKill — это удобная служебная программа для завершения процессов в локальной или удаленной системе. Использовать ее очень просто. Она позволяет быстро ликвидировать процесс вместе с дочерними процессами. Используются PsKill аналогично другим средствам, которые я уже описывал:

PsKill -t \\computer -u username -p password process id | process name

Обратите внимание, что вы можете указать либо код процесса, либо имя процесса, который хотите ликвидировать.

PsList

Я нечасто использую PsList, потому что я поклонник программы Process Explorer. Подробные сведения приведены на узле microsoft.com/technet/sysinternals/ProcessesAndThreads/ProcessExplorer.mspx (на английском языке). Но поскольку дистанционной версии Process Explorer не существует, PsList становится разумной заменой для использования ее ключевых возможностей. На самом деле PsList — это список из одного или нескольких процессов, которые запущены в удаленной системе.

Использовать PsList очень просто:

PsList \\computer -u username -p password account

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

Figure 5 Параметры PsList

Параметр Описание
-t Отображает сведения на уровне потока.
-m Предоставляет подробную информацию по каждому процессу.
-x Отображает сведения о процессе, памяти и потоке.
-t Отображает информацию в виде дерева процессов (вспомните древовидную структуру в программе Process Explorer).
-s [n] Запускает режим диспетчера задач на указанное количество секунд. Это позволяет практически в реальном времени просмотреть сведения об удаленном процессе.
-r [n] Задает частоту (в секундах) обновления при работе в режиме диспетчера задач.
name Отображает сведения о процессах, имя которых начинается с заданной строки.
-e Ищет процесс с точно соответствующим именем.
pid Отображает сведения об указанном процессе.

PsList — мощное и в то же время простое в использовании средство, с помощью которого можно во всех подробностях наблюдать за удаленными процессами, не прибегая к использованию удаленного рабочего стола. Используя эти сведения, вы можете перейти к PsKill или PsSuspend, если, например, необходимо остановить какой-либо процесс.

PsLoggedOn

Назначение данного средства понятно из его названия. Данная служебная программа показывает, кто из пользователей вошел в систему. Это могут быть локальные (интерактивные) входы в систему или общесетевые входы. Подобно PsFile, это средство может быть полезным для определения, кто использует сервер, на котором вы собираетесь проводить обслуживание. Использовать программу очень просто:

PsLoggedOn \\computer

PsLoggedOn имеет только два дополнительных параметра: -l показывает только локальные (несетевые) входы в систему, а -x подавляет вывод времени входа.

Ценность PsLoggedOn в том, что эта программа позволяет легко видеть сведения, для получения которых вам бы пришлось побывать в нескольких местах Windows.

PsLogList

PsLogList — одно из наиболее часто используемых средств. Эта программа создает журналы событий Windows в текстовом формате, который потом может быть использован средствами чтения журналов, базами данных и вообще чем угодно. Главное преимущество этого средства — преобразование записи событий из двоичного формата в формат, который легко можно преобразовать или автоматизировать. (Конечно, в Windows Vista™ журналы событий изначально создаются в XML, но это уже другой разговор.)

Использование PsLogList:

PsLogList \\computer -u username -p password

Имеется также несколько дополнительных ключей и параметров (см. рис. 6).

Figure 6 Параметры PsLogList

Параметр Описание
-a Создает дамп событий только после указанной даты.
-b Создает дамп событий только до указанной даты.
-c Окончательно очищает журнал событий после создания дампа требуемого события.
-d Отображает сведения только за указанное число дней.
-e Исключает события с указанным кодом (можно указать до 10 событий).
-f Производит фильтрацию типов событий (предупреждение, ошибка и так далее).
-g Экспортирует журнал событий в виде EVT-файла — требуется параметр -c.
-h Отображает сведения только за указанное число часов.
-l Создает дамп указанного EVT-файла.
-m Отображает сведения только за указанное число минут.
-n Отображает сведения только для определенного количества последних событий.
-o Показывает только события из заданного источника (например, -o SRService для службы восстановления Windows).
-q Исключает события из заданного источника (в противоположность -o).
-r Меняет порядок — создается дамп журнала событий от самого раннего до самого последнего события.
-s Создает список записей с разделением полей в каждой строке.
-t Указывает другой, вместо запятой, разделитель для вывода с параметром -s.
-w Ожидает новых событий для заполнения и создания дампа в реальном времени. Этот параметр применим только на локальном компьютере.
-x Создает расширенный дамп журналов событий.
eventlog Указывает, для какого журнала событий нужно создать дамп. По умолчанию — системный журнал.
@file Запускает команду на всех компьютерах, указанных в текстовом файле.

Журналы событий Windows могут быть невероятно мощным средством диагностики, но вся соль в том, как получить такие данные, которыми можно управлять или объединять их. PsLogList как раз и выполняет данную операцию.

PsPasswd

PsPasswd — простая, но мощная служебная программа, выполняющая те же функции, что и Net.exe, но с возможностью дистанционного использования и автоматизации.

PsPasswd  \\computer -u username -p password Username Newpassword

Вы можете указать компьютер, не указывать компьютер (тогда это будет локальная система) или, если укажете компьютер как \\*, служебная программа обработает все компьютеры в текущем домене. PsPasswd имеет только один дополнительный параметр: @file запускает команду на всех компьютерах, указанных в текстовом файле. Это действительно одна из самых необходимых служебных программ, которая предоставляет огромные возможности.

PsService

PsService позволяет просматривать и редактировать сведения диспетчера управления службами (SCM) в одной или нескольких системах сети; можно даже искать имя заданной службы на компьютерах в сети.

PsService \\computer -u username -p password command options

Команда запуска PsService представляет собой одну из команд, перечисленных на рис. 7, а параметры определяют атрибуты, применяемые к данной команде. Если дополнительные ключи к командам не используются, PsService создаст полный дамп данных SCM.

Figure 7 Команды PsService

Команда Описание
query Запрашивает указанную службу.
config Запрашивает сведения о настройке для указанной службы.
setconfig Задает сведения о настройке для указанной службы.
start Запускает службу.
stop Останавливает службу.
restart Перезапускает (останавливает и снова запускает) службу.
pause Приостанавливает службу.
cont Возобновляет приостановленную службу.
depend Показывает, какие службы зависят от данной службы.
find Производит поиск в сети экземпляра данной службы.
security Предоставляет сведения о безопасности для данной службы.

PsService можно рассматривать как мощную, дистанционную версию Services.msc с поддержкой командной строки, которая также позволяет просматривать службы сети (возможно, потенциально опасные) и собирать сведения о настройке.

PsShutdown

PsShutdown — это еще одно мое любимое средство. Хотя кое-кто скажет, что среди продуктов корпорации Майкрософт есть средство для выполнения этой задачи (shutdown.exe), эти средства все-таки не одно и то же. Ключевое отличие заключается в возможностях PsShutdown: а именно, данное средство может завершать работу и перезапускать удаленную систему. Кроме того, существует возможность переводить систему в ждущий или спящий режим (не только завершать работу и перезапускать), блокировать систему и перезапускать систему после вывода на экран сообщения для пользователя через заданный промежуток времени.

PsShutdown \\computer -u username -p password

При использовании PsShutdown доступен ряд дополнительных параметров, приведенных на рис. 8.

Figure 8 Параметры PsShutdown

Параметр

Описание

-a

Прерывает выполняемое завершение работы, инициированное программой PsShutdown.

-c

Позволяет текущему пользователю прервать завершение работы.

-d

Приостанавливает работу компьютера (ждущий режим).

-e

Коды причин выключения. Я рекомендую ознакомиться с материалами, содержащими информацию об этих параметрах, на веб-узле корпорации Майкрософт, так как при их использовании со средством PsShutdown и встроенным средством shutdown.exe могут возникать затруднения. Дополнительные сведения приведены в статье по адресу: msdn2.microsoft.com/en-us/library/aa376885.aspx

(на английском языке).

-f

Принудительно завершает работу всех приложений.

-h

Переводит компьютер в спящий режим.

-k

Выключает компьютер (перезагружает, если отключение питания не поддерживается).

-l

Блокирует компьютер.

-m

Задает сообщение для всех текущих пользователей.

-n

Задает время ожидания при неудачной попытке подключения к удаленным компьютерам.

-o

Выполняет выход из системы пользователя консоли.

-r

Перезагружает компьютер.

-s

Завершает работу компьютера, но не отключает питание.

-t

Время, которое должно пройти перед выполнением команды выключения, или время отключения питания.

-v

Отображает сообщение для пользователей перед выключением.

@file

Выполняет команду на всех компьютерах, указанных в текстовом файле.

Вы можете убедиться, что PsShutdown — очень мощная, легко настраиваемая служебная программа для управления электропитанием системы, которая при этом относительно проста в использовании.

PsSuspend

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

PsSuspend \\computer -u username -p password process ID

С помощью PsList можно получить код процесса. Процесс, который был приостановлен, можно возобновить при помощи ключа -r. Следует отметить, что приостановка и возобновление процесса реализуется также с помощью программы Process Explorer, но только в локальном режиме. Как раз то, что PsSuspend может приостанавливать и возобновлять процессы дистанционно и локально, и дает ей преимущество перед функцией программы Process Explorer.

Заключение

На мой взгляд, комплект PsTools — бесценен. Вместе с остальными служебными программами Sysinternals (а именно Regmon, Filemon, Process Explorer, а теперь и Process Monitor) PsTools — первые программы, которые я заношу в строку пути при переустановке Windows в любой из моих систем. Я надеюсь, что эта статья помогла вам познакомиться с комплектом PsTools, если вы не были ранее с ним знакомы, а если были, то вы приобрели дополнительные знания об этих средствах. И, конечно, я очень благодарен Марку Руссиновичу за помощь в написании этой статьи и за то, что все эти годы я мог бесплатно пользоваться этими программами.

Уес Миллер (Wes Miller) работает менеджером по развитию в компании Pluck (www.pluck.com) в Остине, штат Техас. Ранее Уэс Миллер работал в компании Winternals Software в г. Остине, а также в должности руководителя программы и менеджера по продуктам Windows в корпорации Майкрософт. Связаться с Уэсом Миллером можно по адресу technet@getwired.com.

© 2008 Корпорация Майкрософт и компания CMP Media, LLC. Все права защищены; полное или частичное воспроизведение без разрешения запрещено.