PsExec и недопустимые дескрипторы

Я пытаюсь использовать пакетный файл Windows, который использует PsExec для выполнения команд на удаленной машине. Периодически он имеет "недопустимый дескриптор", и сценарий затем терпит неудачу.

сценарий не изменился или действительно ни одна машина.

кто-нибудь знает, почему это происходит, так как иногда скрипты работают без заминки.

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

PS иногда первый PsExec работает, а остальные терпят неудачу.

редактировать

скрипт находится только на линии (помимо установки соответствующих переменных)

 PsExec %HOSTNAME% -I -u %USERNAME% -p %PASSWORD% CMD /C RMDIR /S /Q e:SomeDir

это иногда работает, но иногда выдает "недопустимый дескриптор"

3 ответов


вам нужно отладить ситуацию.

у вас есть сценарий, затем что-то (что такое Дженкинс?) запустить его на удаленном ПК, иногда это работает, иногда это не.

это детерминировано?
Когда это удастся, это всегда плохо?
Как это не получится?

вам нужно получить лучшие знания о том, как/когда сценарий терпит неудачу.

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

можете ли вы запустить сценарий несколько раз?
Из комментариев кажется, что вы запускаете скрипт каждый час, можете ли вы запустить его 3/4/5 раз подряд, за каждый час?
Это поможет вам определить, как он терпит неудачу: если вы запустите его 5 раз, он работает каждый раз? это плохо, это не 5 раз подряд?

можно попробовать использовать другой скрипт?
Вы можете создать еще несколько похожих, но более простых, файлы сценариев.
Таким образом, вы можете попробовать свой скрипт с помощью RMDIR, затем другой скрипт с простой командой DIR (просто чтобы увидеть, работает ли механизм запуска/подключения скрипта), затем другой скрипт с простой командой ECHO (поэтому ему не нужно обращаться к любым файлам/папкам)

запуск сценариев отладки на локальном ПК
Затем вы можете одновременно запускать другие сценарии, которые выполняются на локальном ПК (не удаленном, где вам нужно выполнить RMDIR), которые пытаются получить доступ к удаленный ПК, с помощью PING или путем копирования файла из / в сетевой ресурс...

нюхать сети
Вы даже можете настроить экземпляр Wireshark, который регистрирует весь пакет, отправленный между ПК 2, это может быть полезно для анализа/исключения сетевой проблемы.

вам явно нужно отслеживать / регистрировать все.

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

=====================================

UPDATE 1-Запишите некоторый журнал

=====================================

возможно, вы можете попробовать использовать следующие измененные скрипты, чтобы иметь некоторые файлы журнала. Этот скрипт создаст 2 файла журнала, один на удаленном ПК (содержащий сообщение удаленно выполняемой команды) и один на локальном ПК (содержащий любое сообщение от PsExec)

(вам потребуется tweak путь, где файл журнала сохраняются)

psexec %HOSTNAME% -I -u %USERNAME% -p %PASSWORD% CMD /C "RMDIR /S /Q e:\SomeDir >>c:\RemoteComputer.log 2>&1" >>c:\LocalComputer.log 2>&1

или следующий без /I
Вы уверены, что вам нужны параметры /I для CMD? На моем ПК это не работает, если я использую параметры /I...

psexec %HOSTNAME% -u %USERNAME% -p %PASSWORD% CMD /C "RMDIR /S /Q e:\SomeDir >>c:\RemoteComputer.log 2>&1" >>c:\LocalComputer.log 2>&1

после некоторого тестирования на моих ПК я видел, что PsExec устанавливает службу на удаленном ПК для удаленного запуска команды. (Это называется PsExecSvc.exe, установленный в c:\windows\ на ПК WinXP, который я использую для этого теста)
Дистанционное управление установка / удаление этой временной службы для выполнения команды, безусловно, может быть одной из возможных "точек сбоя", которые генерируют ошибку.
Если это так, то вы должны быть в состоянии отследить, взглянув на локальный компьютер.журнал, который будет содержать сообщение / ошибку от PsExec.

как указано в моем предыдущем совете, я бы также попытался запланировать более простой скрипт как

psexec %HOSTNAME% -u %USERNAME% -p %PASSWORD% CMD /C "dir c:\ >>c:\RemoteComputerDir.log 2>&1" >>c:\LocalComputerDir.log 2>&1

и

psexec %HOSTNAME% -u %USERNAME% -p %PASSWORD% CMD /C "echo SuperEchoTest >>c:\RemoteComputerEcho.log 2>&1" >>c:\LocalComputerEcho.log 2>&1

===================================

обновление 2-Попробуйте использовать WMI

===================================

вы можете попробовать запустить удаленную команду с помощью WMI

wmic /node:%HOSTNAME% /user:%USERNAME% /password:%PASSWORD% process call create "CMD /C RMDIR /S /Q e:\SomeDir"

при использовании WMI вы должны быть уверены, что брандмауэр windows не блокирует вашу команду. (когда я попытался запустить удаленную команду с WMIC, уведомление брандмауэра windows появилось на моем Win 7 PC)
(У меня есть инструкция по использованию WMIC здесь)


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

test-connection -computername server01, server02, server12

pings от локального компьютера до нескольких удаленных компьютеров.

еще одна очень полезная команда-это:

invoke-command -filepath c:\scripts\test.ps1 -computerName Server01

запускает тест.сценарий ps1 на компьютере Server01.

A учебник дает несколько примеров того, как выполните команды PowerShell на удаленном Компьютеры.


можно найти другую технологию, имитирующую мир Linux и использующую ssh. Это очень распространено в кластерах, и я лично использовал его с Windows Server 2008 R2, поэтому я не ожидаю никакой разницы в windows 7.

эта задача обычно выполняется с SSH и аутентификацией открытого ключа без пароля. При этом единственной необходимой информацией является IP удаленного сервера и открытый ключ клиента, хранящийся на сервере: только клиент с к нему может подключаться соответствующий закрытый ключ (ключи должны быть созданы с помощью ssh-keygen, на клиенте. Публичный ключ копируется на сервер)

сервер должен иметь TCP-порт 22, доступный извне, если есть брандмауэры, NATs,...

в моем случае я использовал ssh-сервер, включенный в Windows SUA, но я предлагаю вам забыть их (они устарели и довольно громоздкие на самом деле) и попробовать OpenSSH cygwin сервер, sshd-даже если официально не Microsoft, есть большое сообщество, поддерживающее его, по крайней мере, - и иногда я использовал его надежно.

команда ssh клиента включена в SUA, в cygwin, или вы можете использовать шпаклевка если вы хотите легкое решение на клиенте (не то, что cygwin тяжелый - просто бремя наличия своего рода эмуляции linux, которая не нужна)

давая поиск, например, я нашел этот пост, пояснив, хорошо необходимый шаг.