2011-09-23 29 views
5

私は、Windows内のディスクにraw IOを実行しているプログラムを持っています。ディスクをオンライン/オフラインにする

対象ディスクがオンラインの場合、すべて正常に動作します。ただし、一部のWindows OSでは、新しいディスクを最初にオフラインにすることがデフォルトの動作です。

Windowsでこれを行うための正しいAPIを見つけるのに苦労しています。同等のコマンドラインは、次のようなものになります。

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

しかし、私はコードでこれを行うことができる必要があります。私はDeviceIoControl Win32 API(これは正しいと思いますが)を調べましたが、使用するコントロールコードを判断することはできません。私がそれを見つけることができないという事実は、私が使用するより良いAPIがないかもしれないと思うようになります。

+0

なぜシェルだけでC#からコマンドラインを実行するのですか? –

+1

いくつかの理由がありますが、それはオプションではないと言うだけで十分です。 diskmgmtとdiskpartがそれを行うことができるなら、方法があります。私はその方法が何であるか知りたい。 – Joe

+1

@joe - diskmgmtとdiskpartは、Win32 APIを使用する可能性のあるWindowsに組み込まれたコマンドです。彼らはしばらくその周りにあったと考えていることはありそうもない。あなたがコマンドラインで行うことができるそれらのguisを通して行うことができるすべて。 –

答えて

2

This questionには、DeviceIOControlメソッドを含むWindows APIへの便利なリンクがいくつかあります。

すべての列挙を調べた結果、ディスクをオンラインにすることや、フォーマット/パーティションを超えてディスクを面白く変更することはできませんでした。ホットスワップ可能なハードドライブのみがこの機能によってサポートされているためです。ホットスワップ可能なハードドライブの市場は非常に小さく、必要な操作をサポートするためのドライバーが大半を占めています。最後に、残りの部分は必要なもののためにdiskpartツールを使用できるはずです。

私は思うあなたの要件をもう一度見直す必要があります。ハードディスクをオンラインにするのに必要な権限を持っているが、コマンドラインプログラムにアクセスできないプロセスを実行していますか?ここでは、コマンドラインプログラムを使用しないように一般的な理由のためにいくつかの提案です:ポップアップ表示

  • が黒い画面を持っていません - この問題に対する解決策のトンオンライン
  • セキュリティチームはそれを許可されません - あなたはすでに管理者としてプロセスを実行していますので信頼していないのですが、組み込みのWindows関数を信頼しないのはなぜですか?
  • 他のプロセスを呼び出すことを妨げる技術的問題があります。管理者
  • 「常にAPIを使用する」などのコーディングガイドライン - 必要がないために1つもありません
+0

ホットスワップ外のダイナミックディスクには、実際に多くの用途があります。リンクをありがとう、私はそこに実際のソリューションはないことに注意しているが、私はそれを見た。 – Joe

+0

@ジョー:私はドライブの物理的な能力を意味しませんでした – Guvante

4

将来の世代のために、(Windows 2k3/Vista以降の)回答は仮想ディスクサービス(VDS)です。特に、.NET内でCOMオブジェクトをそれほど使用しないと、すべてを一緒にする作業があります。

オンライン/オフラインのディスクはIVdsDrive::SetStatusで行われます。少なくともそれはすべきです。ディスク上の読み取り専用ステータスを無効にするだけで問題を解決できることがわかりました。私はIVdsDisk::SetFlagsで、適切なフラグ値を使ってこれを行うことができました。

+0

APIは1つの大きな地獄です、どうすれば使用できますか?ドキュメントは本当に不明です。 – Gizmo

2

C#についてはわかりませんが、私はC++でこれを使用しています: を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; 
} 
0

のDeviceIoControlとIOCTL_DISK_IS_WRITABLE制御コードを使用して、ディスクが書き込み可能であるかどうかを確認することが可能です。ディスクがオフラインの場合はfalseを返します。つまり、ディスクがオフラインで、Windows 2003以降で正常に動作しているかどうかを判断することができます。しかし、Windows 2003でディスクをオンラインにするための有用なIOCTLが見つかりませんでした.IOCTL_DISK_SET_DISK_ATTRIBUTESはWindows 2008以降でのみ動作します。

関連する問題