С тех пор существует так много беспорядка о функциональности стандартных сервисных учетных записей, я попытаюсь дать быстрый шанс вниз.
Сначала фактические учетные записи:
учетная запись LocalService (предпочла)
, А ограничил сервисную учетную запись, которая очень похожа на Сетевую службу и предназначенная для выполнения стандарта наименее привилегированные сервисы. Однако в отличие от Сетевой службы это получает доступ к сети как Анонимный пользователь.
NT AUTHORITY\LocalService
HKEY_USERS\S-1-5-19
) HKEY_USERS
NetworkService Ограниченная сервисная учетная запись, которая предназначена для выполнения стандарта, дала сервисам полномочия. Эта учетная запись намного более ограничена, чем Локальная Система (или даже Администратор), но все еще имеет право получить доступ к сети как к машине (см. протест выше).
NT AUTHORITY\NetworkService
MANGO$
) к удаленным серверам HKEY_USERS\S-1-5-20
) NETWORK SERVICE
в Избранное диалоговое окно Пользователя или Группы
учетная запись LocalSystem (опасный, не используйте!)
Полностью доверял учетной записи, больше, чем учетная запись администратора. Нет ничего на единственном поле, которое не может сделать эта учетная запись, и она имеет право получить доступ к сети как к машине (это требует Active Directory и предоставления разрешения учетной записи машины к чему-то)
.\LocalSystem
(может также использовать LocalSystem
или ComputerName\LocalSystem
) 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$
машины:
пробовали ли вы перенаправить вывод в файл (java ...> c: \ output.txt)? таким образом вы можете дважды проверить, все ли идет в stdout и, возможно, вас просто съест psexec
Хорошо, я ' Я думал об этом на выходных, и, поскольку вы перепрыгиваете с машины на машину, мне интересно, может быть, есть проблема с CharSet? Может быть, он съедает строку в первый раз и имеет дело с другой проблемой кодовой страницы или набора символов? В Java обычно используются 16-битные символы, а в современных Windows - 8-битные с кодовыми страницами или utf-8.
Есть ли вероятность, что локальные и удаленные машины имеют разные наборы символов по умолчанию? Если вы отправляете локализованные данные по сети, они могут работать некорректно.
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...
Может быть, вы могли бы попробовать передать копию ввода вашим слушателям:
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);
}
У меня были аналогичные проблемы со слушателями, когда переданная переменная заканчивалась пустой, если я не передал ее явную копию.
У меня не обязательно есть ответ, но некоторые комментарии могут оказаться полезными.
При запуске psexec я вижу, что он порождает дочернее окно для выполнения работы, но не возвращает вывод этой программы в окно консоли. Я бы посоветовал использовать WMI или какую-либо форму API-интерфейса процессов Windows, чтобы получить уровень контроля, которого вам не хватает с помощью psexec. Несомненно, у java есть эквивалент .Net классу System.Diagnotics.Process.
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".)
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())"
Как вы выполняете 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
?