Access

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:

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba