雑多2 のバックアップ(No.10)


WMIでディスク関連の情報を取得.js Edit

function	GetObjectTextList(sQuery){
	var objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}");
	var colItems = objWMIService.ExecQuery(sQuery);
	var s1 = "";
	
	for(var emu = new Enumerator(colItems); !emu.atEnd(); emu.moveNext())
		s1 += emu.item().GetObjectText_();
	return s1;
}

var sText = "//Ctrl + C でクリップボードにコピー\n\n\n\n";

sText += GetObjectTextList("SELECT * FROM Win32_DiskDrive\n\n\n\n");
sText += GetObjectTextList("SELECT * FROM Win32_LogicalDisk\n\n\n\n");
sText += GetObjectTextList("SELECT * FROM Win32_DiskPartition\n\n\n\n");
sText += GetObjectTextList("SELECT * FROM Win32_DiskDrivePhysicalMedia\n\n\n\n");
sText += GetObjectTextList("SELECT * FROM Win32_DiskDriveToDiskPartition\n\n\n\n");
sText += GetObjectTextList("SELECT * FROM Win32_LogicalDiskRootDirectory\n\n\n\n");
sText += GetObjectTextList("SELECT * FROM Win32_LogicalDiskToPartition\n\n\n\n");
sText += GetObjectTextList("SELECT * FROM Win32_IDEController\n\n\n\n");
sText += GetObjectTextList("SELECT * FROM Win32_IDEControllerDevice\n\n\n\n");
sText += GetObjectTextList("SELECT * FROM Win32_SystemPartitions\n\n\n\n");
sText += GetObjectTextList("SELECT * FROM Win32_Volume\n\n\n\n");
sText += GetObjectTextList("SELECT * FROM Win32_PhysicalMedia\n\n\n\n");

WScript.Echo(sText);
 

WMIでパーティションの開始アドレスを取得.js Edit

function	GetObjectTextList(sQuery){
	var objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}");
	var colItems = objWMIService.ExecQuery(sQuery);
	var s1 = "";
	
	for(var emu = new Enumerator(colItems); !emu.atEnd(); emu.moveNext())
		s1 += emu.item().GetObjectText_();
	return s1;
}

var sText = "//Ctrl + C でクリップボードにコピー\n\n\n\n";

sText += GetObjectTextList("SELECT * FROM Win32_DiskPartition\n\n\n\n");
sText += GetObjectTextList("SELECT * FROM Win32_LogicalDiskToPartition\n\n\n\n");

WScript.Echo(sText);
 

fsutilでサポートされるコマンド(Windows 10) Edit

---- サポートされる 8DOT3NAME コマンド ----
query   システム上の短い名前の動作について現在の設定を照会
scan    影響を受けるレジストリ エントリを検出
set     システム上の短い名前の動作を制御する設定を変更
strip   ディレクトリ内のすべてのファイルの短い名前を削除

---- サポートされている BEHAVIOR コマンド ----
query           ファイル システムの behavior パラメーターを照会
set             ファイル システムの behavior パラメーターを変更

---- サポートされる DIRTY コマンド ----
query           dirty ビットの照会
set             dirty ビットの設定

---- サポートされる FILE コマンド ----
createnew               指定されたサイズの新しいファイルの作成
findbysid               セキュリティ識別子でファイルを検索
optimizemetadata        ファイルのメタデータの最適化
queryallocranges        ファイルに割り当てられた範囲の照会
queryextents            ファイルのエクステントの照会
queryfileid             指定されたファイルをファイル ID で照会
queryfilenamebyid       ファイル ID のランダム リンク名を表示
queryoptimizemetadata   ファイルの最適化メタデータ状態を照会
queryvaliddata          ファイルの有効なデータ長の照会
setshortname            ファイルの短い名前の設定
setvaliddata            ファイルの有効なデータ長の設定
setzerodata             ファイルのゼロ データの設定

---- サポートされる FSINFO コマンド ----
drives          ドライブをすべて一覧表示
driveType       ドライブの種類の照会
ntfsInfo        NTFS 固有のボリューム情報の照会
refsInfo        REFS 固有のボリューム情報の照会
sectorInfo      セクター情報の照会
statistics      ファイル システム統計情報の照会
volumeInfo      ボリューム情報の照会

---- サポートされる HARDLINK コマンド ----
create          ハードリンクの作成
list            ファイルのハードリンクを列挙

---- サポートされる OBJECTID コマンド ----
create          オブジェクト ID の作成
delete          オブジェクト ID の削除
query           オブジェクト ID の照会
set             オブジェクト ID の変更

---- サポートされる QUOTA コマンド ----
disable         クォータの追跡と強制の無効化
enforce         クォータの強制の有効化
modify          ユーザーのディスク クォータの設定
query           ディスク クォータの照会
track           クォータの追跡の有効化
violations      クォータ違反の表示

---- サポートされる REPAIR コマンド ----
enumerate      ボリュームの破損ログのエントリの列挙
initiate       ファイルの修復の開始
query          ボリュームの自己復旧の状態の照会
set            ボリュームの自己復旧の状態の設定
state          ボリュームの破損状態の照会
wait           修復が完了するまで待機

---- サポートされる REPARSEPOINT コマンド ----
delete          再解析ポイントの削除
query           再解析ポイントの照会

---- サポートされる RESOURCE コマンド ----
create          別のトランザクション リソース マネージャーを作成
info            トランザクション リソース マネージャーに関する情報の表示
setautoreset    既定のトランザクション リソース マネージャーで次のマウント時にトランザクションの...
setavailable    整合性よりも可用性を優先するようにトランザクション リソース マネージャーを設定
setconsistent   可用性よりも整合性を優先するようにトランザクション リソース マネージャーを設定
setlog          実行しているトランザクション リソース マネージャーの特性を変更
start           トランザクション リソース マネージャーを開始
stop            トランザクション リソース マネージャーを停止

---- サポートされる SPARSE コマンド ----
queryflag       スパースの照会
queryrange      範囲の照会
setflag         スパースに設定
setrange        スパース範囲の設定

---- サポートされる TIERING コマンド ----
queryflags      ボリュームのティアリング動作フラグの表示
setflags        ボリュームのティアリング動作フラグの有効化
clearflags      ボリュームのティアリング動作フラグの無効化
tierlist        ボリュームに関連付けられている記憶域階層の一覧表示
regionlist      ボリュームの領域と対応する記憶域階層の一覧表示

---- サポートされる TRANSACTION コマンド ----
commit          指定されたトランザクションのコミット
fileinfo        特定のファイルのトランザクション情報の表示
list            現在実行しているトランザクションの表示
query           指定したトランザクションに関する情報の表示
rollback        指定したトランザクションのロールバック

---- サポートされる USN コマンド ----
createjournal           USN ジャーナルの作成
deletejournal           USN ジャーナルの削除
enumdata                USN データの列挙
readjournal             USN ジャーナル内の USN レコードの読み取り
queryjournal            ボリュームの USN データの照会
readdata                ファイルの USN データの読み取り
enablerangetracking     ボリュームの書き込み範囲の追跡の有効化

---- サポートされる VOLUME コマンド ----
diskfree            ボリュームの空き領域の照会
dismount            ボリュームのマウントの解除
querycluster        特定のクラスターを使用するファイルの照会
filelayout          ファイルについて利用できるすべての情報の照会
allocationreport    割り当てられたクラスターのレポート

---- サポートされる WIM コマンド ----
enumfiles           WIM でバッキングされているファイルの列挙
enumwims            バッキング WIM ファイルの列挙
removewim           バッキング ファイルから WIM を削除
queryfile           特定のファイルのオリジナルを照会
 

fsutilのコマンドとWinAPIの対応表 Edit

fsutil file createnewCreateFile() + SetFilePointer() + SetEndOfFile()
fsutil file queryallocrangesDeviceIoControl(FSCTL_QUERY_ALLOCATED_RANGES)
fsutil file queryextentsDeviceIoControl(FSCTL_GET_RETRIEVAL_POINTERS)
fsutil file queryvaliddataDeviceIoControl(FSCTL_QUERY_FILE_REGIONS) 12 GetFileValidData()という名の関数は無い
fsutil file setvaliddataSetFileValidData()
fsutil file setzerodataDeviceIoControl(FSCTL_SET_ZERO_DATA)
fsutil hardlink createCreateHardLink()
fsutil fsinfo statisticsDeviceIoControl(FSCTL_FILESYSTEM_GET_STATISTICS(_EX))
fsutil volume queryclusterDeviceIoControl(FSCTL_LOOKUP_STREAM_FROM_CLUSTER)
fsutil volume filelayoutDeviceIoControl(FSCTL_QUERY_FILE_LAYOUT)
 

ファイル新規作成時の断片化を軽減する方法 Edit

ファイルサイズがゼロの状態から
a. WriteFile() でファイル全体を一気に書き込む
b. SetFilePointer() と SetEndOfFile() でファイルサイズを拡張しておく(NTFSの場合予約だけで書き込みは発生しない)
のどちらかを実行すると、出来るだけ連続した領域がファイルシステム上で探されて確保されるので断片化しづらい。

ファイル関連の操作はSysinternals Process Monitorで確認できる。 12

 

Windows標準コマンドで各種ハッシュ計算 / Base64エンコードデコード / bin <-> hex変換する方法(Vista以降) Edit

Windowsのcertutilコマンドでメッセージダイジェストを表示する方法
Windowsでbase64エンコード・デコードする方法
Windowsでファイルを16進数テキストに変換したり、16進数テキストをファイルに変換したりする方法 CryptBinaryToString function

 

Windowsのメモリ上のファイルキャッシュをクリアする方法(Vista以降) Edit

Sysinternals RAMMapの Menu -> Empty -> Empty Standby List を実行すると、ファイルキャッシュを含むスタンバイタイプのデータがクリアされる。 12

 

NTFS論理ドライブのクラスター番号を論理アドレスに変換.js Edit

//cDriveLetter で指定されたドライブレターと TargetCluster で指定されたクラスター番号から論理アドレスに変換 (NTFS 用)
//BytesPerSector と BytesPerCluster は WinAPI なら GetDiskFreeSpace()で、cmd なら fsutil fsinfo ntfsinfo で取得可能

var cDriveLetter = "C";
var TargetCluster = 0x100000;


function	GetBytesPerSectorFromDriveLetter(cDriveLetter){
	var objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}");
	var listWin32LogicalDiskToPartition   = objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDiskToPartition");
	var listWin32DiskDriveToDiskPartition = objWMIService.ExecQuery("SELECT * FROM Win32_DiskDriveToDiskPartition");
	var listWin32DiskDrive                = objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive");
	
	for(var i = 0; i < listWin32LogicalDiskToPartition.Count; i++){
		if(/Win32_LogicalDisk\.DeviceID=\"([A-Za-z]):\"/i.exec(listWin32LogicalDiskToPartition.ItemIndex(i).Dependent) != null){
			if(RegExp.$1.toUpperCase() == cDriveLetter.toUpperCase()){
				for(var i2 = 0; i2 < listWin32DiskDriveToDiskPartition.Count; i2++){
					if(listWin32LogicalDiskToPartition.ItemIndex(i).Antecedent.toUpperCase() == listWin32DiskDriveToDiskPartition.ItemIndex(i2).Dependent.toUpperCase()){
						if(/Win32_DiskDrive\.DeviceID=\"(.+)\"/i.exec(listWin32DiskDriveToDiskPartition.ItemIndex(i2).Antecedent) != null){
							var sDeviceID = RegExp.$1.replace(/\\\\/g, "\\");
							
							for(var i3 = 0; i3 < listWin32DiskDrive.Count; i3++){
								if(listWin32DiskDrive.ItemIndex(i3).DeviceID.toUpperCase() == sDeviceID.toUpperCase()){
									return	parseInt(listWin32DiskDrive.ItemIndex(i3).BytesPerSector);
								}
							}
						}
					}
				}
			}
		}
	}
	
	return 0;
}


function	GetBytesPerClusterFromDriveLetter(cDriveLetter){
	var objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}");
	var listWin32Volume = objWMIService.ExecQuery("SELECT * FROM Win32_Volume WHERE DriveLetter LIKE '" + cDriveLetter + ":'");
	
	if(listWin32Volume.Count > 0){
		return	parseInt(listWin32Volume.ItemIndex(0).BlockSize);
	}else{
		return 0;
	}
}


function	GetPartitionStartAddressFromDriveLetter(cDriveLetter){
	var objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}");
	var listWin32LogicalDiskToPartition = objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDiskToPartition");
	
	for(var i = 0; i < listWin32LogicalDiskToPartition.Count; i++){
		if(/Win32_LogicalDisk\.DeviceID=\"([A-Za-z]):\"/i.exec(listWin32LogicalDiskToPartition.ItemIndex(i).Dependent) != null){
			if(RegExp.$1.toUpperCase() == cDriveLetter.toUpperCase()){
				return	parseInt(listWin32LogicalDiskToPartition.ItemIndex(i).StartingAddress);
			}
		}
	}
	
	return 0;
}


var BytesPerSector = GetBytesPerSectorFromDriveLetter(cDriveLetter);
var BytesPerCluster = GetBytesPerClusterFromDriveLetter(cDriveLetter);
var PartitionStartingAddress = GetPartitionStartAddressFromDriveLetter(cDriveLetter);
var LogicalAddress = PartitionStartingAddress + (TargetCluster * BytesPerCluster);
var LogicalBlockAddress = LogicalAddress / BytesPerSector;

var s1  = "//Ctrl + C でクリップボードにコピー"                      + "\n";
	s1 += "cDriveLetter:\t\t"             + cDriveLetter             + "\n";
	s1 += "BytesPerSector:\t\t"           + BytesPerSector           + "\n";
	s1 += "BytesPerCluster:\t\t"          + BytesPerCluster          + "\n";
	s1 += "PartitionStartingAddress:\t"   + PartitionStartingAddress + "\n";
	s1 += "TargetCluster:\t\t"            + TargetCluster            + "\n";
	s1 += "LogicalAddress:\t\t"           + LogicalAddress           + "\n";
	s1 += "LogicalBlockAddress:\t"        + LogicalBlockAddress      + "\n";

WScript.Echo(s1);
 

_ Edit