4

c# または c++ を使用して隠しディスク パーティション/ボリュームにアクセスするコードを作成する必要があります。しかし、この問題に関するヘルプリファレンスは見つかりませんでした。

隠しボリュームとして「ディスク文字」が含まれていないため、「C:\」と入力してアクセスすることはできません。例として、Windows に付属の「回復パーティション」があります。エクスプローラーでは見えませんが、あります。

私のアプリケーションはこれらのパーティションからデータを読み書きするので、「c:\」のような方法を見つける必要があります。

ボリューム 5、6 は隠しパーティションです

上の画像では、ボリューム 5 と 6 が隠しパーティションです。stackoverflow でこのリンクを見つけましたが、パーティションを「リスト」するだけです: https://msdn.microsoft.com/en-us/library/cc542456(v=VS.85).aspx

編集

問題は、WMI を想定どおりに使用しても、ファイルを探すときにボリュームをフィルタリングする方法が見つからないことです。例としてselect * from win32_DataFile、マシン内のすべてのファイルを一覧表示します。

ID(または名前)を使用してボリュームをフィルタリングする方法であるべきだと思います。何かのようなもの:

select * from win32_DataFile 
where volumeId = '\\?\Volume{2d5f3a68-75f5-44c4-aa42-716b45811916}\'

または、次のようなより美しい方法:

var files = Directory.GetFiles(@"\\?\Volume{6ff7748e-78db-4838-8896-254b074918f5}\");

また、パーティションとボリュームについて優れた awenser を見つけました (それらは同じものではありません) https://social.technet.microsoft.com/Forums/en-US/e7b2ddd6-f245-49ed-8fec-3b6e08e75369/how- do-i-find-the-partition-guid?forum=winservergen

EDIT2

Harry が指摘したように、"\.\Volume...." を使用することは、ファイルを回復するための良い方法でした。しかし、c# を使用して新しいファイルを作成 (作成) する方法が見つかりませんでした。これまでの最善のアプローチは、pinvoke を使用して c++ CreateFile メソッド/ハンドルを使用することです。


何かアドバイス?

4

2 に答える 2

2

プログラムが Windows 固有のものである場合は、WMI を使用できます。私は WMI で多くの作業を行いましたが、あらゆる種類の操作を実行したり、Windows システムに関するデータを取得したりするのに非常に便利です。

まず、wmiexplorer をダウンロードして、利用可能なデータとクラスを確認できます。関連する名前空間は になりますroot\cimv。そこでは、さまざまな興味深いクラスを見つけることができます。

  • Win32_LogicalDisk : 非表示のディスクも含め、すべてのディスクが含まれます。
  • CIM_Directory:すべてのディレクトリが含まれています(隠しディスクからも知る限り)
  • CIM_DataFile : すべてのファイルが含まれています (これには隠しディスクのファイルも含まれていると思います)
  • たとえば、ファイルのアクセス許可を取得するために使用できるクラスは他にもたくさんあります... Microsoft には、それに関するかなり良いドキュメントがあります

次に、目的の WMI クエリを C# (または VB.NET) プログラムに実装できます。たとえば、これはすべてのディスクを印刷します。

WqlObjectQuery wqlQuery = new WqlObjectQuery("SELECT * FROM Win32_LogicalDisk");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(wqlQuery);

foreach (ManagementObject disk in searcher.Get()) 
{
    Console.WriteLine(disk.ToString());
}

ご覧のとおり、WMI は SQL のようなクエリをサポートしています (ただし、それほど強力ではありません...)。

WMI は、ほとんどの ist クラスのメソッドもサポートしています。たとえば、各ディスクのエラーを確認できます。

foreach (ManagementObject disk in searcher.Get()) 
{
    if(shouldCheckThisDisk)
        disk.Chkdsk();
}
于 2015-06-23T08:36:08.617 に答える