Как запросить, является ли определенная папка общей или перечислить папки с локальной машины на osx в C/C++ или Objective C

В настоящее время я работаю на MacOS High Sierra (не Windows), используя Qt. Просто используя обычный macOS, а не macOS сервер. Я рад написать код только для Mac вне пузыря Qt, чтобы решить эту проблему, очевидно.

Я ищу способ программно проверить в C/C++ или Objective-C, является ли конкретная локальная папка общей для локальной сети. В качестве альтернативы я хотел бы получить список всех общих папок. Мне бы хотелось, чтобы этот метод работал на достаточно большом диапазоне версий MacOS, например, с 10,9 до 10,14.

Мне нужно сделать это, чтобы переписать пути к локальным файлам как UNC-пути, чтобы они были доступны с клиентского компьютера Windows в той же сети через общий доступ к SMB с подходящими учетными данными. Предполагается, что общие папки уже настроены, но если их нет, пользователь получит сообщение об ошибке и предложит поделиться соответствующими папками.

Я могу поделиться / отменить общий доступ и просмотреть состояние общего доступа к папке с помощью диалогового окна "Получение информации" в Finder, но я ищу что-то, что можно использовать в приложении.

Вещи, которые я попробовал без успеха:

  • Поиск других случаев проблемы
  • NSURL класс - не документирует имя ресурса для запроса его статуса общего доступа.
  • Похоже, что smbutil не отображает список общих ресурсов с компьютера, на котором он запущен.
  • У smbd, похоже, нет параметров командной строки для запроса общих папок.
  • Различные файлы конфигурации, упомянутые в справочных страницах smbutil и smbd.conf, не содержат списка общих папок.
  • MDL не содержит соответствующих метаданных в выходных данных для общих папок.
  • ls -l @ не выводит никакой дополнительной информации для общих папок
  • Совместное использование папки с необычным именем и поиск на жестком диске имени папки, включая двоичные файлы, чтобы проверить, сохраняется ли эта информация где-либо. Предположительно это сохраняется каким-то образом, потому что папка открыта для общего доступа после перезагрузки, но я нигде не могу найти записи об имени папки.
  • Сервисы OpenDirectory, похоже, содержат много ссылок на SMB в заголовках, но я не вижу способа использовать OpenDirectory для получения списка общих папок с локального компьютера.
  • Совместное использование корневой папки, чтобы переписать было тривиально. Это работает, но довольно нежелательно делить корневую папку.
  • Возможно, есть лучший способ сделать доступ, который обойдёт необходимость иметь и запрашивать акции SMB...?

1 ответ

Нашел ответ в другом месте на stackexchange, на который ответил user53547.

Выполните следующую команду и запишите вывод.

совместное использование -l

Это дает немного подробный список общих файловых ресурсов с отдельными сведениями для afp и smb, который можно проанализировать, чтобы получить список общих папок на локальном компьютере. Проверено на Каталине. Возможно, эта команда не запустится, если общий доступ к файлам не включен в Системных настройках.

Другие вопросы по тегам