不确定C#,但我在C++中使用它: 尝试使用IOCTL_DISK_SET_DISK_ATTRIBUTES
调用DeviceIoControl()
。文件句柄必须具有读取和写入权限。我认为它至少需要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;
}
为什么不只是shell从C#执行命令行呢? –
由于多种原因,但足以说这不是一个选项。如果diskmgmt和diskpart可以做到这一点,有一种方法。我想知道那是什么。 – Joe
@joe - diskmgmt和diskpart是gui对Windows内置的命令,它们可能使用Win32 API。考虑到他们已经有一段时间了,这不太可能。您可以通过命令行完成的任何操作。 –