PsExec и недействительные дескрипторы

106
10

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


script не изменился или вообще не был машиной.


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


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


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


ИЗМЕНИТЬ


script находится в режиме онлайн (кроме заданных переменных)


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

Это иногда работает, но иногда с ошибкой "недействительный дескриптор"

спросил(а) 2014-03-20T18:58:00+04:00 6 лет, 6 месяцев назад
1
Решение
79

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


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


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

Как это происходит?


Вам нужно получить более полное представление о том, как/при неудаче script.


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


Можете ли вы запустить script несколько раз?

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

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


Можно ли использовать разные script?

Вы можете создать несколько похожих, но более простых сценариев.

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


Запустить сценарии отладки на локальном ПК

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


Снимите сеть

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


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


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


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


ОБНОВЛЕНИЕ 1 - Запишите некоторый журнал

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


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

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


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, который я использую для этого теста)

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

Если это так, то вы должны иметь возможность отслеживать это, глядя на LocalComputer.log, который будет содержать сообщение/ошибку из PsExec.


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


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, на моем компьютере Win 7 появилось уведомление о брандмауэре Windows)


(У меня есть инструкция по использованию WMIC здесь)

ответил(а) 2014-04-04T12:44:00+04:00 6 лет, 5 месяцев назад
57

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


test-connection -computername server01, server02, server12

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


Еще одна очень полезная команда:

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

запускает Test.ps1 script на компьютере Server01.


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

ответил(а) 2014-04-05T00:09:00+04:00 6 лет, 5 месяцев назад
41

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


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


Сервер должен иметь доступ к порту TCP 22 снаружи, если есть брандмауэры, NAT,...


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


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


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

ответил(а) 2014-04-09T00:55:00+04:00 6 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема