找回密码
 加入
搜索
查看: 11764|回复: 34

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

 火... [复制链接]
发表于 2016-1-7 11:43:36 | 显示全部楼层 |阅读模式
近期有些需求,需要判断分区所在硬盘是GPT模式还是传统的MBR模式。

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

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

谢谢!
发表于 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

向老大献丑了,在你论坛上偶然找到的
发表于 2016-1-7 12:36:37 | 显示全部楼层
在2003上有可能无效,没测试,win7以上正常包括PE
 楼主| 发表于 2016-1-7 12:44:50 | 显示全部楼层
回复 2# yhjfirst


    这个就是WMI方法啊,亲。这方法在各种PE下无效。
发表于 2016-1-7 12:52:41 | 显示全部楼层
本帖最后由 yhjfirst 于 2016-1-7 12:53 编辑

有效的啊,我就是在你PE下测试过可行的,我用的一直是你的PE,你的PE是开启WMI的
发表于 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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2016-1-7 13:25:52 | 显示全部楼层
强兄,可否把GPT分区的硬盘000H-1FFH的数值截图发上来看下。MBR是通过这部分内容获取,GPT不知道是不是?
 楼主| 发表于 2016-1-7 14:31:58 | 显示全部楼层
回复 7# haijie1223


    这段值怎么获取……?
 楼主| 发表于 2016-1-7 14:35:24 | 显示全部楼层
回复 6# yhjfirst


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2016-1-7 15:30:27 | 显示全部楼层
回复 8# skyfree


    winhex打开磁盘,从000H-1FFH段,截个图。
发表于 2016-1-7 18:34:27 | 显示全部楼层
这是内存地址还是别的,内存地址的话没用H的只有F一下
发表于 2016-1-7 19:31:50 | 显示全部楼层
回复 10# haijie1223

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

输出到文本

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2016-1-7 19:49:53 | 显示全部楼层
包括分区间隙、未分区大小等
发表于 2016-1-7 21:00:56 | 显示全部楼层
回复 12# fuldho


    楼主说了,不用第三方,要纯AU3的。
发表于 2016-1-8 08:34:55 | 显示全部楼层
回复 14# haijie1223


    哦
是装不下了吧
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-24 16:10 , Processed in 0.087312 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表