skyfree 发表于 2016-1-7 11:43:36

有没有纯AU3方法或API方法获取当前分区是否GPT格式的思路?

近期有些需求,需要判断分区所在硬盘是GPT模式还是传统的MBR模式。

在搜索本站并尝试多种方法后无果,虽然WMI的方法可以实现但在大多数WinPE环境下无法正常运行。而依赖第三方,如DiskPart,很多PE也不自带,集成又会增加空间。

我现在已有方法获取卷名和卷所在设备或所在分区的编号,请问有没有API方法或纯AU3的方法可以简而有效的获取某个分区是GPT模式还是MBR模式?

谢谢!

yhjfirst 发表于 2016-1-7 12:31:16

本帖最后由 yhjfirst 于 2016-1-7 12:41 编辑

Func _wmi_Win32_DiskPartition()
        Local $colItems = ""
        Local $output = ""
        Local $objWMIService = ObjGet("winmgmts:\\.\root\CIMV2")
        If @error Then Exit
        $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_DiskPartition", "WQL", 48)
        If IsObj($colItems) Then
                For $objItem In $colItems
                       $GPT = StringInStr($objItem.Type, "GPT")
                       $MBR = StringInStr($objItem.Type, "Installable")
                        If $GPT Then;"GPT: System GPT: 系统"
                                $output &= "磁盘名称: " & $objItem.Type & @CRLF & _
                                "引导分区: " & $objItem.Bootable & @CRLF & _
                                "系统分区: " & $objItem.BootPartition & @CRLF & _
                                'GPT分区编号: ' & $objItem.diskindex + 1 & ':' & $objItem.index + 1& @CRLF
                        EndIf
                       
                        If $MBR Then
                                $output &= "磁盘名称: " & $objItem.Type & @CRLF & _
                                "引导分区: " & $objItem.Bootable & @CRLF & _
                                "系统分区: " & $objItem.BootPartition & @CRLF & _
                                'MBR分区编号: ' & $objItem.diskindex + 1 & ':' & $objItem.index + 1
                        EndIf
                        If MsgBox(1, "WMI输出",$output) = 2 Then ExitLoop
                        $output = ""
                Next
        EndIf
EndFunc   ;==>__wmi_Win32_DiskPartition

向老大献丑了,在你论坛上偶然找到的

yhjfirst 发表于 2016-1-7 12:36:37

在2003上有可能无效,没测试,win7以上正常包括PE

skyfree 发表于 2016-1-7 12:44:50

回复 2# yhjfirst


    这个就是WMI方法啊,亲。这方法在各种PE下无效。

yhjfirst 发表于 2016-1-7 12:52:41

本帖最后由 yhjfirst 于 2016-1-7 12:53 编辑

有效的啊,我就是在你PE下测试过可行的,我用的一直是你的PE,你的PE是开启WMI的

yhjfirst 发表于 2016-1-7 13:07:43

回复 4# skyfree


刚刚用你最新的PE测试了下,也可以的。PE默认是关闭了WMI服务,我自己在脚本里检测了服务。没开启并自动开启。然后再执行
API开启服务
Func _Winmgmt($services)
        Local $QueryConfig = _Service_QueryStartType($services, @ComputerName);检测服务启动类型
        If $QueryConfig > 3 Then
                TrayTip("WMI服务未开启", "正在开启WMI服务中。。。。。。。。。", 0, 2)
                RunWait(@ComSpec & ' /c ' & 'del %SystemRoot%\System32\wbem\Repository\*.* /f /q', @WindowsDir & '\system32', @SW_HIDE)
                Local $SetStart = _Service_SetStartType($services, 2, @ComputerName);设置启动类型 2自动 3手动 4禁止 返回值1 True
                Local $start = _Service_Start($services, @ComputerName);启动服务
        EndIf
EndFunc   ;==>_Winmgmt

haijie1223 发表于 2016-1-7 13:25:52

强兄,可否把GPT分区的硬盘000H-1FFH的数值截图发上来看下。MBR是通过这部分内容获取,GPT不知道是不是?

skyfree 发表于 2016-1-7 14:31:58

回复 7# haijie1223


    这段值怎么获取……?

skyfree 发表于 2016-1-7 14:35:24

回复 6# yhjfirst


多数PE里Winmgmt并没有什么卵用……

haijie1223 发表于 2016-1-7 15:30:27

回复 8# skyfree


    winhex打开磁盘,从000H-1FFH段,截个图。

yhjfirst 发表于 2016-1-7 18:34:27

这是内存地址还是别的,内存地址的话没用H的只有F一下

fuldho 发表于 2016-1-7 19:31:50

回复 10# haijie1223

可以第三方直接读取 mbr还是gpt

输出到文本

fuldho 发表于 2016-1-7 19:49:53

包括分区间隙、未分区大小等

haijie1223 发表于 2016-1-7 21:00:56

回复 12# fuldho


    楼主说了,不用第三方,要纯AU3的。

fuldho 发表于 2016-1-8 08:34:55

回复 14# haijie1223


    哦
是装不下了吧
页: [1] 2 3
查看完整版本: 有没有纯AU3方法或API方法获取当前分区是否GPT格式的思路?