Вывод программы проиграл при передаче через PsExec

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

Сначала фактические учетные записи:

  • учетная запись LocalService (предпочла)

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

    • Имя: NT AUTHORITY\LocalService
    • учетная запись не имеет никакого пароля (любая информация о пароле, которую Вы обеспечиваете, проигнорирован)
    • , HKCU представляет , учетная запись пользователя LocalService
    • имеет минимальный полномочия на локальном компьютере
    • подарки анонимный учетные данные в сети
    • SID: S-1-5-19
    • имеет свой собственный профиль под ключ реестра (HKEY_USERS\S-1-5-19)

    HKEY_USERS  

  • учетная запись

    NetworkService Ограниченная сервисная учетная запись, которая предназначена для выполнения стандарта, дала сервисам полномочия. Эта учетная запись намного более ограничена, чем Локальная Система (или даже Администратор), но все еще имеет право получить доступ к сети как к машине (см. протест выше).

    • NT AUTHORITY\NetworkService
    • учетная запись не имеет никакого пароля (любая информация о пароле, которую Вы обеспечиваете, проигнорирован)
    • , HKCU представляет , учетная запись пользователя NetworkService
    • имеет минимальный полномочия на локальном компьютере
    • подарки учетные данные компьютера (например, MANGO$) к удаленным серверам
    • SID: S-1-5-20
    • имеет свой собственный профиль под , ключ реестра (HKEY_USERS\S-1-5-20)
    • HKEY_USERS При попытке запланировать задачу с помощью него, входит NETWORK SERVICE в Избранное диалоговое окно Пользователя или Группы

     

  • учетная запись LocalSystem (опасный, не используйте!)

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

    • Имя: .\LocalSystem (может также использовать LocalSystem или ComputerName\LocalSystem)
    • учетная запись не имеет никакого пароля (любая информация о пароле, которую Вы обеспечиваете, проигнорирован)
    • SID: S-1-5-18
    • не имеет никакого собственного профиля (HKCU, представляет значение по умолчанию пользователь)
    • , имеет обширный полномочия на локальном компьютере
    • подарки учетные данные компьютера (например, MANGO$) к удаленным серверам

     

Выше при разговоре о доступе к сети, это относится только к [1 120], SPNEGO (Согласовывает), NTLM и Kerberos а не к любому другому механизму аутентификации. Например, обработка работающий как [1 111] может все еще получить доступ к Интернету.

общий вопрос с выполнением как стандарт из учетной записи поля - то, что при изменении каких-либо из полномочий по умолчанию, Вы разворачиваете набор вещей все работающее, как та учетная запись может сделать. Таким образом, если Вы предоставляете DBO базе данных, не только может Ваш сервис, работающий как Локальная служба или доступ Сетевой службы, что база данных, но все остальное работающее как те учетные записи может также. Если каждый разработчик сделает это, то компьютер будет иметь сервисную учетную запись, которая имеет полномочия сделать практически что-либо (более конкретно надмножество всех различных дополнительных полномочий, предоставленных той учетной записи).

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

В Вашем конкретном случае, проблема, которую Вы, вероятно, видите, - то, что активация DCOM или COM + ограничена данным набором учетных записей. В Windows XP SP2 Windows Server 2003, и выше разрешения Активации был значительно ограничен. Необходимо использовать MMC Component Services, привязывающийся, чтобы исследовать определенный COM-объект и видеть полномочия активации. Если Вы ни к чему не получаете доступ в сети как учетная запись машины, необходимо серьезно рассмотреть использование Локальная служба (не Локальная Система, которая является в основном операционной системой).

В Windows Server 2003 Вы не можете выполнять запланированную задачу как [1 173]

  • NT_AUTHORITY\LocalService (иначе учетная запись Локальной службы), или
  • NT AUTHORITY\NetworkService (иначе учетная запись Сетевой службы).

, Что возможность только была добавлена с Планировщиком Задачи 2.0 , который только существует в Windows Vista / Windows Server 2008 и более новый.

сервис А, работающий как [1 114] подарки учетные данные машины в сети. Это означает, что, если бы Ваш компьютер назвали mango, , он представил бы как учетную запись MANGO$ машины:

enter image description here

14
задан mwalling 14 August 2009 в 19:41
поделиться

9 ответов

пробовали ли вы перенаправить вывод в файл (java ...> c: \ output.txt)? таким образом вы можете дважды проверить, все ли идет в stdout и, возможно, вас просто съест psexec

4
ответ дан 1 December 2019 в 14:11
поделиться

Хорошо, я ' Я думал об этом на выходных, и, поскольку вы перепрыгиваете с машины на машину, мне интересно, может быть, есть проблема с CharSet? Может быть, он съедает строку в первый раз и имеет дело с другой проблемой кодовой страницы или набора символов? В Java обычно используются 16-битные символы, а в современных Windows - 8-битные с кодовыми страницами или utf-8.

Есть ли вероятность, что локальные и удаленные машины имеют разные наборы символов по умолчанию? Если вы отправляете локализованные данные по сети, они могут работать некорректно.

1
ответ дан 1 December 2019 в 14:11
поделиться

PsExec is eating the output. Next interesting thing might be where it's eating the output. You could check this by getting a copy of Wireshark and checking whether the output in question is traversing the network or not. If it's not, then it's being eaten on the remote side. If it is, it's being eaten locally.

Not that I'm really sure where to go from there, but collecting more information certainly seems like a good path to be following...

3
ответ дан 1 December 2019 в 14:11
поделиться

Может быть, вы могли бы попробовать передать копию ввода вашим слушателям:

 public void fireInputRecieved(String input) {

    if(input.equals("quit"))
    exit = true;

    String inputCopy = new String(input);
    System.out.println("Input string has made it to fireInputRecieved: "
        + input);



    for(int index = 0; index < listeners.size(); index++)
        listeners.get(index).inputRecieved(inputCopy);
}

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

1
ответ дан 1 December 2019 в 14:11
поделиться

У меня не обязательно есть ответ, но некоторые комментарии могут оказаться полезными.

  • Идея «передать копию» не должна иметь значения, поскольку в вашем выводе строка успешно печатается дважды перед ошибкой, а затем снова выполняется успешно.
  • автоматическая очистка также не имеет значения, как вы уже упоминали
  • Предложение Нико имеет некоторые достоинства в диагностических целях. В сочетании с предложением Марка это заставляет меня задаться вопросом, нет ли где-нибудь невидимых управляющих персонажей. Что, если вы напечатали байтовые значения символов в качестве диагностического шага?
  • Вы знаете , что это значение «Test» (по крайней мере, в выходных данных, которые вы нам предоставили). Что произойдет, если вы передадите «Test» непосредственно провалившемуся оператору printLn?
  • В подобных ситуациях вы хотите получить как можно больше информации. Вставляйте точки останова и анализируйте символы. Отправьте байты в файлы и откройте их в шестнадцатеричных редакторах. Делайте все возможное, чтобы отслеживать вещи как можно точнее и точнее.
  • Придумайте странные тестовые сценарии и попробуйте их, даже если они не могут помочь. Никогда не знаешь, какая хорошая идея могла бы возникнуть, анализируя результаты безнадежной идеи.
1
ответ дан 1 December 2019 в 14:11
поделиться

При запуске psexec я вижу, что он порождает дочернее окно для выполнения работы, но не возвращает вывод этой программы в окно консоли. Я бы посоветовал использовать WMI или какую-либо форму API-интерфейса процессов Windows, чтобы получить уровень контроля, которого вам не хватает с помощью psexec. Несомненно, у java есть эквивалент .Net классу System.Diagnotics.Process.

1
ответ дан 1 December 2019 в 14:11
поделиться

Is System.out not configured for autoflush? After the first print try System.out.flush() and see if the first line appears without more lines being printed.

(oh yeah, seriously, it is "RECEIVED", not "RECIEVED".)

1
ответ дан 1 December 2019 в 14:11
поделиться

I'd guess that there is a bogus byte in there prefacing the T. According to JavaDocs, an InputStreamReader will read one or more bytes, and decode them into characters.

You could have an escape sequence or spurious byte in there, masquerading as a multibyte character.

Quick check - see if "current" is ever > 128 or < 33.

What if you used a CharArrayReader to get individual bytes, without any charset translation?

The theory is that during the first attempt to output the String using println, it's sending an escape character of some sort, eating the rest of the string. During later prints, either Java or the network pipe are handling or removing it, since it previously got that escape sequence, perhaps changing the handling in some way.

As an unrelated nit, sb.toString() returns a new String, so it's unnecessary to call "new String(sb.toString())"

1
ответ дан 1 December 2019 в 14:11
поделиться

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

    System.out.println("Outputting it cleanly to standard out: ");
    System.out.println(input);
    System.out.println("Outputting it cleanly to standard out again: ");
    System.out.println(input);

на этот:

    System.out.println("Outputting it cleanly to standard out: ");
    System.out.print(' ');
    System.out.println(input);
    System.out.println("Outputting it cleanly to standard out again: ");
    System.out.println(input);

... таким образом, вывод будет (если я прав):

Outputting it cleanly to standard out:
 Test
Outputting it cleanly to standard out again:
Test
Finished example outputs of input: Test

В частности, заметно, что очевидно -suppressed line - это первая строка, состоящая исключительно из Test - это именно тот текст, который вы только что отправили в удаленную систему. Похоже, PsExec пытается подавить удаленную систему, которая повторяет свой ввод в дополнение к созданию собственного вывода.

Возможно, пароль пользователя на удаленной машине Test ? Вы используете PsExec? s -p параметр? Вы указываете -i ?

0
ответ дан 1 December 2019 в 14:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: