Альтернативы LogonUser для сетевого олицетворения (C++)

Используйте for..in цикл, чтобы перечислить свойства объекта, но быть осторожными. Перечисление возвратит свойства не только объекта, перечисляемого, но также и от прототипов любых родительских объектов.

var myObject = {foo: 'bar'};

for (var name in myObject) {
  alert(name);
}

// results in a single alert of 'foo'

Object.prototype.baz = 'quux';

for (var name in myObject) {
  alert(name);
}

// results in two alerts, one for 'foo' and one for 'baz'

Для предотвращения включая унаследованные свойства в перечислении проверьте hasOwnProperty():

for (var name in myObject) {
  if (myObject.hasOwnProperty(name)) {
    alert(name);
  }
}

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

не имеет значения, существует ли эта проблема на других языках; факт - он, существует, и JavaScript особенно уязвим, так как модификации к прототипу объекта влияют на дочерние объекты, даже если модификация происходит после инстанцирования.

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

8
задан galets 29 July 2009 в 20:53
поделиться

4 ответа

Если вы хотите «получить доступ к сетевым ресурсам» за пределами вашего леса, сделайте это с помощью WNetAddConnection2 / 3, как вы упомянули, или используйте стандартные API RPC с RPC_ C__ AUTHN__ GSS__ NEGOTIATE и явная структура учетных данных.

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

Но ключ заключается в следующем: олицетворение имеет смысл только для олицетворения учетной записи, к которой сервер может получить доступ в своем локальном каталоге SAM / domain / forest. Если клиент и сервер находятся в разных лесах, они явно не могут согласовать SID учетной записи для токена олицетворения (за исключением случая хорошо известных SID, таких как Administrator, которые служат в основном для запутывания такого рода вещей), и это кажется необходимым для проверки на соответствие DACL и т. д.

Возможно, вам нужно вызвать LogonUserEx с флагом LOGON32__ LOGON__ NEW__ CREDENTIALS. Это должно быть успешным (даже в другом лесу - он фактически не проверяет подлинность предоставленных вами учетных данных), предоставляя вам токен с указанным вами именем пользователя и паролем. Возможно, вам придется использовать DuplicateToken, чтобы превратить это в токен олицетворения. Затем вы можете использовать SetThreadToken для замены токена в вашем потоке.

IMHO, на самом деле это не «олицетворение», вы просто используете учетные данные напрямую, но это позволяет вам получить доступ к сетевым ресурсам прозрачно, как произвольное имя пользователя / пароль вы поставляете.

Edit: Ах да, имейте в виду, что в этом типе соединения нет защиты от человека посередине.

9
ответ дан 5 December 2019 в 13:00
поделиться

Сделать это напрямую и надежно через Windows API кажется почти невозможным, к тому же Windows делает так много «за кулисами», чтобы сетевой доступ «просто работал». К тому же, олицетворение вещей работает только для одного потока, который вызвал API.

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

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

Я понимаю, что это взлом, но он кажется жизнеспособным;)

0
ответ дан 5 December 2019 в 13:00
поделиться

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

net use m: \\machinename\share password /user:username
... do stuff ...
net use m: /delete

http://technet.microsoft.com/en-us/library/cc756153 (WS.10) .aspx

0
ответ дан 5 December 2019 в 13:00
поделиться
Другие вопросы по тегам:

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