Неверная функция, нет доступа к диску

Обновлено: 21.11.2024

Я успешно опубликовал свое функциональное приложение в Функциях Azure. Я изменил свойство AuthorizationLevel и снова попытался выполнить развертывание с помощью следующей команды:

Сбой развертывания со следующим выводом:

c.b__43_1(Поток потока, IAsyncResult asyncResult)\r\n в System.Threading.Tasks.TaskFactory`1.FromAsyncTrimPromise`1.Complete(TInstance thisRef, Func`3 endMethod, IAsyncResult asyncResult, логическое значение требует синхронизации)\r \n--- Конец трассировки стека из предыдущего места, где возникло исключение ---\r\n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача Task)\r\n в System.Runtime.CompilerServices.TaskAwaiter. HandleNonSuccessAndDebuggerNotification(Task task)\r\n в System.Web.Http.WebHost.SeekableBufferedRequestStream.d__0.MoveNext()\r\n --- Конец трассировки стека из предыдущего места, где было выдано исключение ---\r\n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача задачи)\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи)\r\n в Kudu.Services.ByteRanges.HttpRequestMessageExtensions.d__1.MoveNext() в C:\\Kudu Files\\Private\\src\\master\\Kudu.Services\\ByteRanges\\HttpRequestMessageExtensio ns.cs:line 55\r\n --- Конец трассировки стека из предыдущего места, где было выдано исключение ---\r\n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи)\r\n в Kudu.Services.Deployment.PushDeploymentController.d__19.MoveNext() в C:\\Kudu Files\\Private\\src\\master\\Kudu .Services\\Deployment\\PushDeploymentController.cs:строка 446\r\n --- Конец трассировки стека из предыдущего места, где было выдано исключение ---\r\n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task задача)\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи)\r\n в System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(задача задачи)\r\n в Kudu.Services.Deployment.PushDeploymentController .d__12.MoveNext() в C:\\Kudu Files\\Private\\src\\master\\Kudu.Services\\Deployment\\PushDeploymentController.cs:строка 203\r\n --- Конец трассировки стека fr в предыдущем местоположении, где было выдано исключение ---\r\n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача задачи)\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи)\r\n в Kudu.Services.Deployment.PushDeploymentController.d__8.MoveNext() в C:\\Kudu Files\\Private\\src\\master\\Kudu.Services\\Deployment\\PushDeploymentController.cs:строка 95\r\n --- Конец трассировки стека из предыдущего места, где возникло исключение ---\r\n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача задачи)\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification( Task task)\r\n в System.Threading.Tasks.TaskHelpersExtensions.d__3`1.MoveNext()\r\n --- Конец трассировки стека из предыдущего места, где было выдано исключение ---\r\n в System .Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача задачи)\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Tas k task)\r\n в System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()\r\n --- Конец трассировки стека из предыдущего места, где было выдано исключение ---\r\n в System .Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача задачи)\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи)\r\n в System.Web.Http.Filters.ActionFilterAttribute.d__5.MoveNext() \r\n--- Конец трассировки стека из предыдущего места, где было выдано исключение ---\r\n в System.Web.Http.Filters.ActionFilterAttribute.d__5.MoveNext()\r\n--- Конец трассировка стека из предыдущего места, где возникло исключение ---\r\n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача)\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача)\r \n в System.Web.Http.Filters.ActionFilterAttribute.d__0.MoveNext()\r\n--- Конец трассировки стека из предыдущего места, где возникло исключение ---\r\n в System.Runtime .CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача)\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача)\r\n в System.Web.Http.Filters.ActionFilterAttribute.d__5.MoveNext()\r \n--- Конец трассировки стека из предыдущего места, где было выдано исключение ---\r\n в System.Web.Http.Filters.ActionFilterAttribute.d__5.MoveNext()\r\n--- Конец трассировки стека из предыдущего места, где было выдано исключение ---\r\n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача задачи)\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи)\r\n в System.Web.Http.Filters.ActionFilterAttribute.d__0.MoveNext()\r\n --- Конец трассировки стека из предыдущего места, где было выдано исключение ---\r\n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n в System.Runtime .CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n в System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext()\r\n --- Конец трассировки стека из предыдущего места, где было выдано исключение -- -\r\n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача задачи)\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи)\r\n в System.Web.Http.Controllers. ExceptionFilterResult.d__0.MoveNext()\r\n --- Конец трассировки стека из предыдущего места, где было выдано исключение ---\r\n в System.Web.Http.Controllers.ExceptionFilterResult.d__0.MoveNext()\r \n--- Конец трассировки стека из предыдущего места, где было выдано исключение ---\r\n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи)\r\n в System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()">">

Эта функция включена в план потребления, и, насколько я понимаю, у меня есть 5 ТБ доступного хранилища, поэтому 373 МБ не должны вызывать ошибку нехватки места.

Попытка развернуть ZIP-файл вручную также не удалась:

Я думаю, это как-то связано с размером развертывания. Моя папка публикации содержит папку с двоичными активами объемом около 1 ГБ. Если я удалю папку, уменьшив размер папки публикации примерно до 2 МБ, функция будет опубликована без каких-либо проблем.

Microsoft Windows [Версия 10.0.14393]
(c) Корпорация Microsoft, 2016 г. Все права защищены.

Microsoft DiskPart версии 10.0.14393.0

Авторское право (C) Корпорация Microsoft, 1999–2013 гг.
На компьютере: ИТ-АЛДАНА

DISKPART> список дисков

DISKPART> сетевой диск

Ни один диск не выбран для подключения к сети.
Выберите диск и повторите попытку.

Переводит выбранный автономный диск в онлайн-состояние.

Синтаксис: ONLINE DISK [NOERR]

NOERR Только для сценариев. При возникновении ошибки DiskPart
продолжает обрабатывать команды, как если бы ошибки не было.
Без параметра NOERR ошибка приводит к выходу DiskPart
с кодом ошибки.

Эта команда работает с одним диском. Чтобы
эта операция прошла успешно, необходимо выбрать диск.

Эта команда работает с диском, который находится в автономном режиме SAN.

Если диск динамический, он доступен только для чтения и находится в автономном режиме, а
желаемое состояние — чтение\запись и онлайн, рекомендуемый порядок
операций заключается в том, чтобы сначала сделать диск доступным для чтения\. записать, а затем перевести
диск в оперативный режим. Если динамический диск только для чтения подключен к сети, его
статус будет "Ошибки". Причина этого в том, что когда динамический
диск подключается к сети, диспетчер томов должен выполнить запись в базу данных динамических
дисков на диске, чтобы обновить его состояние. Эти записи будут
неудачны, если динамический диск доступен только для чтения.

DISKPART> сетевой диск

Ни один диск не выбран для подключения к сети.
Выберите диск и повторите попытку.

Переводит выбранный автономный диск в онлайн-состояние.

Синтаксис: ONLINE DISK [NOERR]

NOERR Только для сценариев. При возникновении ошибки DiskPart
продолжает обрабатывать команды, как если бы ошибки не было.
Без параметра NOERR ошибка приводит к выходу DiskPart
с кодом ошибки.

Эта команда работает с одним диском. Чтобы
эта операция прошла успешно, необходимо выбрать диск.

Эта команда работает с диском, который находится в автономном режиме SAN.

Если диск динамический, он доступен только для чтения и находится в автономном режиме, а
желаемое состояние — чтение\запись и онлайн, рекомендуемый порядок
операций заключается в том, чтобы сначала сделать диск доступным для чтения\. записать, а затем перевести
диск в оперативный режим. Если динамический диск только для чтения подключен к сети, его
статус будет "Ошибки". Причина этого в том, что когда динамический
диск подключается к сети, диспетчер томов должен выполнить запись в базу данных динамических
дисков на диске, чтобы обновить его состояние. Эти записи будут
неудачны, если динамический диск доступен только для чтения.

DISKPART> сетевой диск

Ни один диск не выбран для подключения к сети.
Выберите диск и повторите попытку.

Переводит выбранный автономный диск в онлайн-состояние.

Синтаксис: ONLINE DISK [NOERR]

NOERR Только для сценариев. При возникновении ошибки DiskPart
продолжает обрабатывать команды, как если бы ошибки не было.
Без параметра NOERR ошибка приводит к выходу DiskPart
с кодом ошибки.

Эта команда работает с одним диском. Чтобы
эта операция прошла успешно, необходимо выбрать диск.

Эта команда работает с диском, который находится в автономном режиме SAN.

Если диск динамический, он доступен только для чтения и находится в автономном режиме, а
желаемое состояние — чтение\запись и онлайн, рекомендуемый порядок
операций заключается в том, чтобы сначала сделать диск доступным для чтения\. записать, а затем перевести
диск в оперативный режим. Если динамический диск только для чтения подключен к сети, его
статус будет "Ошибки". Причина этого в том, что когда динамический
диск подключается к сети, диспетчер томов должен выполнить запись в базу данных динамических
дисков на диске, чтобы обновить его состояние. Эти записи будут
неудачны, если динамический диск доступен только для чтения.

DISKPART> сетевой диск

Ни один диск не выбран для подключения к сети.
Выберите диск и повторите попытку.

Переводит выбранный автономный диск в онлайн-состояние.

Синтаксис: ONLINE DISK [NOERR]

NOERR Только для сценариев. При возникновении ошибки DiskPart
продолжает обрабатывать команды, как если бы ошибки не было.
Без параметра NOERR ошибка приводит к выходу DiskPart
с кодом ошибки.

Эта команда работает с одним диском. Чтобы
эта операция прошла успешно, необходимо выбрать диск.

Эта команда работает с диском, который находится в автономном режиме SAN.

Если диск динамический, он доступен только для чтения и находится в автономном режиме, а
желаемое состояние — чтение\запись и онлайн, рекомендуемый порядок
операций заключается в том, чтобы сначала сделать диск доступным для чтения\. записать, а затем перевести
диск в оперативный режим. Если динамический диск только для чтения подключен к сети, его
статус будет "Ошибки". Причина этого в том, что когда динамический
диск подключается к сети, диспетчер томов должен выполнить запись в базу данных динамических
дисков на диске, чтобы обновить его состояние. Эти записи будут
неудачны, если динамический диск доступен только для чтения.

DISKPART> ОНЛАЙН-ДИСК

Ни один диск не выбран для подключения к сети.
Выберите диск и повторите попытку.

Переводит выбранный автономный диск в онлайн-состояние.

Синтаксис: ONLINE DISK [NOERR]

NOERR Только для сценариев. При возникновении ошибки DiskPart
продолжает обрабатывать команды, как если бы ошибки не было.
Без параметра NOERR ошибка приводит к выходу DiskPart
с кодом ошибки.

Эта команда работает с одним диском. Чтобы
эта операция прошла успешно, необходимо выбрать диск.

Эта команда работает с диском, который находится в автономном режиме SAN.

Если диск динамический, он доступен только для чтения и находится в автономном режиме, а
желаемое состояние — чтение\запись и онлайн, рекомендуемый порядок
операций заключается в том, чтобы сначала сделать диск доступным для чтения\. записать, а затем перевести
диск в оперативный режим. Если динамический диск только для чтения подключен к сети, его
статус будет "Ошибки". Причина этого в том, что когда динамический
диск подключается к сети, диспетчер томов должен выполнить запись в базу данных динамических
дисков на диске, чтобы обновить его состояние. Эти записи будут
неудачны, если динамический диск доступен только для чтения.

DISKPART> ДЕТАЛЬ ДИСК

Диск для просмотра сведений не выбран.
Выберите диск и повторите попытку.

Отображает свойства выбранного диска и список томов на
диске.

Синтаксис: DETAIL DISK

Для успешного выполнения этой операции необходимо выбрать диск.

DISKPART> ДЕТАЛЬ ДИСК 1

Диск для просмотра сведений не выбран.
Выберите диск и повторите попытку.

Отображает свойства выбранного диска и список томов на
диске.

Синтаксис: DETAIL DISK

Для успешного выполнения этой операции необходимо выбрать диск.

DISKPART> ВЫБЕРИТЕ ДИСК 1

Диск 1 теперь является выбранным диском.

DISKPART> ОНЛАЙН-ДИСК

Ошибка службы виртуальных дисков:
Этот диск уже подключен к сети.


DISKPART> ВЫБЕРИТЕ ДИСК 0

Диск 0 теперь является выбранным диском.

DISKPART> ОНЛАЙН-ДИСК

Ошибка службы виртуальных дисков:
Этот диск уже подключен к сети.


DISKPART> СПИСОК ДИСКОВ

DISKPART> СПИСОК ДИСКОВ

DISKPART> СПИСОК ДИСКОВ

DISKPART> ВЫБЕРИТЕ ДИСК 1

Диск 1 теперь является выбранным диском.

DISKPART> ДЕТАЛЬ ДИСК

Внешнее USB-устройство TOSHIBA 3.0 USB
Идентификатор диска: 00000000
Тип: USB
Статус: Онлайн
Путь: 0
Цель: 0
LUN ID : 0
Путь расположения : НЕДОСТУПНО
Текущее состояние только для чтения : Нет
Только для чтения : Нет
Загрузочный диск : Нет
Диск файла подкачки : Нет
Диск файлов гибернации: нет
Диск аварийного дампа: нет
Кластеризованный диск: нет

Томов нет.

ST500LT0 12-1DG142 USB-устройство
Идентификатор диска: 00000000
Тип: USB
Статус: Онлайн
Путь: 0
Цель: 0
LUN ID: 0
Путь расположения: НЕДОСТУПНО
Текущее состояние только для чтения: Да
Только для чтения: Да
Загрузочный диск: Нет
Диск файла подкачки: Нет
Диск файлов гибернации: нет
Диск аварийного дампа: нет
Кластеризованный диск: нет

Здравствуйте, ребята, у меня такая же проблема, я использую diskpart и вижу результат ниже. Спасибо за помощь!

Microsoft DiskPart версии 10.0.10240

Авторское право (C) Корпорация Microsoft, 1999–2013 гг.
На компьютере: DESKTOP-1B8M0VO

DISKPART> выберите диск 5

Диск 5 теперь является выбранным диском.

DISKPART> детальный диск

Ошибка службы виртуальных дисков:
Системная информация об объекте может быть устаревшей.


DiskPart ссылается на устаревший объект.
Обновите объект с помощью команды RESCAN.
Если проблема не устранена, выйдите из DiskPart, затем перезапустите DiskPart или перезагрузите
компьютер.

DISKPART> список дисков

Microsoft DiskPart версии 10.0.10240

ACTIVE — пометить выбранный раздел как активный.
ADD — добавление зеркала к простому тому.
НАЗНАЧИТЬ — назначить букву диска или точку подключения для выбранного тома.
АТРИБУТЫ. Управление атрибутами тома или диска.
ATTACH — прикрепляет файл виртуального диска.
AUTOMOUNT — включение и выключение автоматического монтирования базовых томов.
BREAK - Разбить набор зеркал.
CLEAN — удалить информацию о конфигурации или всю информацию с
диска.
COMPACT - Попытки уменьшить физический размер файла.
CONVERT - Преобразование между различными форматами дисков.
СОЗДАТЬ — создать том, раздел или виртуальный диск.
УДАЛИТЬ - Удалить объект.
DETAIL — Предоставьте подробную информацию об объекте.
DETACH — отсоединяет файл виртуального диска.
ВЫХОД — выход из DiskPart.
EXTEND — расширение тома.
EXPAND — увеличивает максимальный размер виртуального диска.
FILESYSTEMS — отображение текущих и поддерживаемых файловых систем на томе.
ФОРМАТ - форматирование тома или раздела.
GPT — назначение атрибутов выбранному разделу GPT.
ПОМОЩЬ - Показать список команд.
ИМПОРТ — Импорт группы дисков.
НЕАКТИВНЫЙ — пометить выбранный раздел как неактивный.
СПИСОК - Показать список объектов.
MERGE — объединяет дочерний диск с родительским.
ONLINE — в сети объект, который в данный момент помечен как не в сети.
OFFLINE — автономный объект, который в данный момент помечен как онлайн.
ВОССТАНОВЛЕНИЕ - Обновляет состояние всех дисков в выбранном пакете.
Попытка восстановить диски из недопустимого пакета и
повторно синхронизирует зеркальные тома и тома RAID5,
которые содержат устаревшие данные plex или четности.
REM - Ничего не делает. Используется для комментирования скриптов.
REMOVE — удалить букву диска или назначенную точку монтирования.
ВОССТАНОВЛЕНИЕ — восстановление тома RAID-5 с неисправным элементом.
ПОВТОРНОЕ СКАНИРОВАНИЕ. Повторное сканирование компьютера в поисках дисков и томов.
RETAIN — поместите сохраненный раздел в простой том.
SAN — отображение или установка политики SAN для текущей загруженной ОС.
ВЫБРАТЬ — переместить фокус на объект.
SETID — изменение типа раздела.
SHRINK — уменьшение размера выбранного тома.
UNIQUEID — отображает или задает идентификатор таблицы разделов GUID (GPT) или подпись
основной загрузочной записи (MBR) диска.

Если вы обнаружите, что diskpart обнаружил ошибку неправильной функции, вы можете обратиться к этой статье и найти решения здесь.

Автор: Dervish / Последнее обновление: 9 марта 2022 г.

Сценарий

«У меня есть жесткий диск, и я пытаюсь его отформатировать и использовать в качестве внешнего диска для передачи данных между двумя ПК. Когда я подключил его к корпусу USB-накопителя, компьютер распознал его, но к нему не было доступа. Я зашел в Управление дисками и попытался отформатировать его, я получил «неправильную функцию». Затем я попытался зайти в админку CMD. Сначала все шло хорошо, но когда я запустил команду очистить или очистить все, возникла ошибка: DiskPart обнаружил ошибку: неверная функция. Дополнительные сведения см. в журнале системных событий. Я не знаю, в чем проблема, может ли кто-нибудь помочь мне с этим? Спасибо!»

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

Как исправить DiskPart обнаружил ошибку неправильной функции?

Чтобы исправить эту ошибку, попробуйте описанные ниже методы.

Повторно просканировать диск

Когда вы сталкиваетесь с этой проблемой, она может быть связана с драйвером Virtio SCSI, который требует повторного сканирования для отображения изменений. Согласно отзывам некоторых пользователей, вы можете исправить это, выполнив повторное сканирование диска из командной строки. Чтобы запустить повторное сканирование диска, выполните следующие действия.

<р>1. Откройте командную строку под администратором.

<р>2. Введите diskpart и нажмите Enter.

<р>3. В командной строке Diskpart введите: rescan и нажмите Enter.

Переустановите драйвер

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

<р>1.Нажмите кнопку «Пуск», введите диспетчер устройств в поле поиска и нажмите Enter.

<р>2. Выберите Диспетчер устройств, разверните категории, чтобы найти имя вашего жесткого диска. Щелкните устройство правой кнопкой мыши и выберите «Удалить», затем перезагрузите компьютер. Windows автоматически переустановит драйверы на жестком диске.

Снять защиту от записи

Есть некоторая возможность столкнуться с этой проблемой, когда ваш диск защищен от записи, вы можете снять защиту от записи и попробовать снова отформатировать диск.

Шаг 1. Откройте командную строку. Введите «diskpart», чтобы запустить утилиту.

Шаг 2. Введите "list disk", чтобы отобразить список доступных дисков в системе.

Шаг 3. Введите «выбрать диск n», где «n» обозначает номер диска вашего накопителя.

Шаг 4. Введите атрибут disk clear только для чтения. Этот шаг изменит свойства вашей SD-карты, чтобы она больше не была доступна только для чтения.

Исправить ошибку неправильной работы Diskpart другим способом

Если после применения всех упомянутых выше методов ошибка «DiskPart обнаружила ошибку, неверная функция» все еще существует, вы можете рассмотреть возможность использования альтернативы DiskPart для управления вашим диском. AOMEI Partition Assistant — это хороший альтернативный инструмент, предоставляющий все функции, которые содержит DiskPart.

Это бесплатный менеджер разделов, который может помочь вам отформатировать все типы дисков, включая SSD, внешний жесткий диск, USB-накопитель, SD-карту и т. д. Также вы можете легко отформатировать диск для защиты от записи. Это программное обеспечение предназначено для всех версий Windows 11/10/8/7. Давайте посмотрим, как решить, что Diskpart обнаружил ошибку неправильной функции с AOMEI Partition Assistant.

Шаг 1. Загрузите AOMEI Partition Assistant и запустите это программное обеспечение.

Шаг 2. Щелкните правой кнопкой мыши диск, который нужно отформатировать, и выберите «Форматировать раздел».

Шаг 3. Вы можете отформатировать диск в NTFS, FAT32, Ext4/3/2, exFAT, FAT32. Выберите одну из перечисленных файловых систем. Затем нажмите ОК.

Шаг 4. Просмотрите незавершенную операцию и нажмите «Применить и продолжить», чтобы выполнить ее.

Заключение

На самом деле, помимо ошибки «DiskPart обнаружил ошибку неправильной функции», вы также можете столкнуться с другими ошибками при использовании DiskPart, такими как «DiskPart обнаружил ошибку, носитель защищен от записи», «DiskPart обнаружил ошибку, доступ отказано» и т. д., вы можете решить все эти ошибки с помощью AOMEI Partition Assistant. Наконец, если вы хотите попробовать более полезные функции AOMEI Partition Assistant, включая восстановление и разделение разделов, вам следует обновить версию Standard до версии Professional.

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

Вы прекратили просмотр этой ветки и больше не будете получать электронные письма, когда в ней есть активность. Нажмите еще раз, чтобы начать просмотр.

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

Песочница включена. На самом деле файл прав выглядит так:

  1. Я создал архив приложения и попытался распространить его с помощью методов Идентификатор разработчика или Разработка
  2. Я поместил двоичный файл своего приложения в папку /Applications
  3. Я перешел в Системные настройки -> Безопасность и конфиденциальность -> Конфиденциальность -> Полный доступ к диску и добавил доступ к моему приложению в папке /Applications
  4. Конечно, я НЕ привязан к приложению с Xcode

Я тестирую его в Xcode 11 и на Catalina. Это фиктивное приложение, открывается

чтобы позволить пользователю выбирать архивы для распаковки и пытаться распаковать их в том же каталоге, используя структуру libarchive.

Есть подсказки? Я делаю что-то не так?

Принятый ответ

Спасибо за объяснение.

Песочница приложения поддерживает концепцию связанных файлов — см. раздел «Связанные элементы» Руководства по проектированию песочницы приложения, — но в данном случае это, вероятно, не поможет. Большинство утилит сжатия хотят иметь возможность:

Принять каталог и создать архив рядом с этим каталогом

Принять архив и создать каталог рядом с этим архивом

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

Есть три способа обойти это:

Отменить или радикально ослабить тестовую среду приложения

Предоставить пользователю панель сохранения для вывода

Вывод в каталог, выбранный пользователем из

Ни один из них не является идеальным, а первый возможен только в том случае, если вы распространяете приложение за пределами Mac App Store.

Поделись и наслаждайся

Куинн «Эскимос!»
Взаимоотношения с разработчиками Apple, техническая поддержка разработчиков, основная ОС/оборудование

Ответы

В песочнице приложения применяется другой набор ограничений, чем в полном доступе к диску. Я считаю, что ограничение, на которое вы нажимаете, применяется самой песочницей приложения. Вы писали:

открытие

, чтобы позволить пользователю выбирать архивы для распаковки и пытаться распаковать их в том же каталоге

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

Поделись и наслаждайся

Куинн «Эскимос!»
Взаимоотношения с разработчиками Apple, техническая поддержка разработчиков, основная ОС/оборудование

Давайте пока забудем о NSOpenPanel. Это был просто пример. Мое приложение могло работать с другими файлами, а не только с теми, которые выбрал пользователь.

Позвольте мне перефразировать вопрос:

Что необходимо сделать, чтобы приложение в песочнице использовало полный доступ к диску?

Что необходимо сделать, чтобы приложение в песочнице использовало полный доступ к диску?

Это зависит от того, что вы подразумеваете под «полным доступом к диску»? Давайте разберем это:

Может ли изолированное приложение получить доступ ко всем файлам в файловой системе? — Нет. Песочница предотвращает повышение привилегий, и у многих файлов есть привилегии, которые запрещают доступ изолированному приложению.

Может ли изолированное приложение получить доступ ко всем файлам в домашнем каталоге пользователя? — Нет. Притаился

В версии 10.15 и более поздних для некоторых распространенных мест, таких как рабочий стол, требуется доступ к файлам и папкам (см. «Системные настройки» > «Безопасность и конфиденциальность» > «Конфиденциальность» > «Файлы и папки»).

В версии 10.14 и более поздних версиях для некоторых малоизвестных мест, таких как почтовая база данных, требуется полный доступ к диску (см. «Системные настройки» > «Безопасность и конфиденциальность» > «Конфиденциальность» > «Полный доступ к диску»).

Последнее включает в себя первое.

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

Что, если они у меня есть? — Если ваше приложение находится в песочнице, вам все равно нужно расширение для песочницы для доступа к элементам в домашнем каталоге пользователя, которые находятся за пределами контейнера вашего приложения, а это означает взаимодействие с открытой панелью (или перетаскивание, или какой-либо другой механизм расширения песочницы). ).

Я понимаю, что это все очень общее. Если вы сможете подробнее рассказать о своем конкретном сценарии, я смогу дать более конкретный совет.

Поделись и наслаждайся

Куинн «Эскимос!»
Взаимоотношения с разработчиками Apple, техническая поддержка разработчиков, основная ОС/оборудование

О, спасибо за ваше время!

Я новичок в разработке для macOS, большую часть времени занимаюсь кодированием приложений для iOS. Моя цель — узнать что-то новое и реализовать простое приложение для сжатия/распаковки, используя libarchive в качестве библиотеки для выполнения этой работы. Вот набор желаемых функций:

  • приложение может открывать и распаковывать связанные файлы
  • приложение может открывать и распаковывать перетаскиваемые файлы
  • приложение может открывать и распаковывать файлы с помощью NSOpenPanel
  • приложение можно открыть из расширения FinderSync или расширения Action
  • Конечно, приложение может создавать архивы из перетаскиваемых файлов или файлов, выбранных в NSOpenPanel.

Надеюсь, вам достаточно информации, если честно ничего особенного или секретного 🙂

Многих это сбивает с толку. В частности, это смущает конечных пользователей. Многие из них слышали о полном доступе к диску, поэтому попытаются предоставить его вашему приложению, но это не сработает из-за песочницы. Они не знают об этом. И если вы распространяете через Mac App Store, вы тоже не можете им об этом сказать. 🙂 Если вы планируете распространять Mac App Store, ваше приложение должно быть полностью функциональным без выхода из песочницы или полного доступа к диску. Вы даже не можете показать кнопку, если только пользователь не ищет ее намеренно.

Но вообще говоря, нужно выполнить два шага. Я называю это «Полный доступ к диску», чтобы различать его и потому, что дисков больше нет.

1) Вам нужно будет использовать NSOpenPanel, чтобы получить ссылку на корневую папку диска. Вы можете указать корневую папку и принудительно переместить диалоговое окно в нужное место. И тогда вы сможете проверить результат и убедиться, что вы действительно получили root обратно. Сохраните это как закладку с областью безопасности, и теперь вы сбежали из песочницы. Но это еще не все.

2) В Мохаве и более поздних версиях вам по-прежнему необходимо получить полный доступ к диску в системных настройках. Для этого вы можете использовать удобную глубокую ссылку (x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles), чтобы сделать процесс менее болезненным. Но вам все равно придется выйти из приложения.

Итак, вам придется запустить процесс внутри вашего приложения, чтобы получить обе части на 10.14+. Если вы используете версию 10.13, вам нужна только первая часть.

Еще одна сложность заключается в том, что база данных безопасности может запутаться. Возможно, вам придется несколько раз перезапустить приложение. Возможно, вам придется перезагрузить компьютер. К сожалению, машины, которые используют разработчики, могут сильно зашифровать эти внутренние базы данных. Я настоятельно рекомендую систему VM для разработки Mac. Их легко настроить и откатить. Они не годятся для графики. Если вам нужна приличная графика, вам придется использовать отдельную машину с широким использованием снимков APFS для отката.

Я использую Parallels Desktop Lite только потому, что у него нет расширений ядра хоста. (Я не могу рекомендовать этот продукт, не жалуясь на их маленькую грязную уловку, заключающуюся в использовании незначительного обновления App Store для платной подписки. Я бы заплатил за поддерживаемое и обновленное приложение Mac App Store, и есть установленные, честные способы сделать это. Это. Вместо этого они использовали хитрый и коварный метод. Я бы использовал другую виртуальную машину, если бы мог найти другую, которая не требует расширений ядра хоста.)

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

Для вашего приложения я предлагаю освоиться с NSTemporaryDirectory(). Это будет работать независимо. Затем освойтесь с панелями NSOpen/Save и закладками в области безопасности. Вы должны быть в состоянии выполнить то, что вы описываете, с минимальным количеством путаницы и хлопот для пользователя. Помните, что есть некоторые вещи, которые вы найдете ужасно утомительными, потому что вы так много тестируете приложение. Пользователи реже запускают ваше приложение, поэтому эти ежедневные неудобства не будут их сильно беспокоить. Большой барьер, такой как полный доступ к диску с выходом из песочницы, в первую очередь не позволит им стать клиентами.

Читайте также: