Использование альтернативных потоков данных (вилок) в Windows 7? - PullRequest
4 голосов
/ 11 февраля 2011

Существующий (основанный на Интернете) проект, над которым я работаю, использует данные клиента и сохраняет отчеты, используя имя клиента в качестве имени файла.К сожалению, он никогда не фильтровал это имя клиента, поэтому кто-то вводил имена клиентов, содержащие двоеточие (например, "workshop: alex") для целей тестирования.Это приводит к мастерской с именем файла: alex.pdf, которая вполне допустима в системах NTFS.(Поскольку он создает файл с именем «Мастерская», который содержит альтернативный поток данных с именем «alex.pdf». Поскольку приложение также сохраняло имена файлов, у него не было проблем с их повторным чтением, поскольку оно просто ссылалось на тот же ADS., никто не заметил эту проблему ...Однако недавно я начал работать над этим проектом, и его необходимо перенести на 64-разрядную версию Windows 7 с IIS 7. И вдруг сайт больше не работает с этими файлами ADS!Мне не потребовалось много времени, чтобы найти причину и понять, почему она никогда не подводила в прошлом.(и я также проклинал предыдущих разработчиков, которые никогда не проверяли это!) Но теперь мне интересно, почему это не работает в Windows 7 ... Так, кто-нибудь знает?У меня есть решение, кстати!Имя файла теперь отфильтровано, что решает проблему.Мне просто интересно, почему.Что может вызвать эти проблемы на более новых версиях Windows?О приложении: это смесь локальной установки IIS в сочетании с клиентским приложением WIN32.По сути, решение для создания отчетов было разработано как веб-приложение, и было создано настольное приложение, которое ранее использовало Word для создания отчетов.Некоторые менеджеры решили, что было бы неплохо, если бы настольное приложение вместо этого использовало логику веб-приложения для генерации отчетов.И я признаю: это была не очень яркая идея ...В результате у каждого пользователя в системе будет запущен IIS с веб-приложением, в то время как у него будет приложение для настольного компьютера на том же компьютере.Чтобы они общались, с помощью C # была создана отдельная веб-служба, в то время как веб-приложение было построено на классическом ASP, а настольное приложение на Delphi.Приложение Desktop отправит данные через локальный веб-сервис в базу данных, а затем войдет в локальное веб-приложение, чтобы сообщить ему о создании отчета, который затем будет загружен ...Где что-то идет не так в этом адском коде, не очень понятно.Но поскольку имя файла основано на данных из настольного приложения, которое иногда содержит двоеточие, оно иногда создает ADS вместо обычного имени файла.В версиях Windows до Windows 7 это, казалось, работало правильно.Файлы были записаны, и IIS также будет передавать их в настольное приложение в виде файлов PDF.(И оттуда вы можете «сохранить как», используя обычное имя файла.Это приложение работает только на Windows 7 (64-разрядная версия), поскольку оно может записывать файлы в поток ADS, когда к данным добавляется двоеточие, но при этом оно не может получить их снова.Хотя теперь мы отфильтровываем двоеточия по сгенерированным именам файлов, я просто хотел бы узнать возможные причины этой проблемы.Так что это вопрос из любопытства ...

Ответы [ 4 ]

2 голосов
/ 16 февраля 2011

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

  • Есть ли шанс, что вы сохраните файлы на томе FAT?
  • Может быть, антивирус запускает ADS и рассматривает его как атаку?

Тем не менее, мне сейчас очень интересно узнать об этой проблеме.Если вы получите ответ на этот вопрос, пожалуйста, поделитесь:)


edit: у вас может не быть времени, но вот что я бы сделал:

  1. Попробуйте запуститьIIS в качестве администратора и проверьте, есть ли у вас проблема
  2. Если да, то это может быть проблема IIS7 или проблема Scripting.FileSystem в Win 7
  3. Если нет, то вы теперь уверенычто это связано с безопасностью.Вернуть IIS не администратору
  4. Предоставить пользователю IIS полный контроль над выходной папкой (где вы создаете / читаете ADS)
  5. Обычно это должно работать.Тем не менее, проверьте это
  6. Удалите разрешения для папки один за другим и посмотрите, когда вы сможете воспроизвести вашу проблему снова.

Я думаю, возможно, будут разрешения "READ ATTRIBUTES" или "READ EXTENDED"АТРИБУТЫ "

Если вы все еще не получили ответа, почему бы не запустить Sysinternal Process Monitor, чтобы проверить, что на самом деле происходит.Их инструмент "Потоки" тоже может помочь.

1 голос
/ 16 февраля 2011

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

Я бы предложил загрузить инструменты technet sysinternals, чтобы проверить, действительно ли файлы имеют потоки ADS на новом сервере. http://technet.microsoft.com/en-us/sysinternals/bb545046

0 голосов
/ 16 мая 2011

Я не уверен, относится ли это и к программированию (я так полагаю), но Windows 7 отфильтровывает двоеточия в имени файла при попытке доступа к ADS через командную строку, как вы говорили;если вы ставите кавычки вокруг вашего имени файла при попытке получить доступ к ADS, вы не должны столкнуться с этой проблемой.Использование кавычек вокруг имени файла также должно работать на старых ОС, поэтому вам не нужно беспокоиться о проблемах совместимости между клиентами.

CMD Пример: c:> start "Textfile.txt: cmd.exe"

Я предполагаю, что причина этого не только из-за причины, которую вы указали, но также из-за чего-то похожего на проблему с регулярными выражениями / подстановочными символами, которая вызвала у меня такие трудности при использовании командных строк Linux (*или же .*).Возможно, что-то было добавлено в командную строку, которая использует двоеточие в имени файла или синтаксисе, что потребовало от пользователей различать ADS и эту добавленную командную функцию, экранируя последовательность с кавычками.

0 голосов
/ 18 февраля 2011

Вы случайно не читаете имя workshop.pdf:alex.pdf вместо workshop:alex.pdf? Я не знаю, как работает ваша программа, но пытается ли она автоматически добавить расширение, и поэтому не может найти файл (так как он не существует)?

...