公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

【C#】如何判斷虛擬磁盤VHDX文件是否已經(jīng)被掛載,掛載到了哪一個盤符,并且當(dāng)前是掛載為只讀模式還是可讀寫模式

admin
2025年5月16日 11:1 本文熱度 97

如何判斷虛擬磁盤VHDX文件是否已經(jīng)被掛載,掛載到了哪一個盤符,并且當(dāng)前是掛載為只讀模式還是可讀寫模式呢?以下是用于檢測VHDX掛載狀態(tài)和屬性的完整C#實(shí)現(xiàn)方案:

using System;

using System.IO;

using System.Management;

using System.Diagnostics;

using System.Text;


class VhdxStatusChecker

{

    // 主檢查方法(返回:是否掛載,盤符列表,是否只讀)

    public static (bool isMounted, string drives, bool isReadOnly) CheckVhdxStatus(string vhdxPath)

    {

        var normalizedPath = Path.GetFullPath(vhdxPath).ToLower();


        using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive"))

        {

            foreach (ManagementObject disk in searcher.Get())

            {

                // 檢查磁盤是否為虛擬磁盤

                if (disk["MediaType"]?.ToString() != "Microsoft Virtual Disk")

                    continue;


                // 獲取VHDX文件路徑

                var diskPath = GetVhdxPathFromDisk(disk);

                if (diskPath == null) continue;


                // 路徑匹配檢測

                if (Path.GetFullPath(diskPath).ToLower() != normalizedPath)

                    continue;


                // 獲取掛載信息

                var drives = GetMountedDrives(disk);

                var isReadOnly = CheckReadOnlyStatus(diskPath);


                return (true, drives, isReadOnly);

            }

        }

        return (false, null, false);

    }


    // 獲取VHDX文件路徑(兼容不同Windows版本)

    private static string GetVhdxPathFromDisk(ManagementObject disk)

    {

        // 方法1:通過FileName屬性獲取

        if (disk["FileName"] is string fileName && fileName.EndsWith(".vhdx", StringComparison.OrdinalIgnoreCase))

            return fileName;


        // 方法2:通過WMI擴(kuò)展屬性獲取(需要Windows 8+)

        try

        {

            using (var p = new ManagementObject($"Win32_DiskDrive.DeviceID='{disk["DeviceID"]}'"))

            {

                p.Scope = new ManagementScope(@"\\.\root\Microsoft\Windows\Storage");

                return p["FileName"]?.ToString();

            }

        }

        catch { /* 忽略兼容性錯誤 */ }


        return null;

    }


    // 獲取已掛載的盤符

    private static string GetMountedDrives(ManagementObject disk)

    {

        var sb = new StringBuilder();

        var query = $"ASSOCIATORS OF {{Win32_DiskDrive.DeviceID='{EscapeWmiPath(disk["DeviceID"].ToString())}'}} " +

                    "WHERE AssocClass = Win32_DiskDriveToDiskPartition";


        using (var partitions = new ManagementObjectSearcher(query).Get())

        {

            foreach (ManagementObject partition in partitions)

            {

                var driveQuery = $"ASSOCIATORS OF {{Win32_DiskPartition.DeviceID='{EscapeWmiPath(partition["DeviceID"].ToString())}'}} " +

                                "WHERE AssocClass = Win32_LogicalDiskToPartition";


                using (var drives = new ManagementObjectSearcher(driveQuery).Get())

                {

                    foreach (ManagementObject drive in drives)

                    {

                        if (drive["DeviceID"] != null)

                            sb.Append($"{drive["DeviceID"]} ");

                    }

                }

            }

        }

        return sb.ToString().Trim();

    }


    // 檢查只讀狀態(tài)(兼容多語言系統(tǒng))

    private static bool CheckReadOnlyStatus(string vhdxPath)

    {

        var output = ExecuteDiskPartCommand($@"

            select vdisk file=""{vhdxPath}""

            detail vdisk

            exit

        ");


        // 多語言匹配模式

        var patterns = new[] {

            new { Key = "Read-only", Yes = "Yes", No = "No" },        // 英語

            new { Key = "只讀", Yes = "是", No = "否" },              // 中文

            new { Key = "Schreibgeschützt", Yes = "Ja", No = "Nein" } // 德語

        };


        foreach (var pattern in patterns)

        {

            var start = output.IndexOf(pattern.Key);

            if (start == -1) continue;


            var valueStart = output.IndexOf(':', start) + 1;

            var valueEnd = output.IndexOf('\n', valueStart);

            var value = output.Substring(valueStart, valueEnd - valueStart).Trim();


            return value.Equals(pattern.Yes, StringComparison.OrdinalIgnoreCase);

        }


        return false; // 默認(rèn)返回可寫狀態(tài)

    }


    // 執(zhí)行diskpart命令并獲取輸出

    private static string ExecuteDiskPartCommand(string script)

    {

        var tempFile = Path.GetTempFileName();

        File.WriteAllText(tempFile, script, Encoding.Unicode); // 必須使用Unicode編碼


        try

        {

            var psi = new ProcessStartInfo("diskpart")

            {

                Arguments = $"/s \"{tempFile}\"",

                RedirectStandardOutput = true,

                UseShellExecute = false,

                CreateNoWindow = true,

                StandardOutputEncoding = Encoding.Unicode // 正確解析多語言輸出

            };


            using (var process = Process.Start(psi))

            {

                var output = process.StandardOutput.ReadToEnd();

                process.WaitForExit(5000);

                return output;

            }

        }

        finally

        {

            File.Delete(tempFile);

        }

    }


    // WMI路徑轉(zhuǎn)義工具方法

    private static string EscapeWmiPath(string path)

    {

        return path.Replace(@"\", @"\\").Replace("'", @"\'");

    }

}

使用示例:

var (isMounted, drives, isReadOnly) = VhdxStatusChecker.CheckVhdxStatus(@"D:\Backup.vhdx");

Console.WriteLine($"已掛載: {isMounted}");

Console.WriteLine($"盤符: {drives ?? "無"}");

Console.WriteLine($"只讀模式: {isReadOnly}");

方案特性:

1、多語言兼容:

  • 支持檢測英語、中文、德語系統(tǒng)的只讀狀態(tài)

  • 自動識別系統(tǒng)語言輸出格式

  • 使用Unicode編碼處理特殊字符

2、雙重檢測機(jī)制:

  • 通過WMI獲取基礎(chǔ)磁盤信息

  • 通過diskpart驗證詳細(xì)屬性

3、兼容性處理:

  • 支持Windows 7及更高版本

  • 兼容傳統(tǒng)Win32接口和新的Storage命名空間

4、錯誤防御:

  • 自動轉(zhuǎn)義WMI查詢路徑

  • 處理磁盤分區(qū)的多種情況

  • 超時機(jī)制防止進(jìn)程掛起

實(shí)現(xiàn)原理:

1、WMI查詢:

  • 通過Win32_DiskDrive定位虛擬磁盤

  • 使用關(guān)聯(lián)查詢獲取掛載盤符

2、diskpart檢測:

  • 執(zhí)行detail vdisk獲取詳細(xì)信息

  • 多語言關(guān)鍵字匹配檢測只讀狀態(tài)

3、路徑標(biāo)準(zhǔn)化:

  • 統(tǒng)一轉(zhuǎn)換為全路徑和小寫格式

  • 處理不同來源的路徑格式差異

注意事項:

1、運(yùn)行權(quán)限:

// 需要以管理員身份運(yùn)行程序

// 在項目文件中添加:

// <ApplicationManifest>app.manifest</ApplicationManifest>

// 并啟用requireAdministrator

2、異常處理:

try {

    var result = VhdxStatusChecker.CheckVhdxStatus(path);

}

catch (Exception ex) {

    Console.WriteLine($"檢測失敗: {ex.Message}");

}

3、性能優(yōu)化:

// 對于頻繁檢測的場景,可以緩存ManagementObjectSearcher實(shí)例

// 但需要注意及時釋放資源

該方案通過結(jié)合WMI和diskpart的優(yōu)勢,實(shí)現(xiàn)了可靠的VHDX狀態(tài)檢測,適用于需要高可靠性保障的備份系統(tǒng)。


相關(guān)教程:

C#零成本實(shí)現(xiàn)云服務(wù)器上Windows系統(tǒng)數(shù)據(jù)庫自動備份并防止備份文件被勒索病毒破壞[20]
  http://31161.oa22.cn


該文章在 2025/5/16 11:03:58 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊、財務(wù)費(fèi)用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产盗摄精品一区二区 | 国产日韩成人内射视频 | 国产午夜精品理论在线观看 | 国产综合在线小说 | 18禁黄黄美女网站在线看 | 国产欧美成人综合一级青青 | 国产视频一区二区在线 | 白丝爆浆18禁一区 | 国产99久9在线+麻豆 | 国产高清免费观看a∨片 | 国产aⅴ一二三区无码视频 国产aⅴ一区 | 国产女主播视频一区二区三区 | 2025最新久久久视精品爱 | 99久久夜色精品国产网站 | 国产午夜草莓视频在线观看 | av在线网站观看网址入口 | 国产成人精品一区二区a片带套 | 国产片婬乱一级毛片丫丫 | 国产午夜无码喷水福利在线观看 | 91精品国产综合久久青草 | 18国产精品 | 91成人免费福利网站在线 | 国产91在线精品不卡 | 成人无码a级毛片免费 | 91老肥熟国产在 | av中文字幕不卡无码 | 黑色jk白丝粉嫩自慰喷水喷浆 | 18成人片 | 国产精品盗摄一区二区在线 | 2025国产精品最新在线 | 91一区二区三区在线观看 | 97人妻熟女成人免费视频色戒 | 精品无码a免费观看 | av无码一区二区三区 | 18禁黄网站禁片免费观看国产 | 2025国产男人亚洲欧美天堂 | 白丝乳交 | 国产成人精选在线不卡 | 成人黄色免费小视频 | 国产品精在线观看一区 | 91传媒久久久蜜桃 |