|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visual Basic
WMI System Services Win32_LogicalDisk: WMI Method to Invoke Chkdsk |
|
Posted: | Thursday March 07, 2002 |
Updated: | Monday December 26, 2011 |
Applies to: | VB5, VB6 |
Developed with: | VB6, Windows XP |
OS restrictions: | Windows XP or later |
Author: | VBnet - Randy Birch |
Related: |
Win32_LogicalDisk: WMI Method to Invoke Chkdsk Win32_DiskDrive: WMI Disk Drive Information Win32_LogicalDisk: WMI Logical Disk Information |
Prerequisites | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Microsoft XP or later. A reference set in Projects / References to the Microsoft WMI Scripting Library. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Besides returning system information, the Windows Management Instrumentation classes also expose methods that can be called from VB. In addition, the WMI supports the executing of SQL-style calls to retrieve specific information. This demo shows how to perform a chkdsk against specific local fixed disks. The demo starts by pressing the Load Controls button, which passes a SQL string specifying we only want the LogicalDiskSet to return local fixed drives (DriveType 3). For each disk returned, the code loads, positions and captions a checkbox (right-aligned) and a label. On pressing the Run Chkdsk button, the code again retrieves the local fixed drives and again loops through them, comparing the drive letter (as a double-check) and checking for the corresponding check box to have a value of 1. If matched, the code calls the Chkdsk method, returning a string representing the success of the action. You will note from the illustration that on my XP box the FAT32 partition returned as an unknown file system. I'd like to hear from others with FAT and FAT32 partitions who try this code to see if you get the same response for the non-NTFS drives. And now, the caveats. Because this is a method called against a dataset returned from GetObject, it suffers the same limitations as using GetObject against MS Word or Excel ... if the chkdsk is running, and you click the form, the "Busy" dialog appears with the Switch To... option. So like all other GetObject methods, this too can not be interrupted once processing begins. This also means that your app may not repaint immediately if covered/uncovered. There is no workaround, as there is no place to stick a DoEvents... one Chkdsk is called, it must complete. I did not try with any but the default flags set (well actually, my initial tests were with all Chkdsk parameters False), so I can't comment on the effectiveness of the forced dismount or OK to schedule flags. Note: The MSDN states this method is applicable to NT-based systems only. For a complete listing of the information available by this class, see the table in the Comments section below. Note that some systems may not return information in all class properties. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
BAS Module Code | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
None. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Form Code | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
To a form add two command buttons (Command1, Command1). Add a checkbox with an index of 0 (Check1(0)), and a label the same (Label(0)). Assure a reference to the Microsoft WMI Scripting Library is set in Projects / References, and add the following to the form: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved. ' Some pages may also contain other copyrights by the author. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Distribution: You can freely use this code in your own ' applications, but you may not reproduce ' or publish this code on any web site, ' online service, or distribute as source ' on any media without express permission. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Sub Form_Load() Command1.Caption = "Load Controls" Command2.Caption = "Run Chkdsk" End Sub Private Sub Command1_Click() 'enumerates through all fixed local 'drives and creates a label and 'checkbox for each available local drive Dim LogicalDiskSet As SWbemObjectSet Dim disk As SWbemObject Dim msg As String Dim ssql As String Dim cnt As Long Dim x As Long ssql = "select Name from Win32_LogicalDisk where DriveType=3" Set LogicalDiskSet = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery(ssql) For Each disk In LogicalDiskSet 'create a checkbox and label 'for each local fixed drive 'since array elements(0) already 'exists, don't try to load it If cnt > 0 Then Load Check1(cnt) Load Label1(cnt) End If 'Position the new controls. 'Since I hard-coded the offsets and I develop 'at 1280 with small fonts, the values below 'may need tweaking for systems with different 'settings to position and align the loaded controls. With Check1(cnt) .Move 240, 300 + (cnt * 360), 600 .Caption = disk.Name .Enabled = True .Visible = True .Alignment = 1 .Value = 0 End With With Label1(cnt) .Move Check1(cnt).Left + Check1(cnt).Width + 100, 300 + (cnt * 360), 2500 .AutoSize = True .Enabled = True .Visible = True .Caption = "not included" End With cnt = cnt + 1 Next 'prevent reloading of controls Command1.Enabled = False 'clean up Set disk = Nothing Set LogicalDiskSet = Nothing End Sub Private Sub Command2_Click() Dim LogicalDiskSet As SWbemObjectSet Dim disk As SWbemObject Dim ssql As String Dim cnt As Long 'return a reference to the fixed disks ssql = "select Name,FileSystem from Win32_LogicalDisk where DriveType=3" Set LogicalDiskSet = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery(ssql) If LogicalDiskSet.Count > 0 Then 'loop through each returned disk For Each disk In LogicalDiskSet 'if the disk matched the 'checkbox caption and the 'checkbox was selected, 'perform chkdsk against the drive If disk.Name = Check1(cnt).Caption And _ Check1(cnt).Value = 1 Then 'since this can take a while 'indicate process has started Label1(cnt).Caption = "Running chkdsk against drive " & _ disk.Name & " ... please wait." Label1(cnt).Refresh 'show result of call Label1(cnt).Caption = Chkdsk(disk) & " (" & disk.FileSystem & ")" End If cnt = cnt + 1 Next End If 'clean up Set disk = Nothing Set LogicalDiskSet = Nothing End Sub Private Sub Check1_Click(Index As Integer) If Check1(Index).Value = 1 Then Label1(Index).Caption = "waiting to run command" Else Label1(Index).Caption = "not included" End If End Sub Private Function Chkdsk(disk As SWbemObject) As String 'chkdsk method parameters: '---------------------------- 'FixErrors : boolean 'Indicates what should be done to errors found ' on the disk. If true, then errors are fixed. 'The default is FALSE. ' 'VigorousIndexCheck : boolean 'If TRUE, a vigorous check of index 'entries should be performed. 'The default is TRUE. ' 'SkipFolderCycle : boolean 'If TRUE, the folder cycle checking 'should be skipped or not. 'The default is TRUE. ' 'ForceDismount : boolean 'If TRUE, the drive should be forced 'to dismount before checking. 'The default is FALSE. ' 'RecoverBadSectors : boolean 'If TRUE, the bad sectors should be located 'and the readable information should be 'recovered from these sectors. 'The default is FALSE. ' 'OKToRunAtBootUp : boolean 'If TRUE, the chkdsk operation should 'be performed at next boot up time, in 'case the operation could not be performed 'because the disk was locked at time 'the method was called. The default is FALSE. Select Case disk.Chkdsk(False, True, True, False, False, False) Case 0: Chkdsk = "Success - chkdsk completed" Case 1: Chkdsk = "Success - Disk locked - chkdsk scheduled on reboot" Case 2: Chkdsk = "Unknown file system" Case 3: Chkdsk = "Unknown error" End Select End Function |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comments | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
All information returned in the Win32_LogicalDisk class (note that some
systems may not return information in all class properties):
|
|
|
|||||
|
|||||
|
|||||
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |