
Obtenga el nombre/etiqueta de una unidad usando WMI en VBA
Haciendo mis rondas diarias, revisando varios foros para ver si había alguna pepita de conocimiento interesante, me encontré con una pregunta sobre UtterAccess

Desde entonces, anteriormente he hecho mucho trabajo recuperando todo tipo de información relacionada con PC que pensé que rápidamente ayuda a Raheel y al mismo tiempo, publique el código aquí para que todos se beneficien.
Ahora, como dije, he publicado aquí antes de recuperar información de PC y una de las mejores formas de hacerlo es usar WMI. Entonces, con esa idea general en mi cabeza, busqué una función existente desde mi sitio web y luego modifiqué para obtener la etiqueta de accionamiento (WMI tiene la propiedad nombrada como ‘Volumename’) como se solicita en la pregunta, ¡y voilà!
'--------------------------------------------------------------------------------------- ' Procedure : WMI_GetDiskLabel ' Author : Daniel Pineault, CARDA Consultants Inc. ' Website : ' Purpose : Retrieve the volume label/name associated with a specific drive ' Copyright : The following is release as Attribution-ShareAlike 4.0 International ' (CC BY-SA 4.0) - ' Req'd Refs: Early Binding -> Microsoft WMI Scripting VX.X Library ' Late Binding -> None required ' ' Input Variables: ' ~~~~~~~~~~~~~~~~ ' sDrive : Drive to lookup ie: C: ' ' Usage: ' ~~~~~~ ' ? WMI_GetDiskLabel("C:") ' Returns -> Windows ' ' ? WMI_GetDiskLabel("D:") ' Returns -> Data ' ' Revision History: ' Rev Date(yyyy-mm-dd) Description ' ************************************************************************************** ' 1 2025-05-08 Initial Release - Forum help '--------------------------------------------------------------------------------------- Public Function WMI_GetDiskLabel(ByVal sDrive As String) as String On Error GoTo Error_Handler #Const WMI_EarlyBind = False 'True => Early Binding / False => Late Binding #If WMI_EarlyBind = True Then Dim oWMI As WbemScripting.SWbemServices Dim oCols As WbemScripting.SWbemObjectSet Dim oCol As WbemScripting.SWbemObject #Else Dim oWMI As Object Dim oCols As Object Dim oCol As Object Const wbemFlagReturnImmediately = 16 '(&H10) Const wbemFlagForwardOnly = 32 '(&H20) #End If Dim sWMIQuery As String 'WMI Query Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") sWMIQuery = "SELECT VolumeName FROM Win32_LogicalDisk WHERE Caption='" & sDrive & "'" Set oCols = oWMI.ExecQuery(sWMIQuery, , wbemFlagReturnImmediately Or wbemFlagForwardOnly) For Each oCol In oCols WMI_GetDiskLabel = oCol.VolumeName GoTo Error_Handler_Exit Next Error_Handler_Exit: On Error Resume Next Set oCol = Nothing Set oCols = Nothing Set oWMI = Nothing Exit Function Error_Handler: MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _ "Error Number: " & Err.Number & vbCrLf & _ "Error Source: WMI_GetDiskLabel" & vbCrLf & _ "Error Description: " & Err.Description & _ Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _ , vbOKOnly + vbCritical, "An Error has Occurred!" Resume Error_Handler_Exit End Function
Y luego puedes usarlo haciendo algo como:
MsgBox WMI_GetDiskLabel("C:")
Si no se encuentra la unidad, entonces la función devuelve una cadena vacía «», por lo que quizás el mejor enfoque podría ser más como:
Dim sDriveLabel As String sDriveLabel = WMI_GetDiskLabel("C:") If sDriveLabel = "" Then MsgBox "Drive not found?!", vbCritial or VbOkOnly Else MsgBox sDriveLabel End If
Como puede ver, realmente no es difícil recuperar dicha información, es solo un caso de saber que podemos obtenerla usando WMI y específicamente la clase Win32_LogicalDisk.
Características del código
Este código
- Se puede usar como enlace temprano o tardío, la elección es suya y se establece cambiando el valor de la constante WMI_EARLYBIND.
- ¿Es la arquitectura/bitness independiente (funciona en instalaciones de 32 y 64 bits)
- es la aplicación independiente (debería funcionar en cualquier aplicación VBA: acceso, Excel, Outlook, PowerPoint, Word, …)
Powershell
No voy a entrar en una demostración completa, pero para cualquier persona interesada, puede recuperarlo fácilmente a través de PowerShell con un comando simple como:
(Get-Volume -DriveLetter C).FileSystemLabel
Donde C es la unidad de búsqueda, así que reemplace la C con cualquier letra de unidad que esté buscando recuperar la etiqueta.
Si quisiéramos, podríamos convertir esto fácilmente en una función reutilizable como:
function Get-VolumeLabel { param ( (Parameter(Mandatory = $true)) (string)$DriveLetter ) $volume = Get-Volume -DriveLetter $DriveLetter -ErrorAction SilentlyContinue if ($null -eq $volume) { "Drive not found" } elseif ((string)::IsNullOrEmpty($volume.FileSystemLabel)) { "No Label" } else { $volume.FileSystemLabel } }
Y luego úsalo haciendo (en este caso, las cotizaciones son opcionales pero me gusta incluirlas):
Get-VolumeLabel "C"
O
Get-VolumeLabel -DriveLetter "C"
Una vez más, reemplace C con la unidad que esté tratando de recuperar la etiqueta.
Solicitante del sistema
También puede recuperar la etiqueta a través del símbolo del sistema haciendo algo como:
Vol C: