Возьмите диски онлайн / оффлайн - PullRequest
5 голосов
/ 23 сентября 2011

У меня есть программа, которая выполняет необработанный ввод-вывод на диски в Windows.

Все работает нормально, если целевой диск подключен.Однако в некоторых операционных системах Windows по умолчанию поведение состоит в том, что новые диски изначально отключены.

Мне трудно найти правильный API для этого в Windows.Эквивалент командной строки будет выглядеть примерно так:

"select disk 2", "online disk" | diskpart

Однако я должен быть в состоянии сделать это в коде.Я просматривал DeviceIoControl Win32 API (который я считаю правильным), но не могу определить, какой управляющий код использовать.Тот факт, что я не могу его найти, заставляет меня думать, что мне не хватает лучшего API для использования.

Ответы [ 4 ]

4 голосов
/ 24 сентября 2011

Для будущих поколений ответ (в Win 2k3 / Vista и более поздних версиях) - служба виртуальных дисков (VDS). Есть некоторая работа, чтобы собрать все это вместе, особенно если вы не используете COM-объекты в .NET так много.

Диск подключен / отключен от сети IVdsDrive :: SetStatus . По крайней мере, так должно быть; Я обнаружил, что могу решить свою проблему простым отключением статуса «только чтение» на моем диске. Я смог сделать это с IVdsDisk :: SetFlags с соответствующим значением флага.

2 голосов
/ 01 февраля 2013

Не уверен насчет C #, но я использую это в C ++: Попробуйте позвонить DeviceIoControl() с IOCTL_DISK_SET_DISK_ATTRIBUTES. Дескриптор файла должен иметь права на чтение и запись. Я думаю, что требуется как минимум Windows 7. Он не работает на Windows 2003 x64. Windows 8 успешно переводит диск в автономный режим, а затем вы можете перезаписать его из резервной копии.

BOOL disk_offline(HANDLE h_file, bool enable){
DWORD bytes_returned = 0;
BOOL b_offline = 0;
if(get_size_volume_disk(h_file)){
    SET_DISK_ATTRIBUTES disk_attr;
    ZeroMemory(&disk_attr, sizeof(disk_attr));
    disk_attr.Version = sizeof(SET_DISK_ATTRIBUTES);
    disk_attr.Attributes = enable? DISK_ATTRIBUTE_OFFLINE: 0;
    disk_attr.AttributesMask = DISK_ATTRIBUTE_OFFLINE;
    b_offline = DeviceIoControl(h_file, IOCTL_DISK_SET_DISK_ATTRIBUTES, &disk_attr, disk_attr.Version, NULL, 0, &bytes_returned, NULL);
    // Invalidates the cached partition table and re-enumerates the device.
    if(!enable) BOOL b_update = DeviceIoControl(h_file, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &bytes_returned, NULL);
}
return b_offline;
}
2 голосов
/ 23 сентября 2011

Этот вопрос содержит пару полезных ссылок на API Windows, включая метод DeviceIOControl .

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

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

  • Не может появиться черный экран - тонны решений этой проблемы доступны онлайн
  • Служба безопасностине позволите - вы уже запускаете процесс как администратор, поэтому вы доверяете ему, почему бы вам не доверять встроенной функции Windows
  • Технические проблемы не позволяют вызывать другие процессы - меня интересует, какэто управлялось с учетом того, что процесс запущен от имени администратора
  • Правила кодирования, такие как «Всегда использовать API» - нет из-за отсутствия необходимости
0 голосов
/ 25 апреля 2014

Используя DeviceIoControl и управляющий код IOCTL_DISK_IS_WRITABLE, можно проверить, доступен ли для записи диск. Если диск находится в автономном режиме, он возвращает false. Это означает, что можно определить, находится ли диск в автономном режиме и нормально ли он работает с Windows 2003 и более поздними версиями. Однако я не смог найти какой-либо полезный IOCTL для перевода диска в оперативный режим в Windows 2003. IOCTL_DISK_SET_DISK_ATTRIBUTES работает только с Windows 2008 и более поздними версиями.

...