Click here to Skip to main content
15,885,366 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I m new to vb.net and i have been working on this application to get remote machines infomration in our network. I had the code working fine till i used a back ground worker. now when it runs it pulls information but in the current user, ram, and harddrive size when i reset the fields it clears it but then comes back with the new information and the old right next to it. Its like its olding data and wont relsease it. I have tried using the dispose command and even having it create a new worker everytime it runs. Any help would be great.

The code works if i have it outside of the background worker but when i do that it locks the application up till its done pulling the information.

Sorry for the long code but i wanted to make sure you could see what i was working with code wise.

VB
Public OSNAME As String
Public SERVICEPACK As String
Public IMAGEDATE As String
Public LASTREBOOT As String
Public PAGEFILE As String
Public DOMAINRESULT As String
Public PCMODEL As String
Public RAMTOTAL As String
Public LOGGEDINUSER As String
Public FREEDRIVESPACE As String
Public EXTDRIVE1 As String
Public EXTDRIVE2 As String
Public EXTDRIVE3 As String
Public IPADDRESS As String
Public MACADDRESS As String
Public DNSRESULT As String
Public TIMEZONE1 As String
Public VIDEORES As String
Private Sub BackgroundWorkerMachineInfo_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorkerMachineInfo.DoWork
    Dim MyObjSearcher As System.Management.ManagementObjectSearcher
    Dim MyColl As System.Management.ManagementObjectCollection
    Dim MyObj As System.Management.ManagementObject
        Dim MyConOptions As New System.Management.ConnectionOptions
        With MyConOptions
            .Impersonation = System.Management.ImpersonationLevel.Impersonate
            ' This entry required for Windows XP and newer
            .Authentication = System.Management.AuthenticationLevel.Packet
        End With
        ' Connect to WMI namespace
        Dim MyMgtScope As System.Management.ManagementScope
        MyMgtScope = New System.Management.ManagementScope("\\" & strComputer & "\root\cimv2", MyConOptions)
        MyMgtScope.Connect()
        If MyMgtScope.IsConnected = False Then
            ' Error connecting to computer
            Exit Sub
        End If
    '----------------------------------------------------------------------------
    'Basic machine INnformation for the left column
    '----------------------------------------------------------------------------
        Try
            ' Get data from  Win32_OperatingSystem WMI
            MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
                    "Select * FROM Win32_OperatingSystem")
            ' Execute the query
            MyColl = MyObjSearcher.Get
        For Each MyObj In MyColl
            OSNAME += (MyObj("caption").ToString())
            If OSNAME = "Microsoft Windows 7 Enterprise " Then
                OSNAME = "Windows 7"
                WIN7_UNC_Users.Visibility = ElementVisibility.Visible
                UNC_CDRIVE.Visibility = ElementVisibility.Visible
                UNC_HostFile.Visibility = ElementVisibility.Visible
                UNC_RoamingProfile.Visibility = ElementVisibility.Visible
                WIN7_UNC_Zservice.Visibility = ElementVisibility.Visible
                UNC_Temp.Visibility = ElementVisibility.Visible
                WINXP_UNC_DDRIVE.Visibility = ElementVisibility.Collapsed
                WINXP_UNC_Users.Visibility = ElementVisibility.Collapsed
                WINXP_UNC_Zservice.Visibility = ElementVisibility.Collapsed
            End If
            If OSNAME = "Microsoft Windows XP Professional" Then
                OSNAME = "Windows XP"
                WIN7_UNC_Users.Visibility = ElementVisibility.Collapsed
                UNC_CDRIVE.Visibility = ElementVisibility.Visible
                UNC_HostFile.Visibility = ElementVisibility.Visible
                UNC_RoamingProfile.Visibility = ElementVisibility.Visible
                WIN7_UNC_Zservice.Visibility = ElementVisibility.Collapsed
                UNC_Temp.Visibility = ElementVisibility.Visible
                WINXP_UNC_DDRIVE.Visibility = ElementVisibility.Visible
                WINXP_UNC_Users.Visibility = ElementVisibility.Visible
                WINXP_UNC_Zservice.Visibility = ElementVisibility.Visible
                RDC_Button_Header.Visibility = ElementVisibility.Collapsed
            End If
        Next

    Catch ex As Exception
        'An error occured getting data, display what we did get
        OSNAME = "UnKnown"
    End Try
    Try
        ' Get data from  Win32_OperatingSystem WMI
        MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
                "Select * FROM Win32_OperatingSystem")
        ' Execute the query
        MyColl = MyObjSearcher.Get
        For Each MyObj In MyColl
            SERVICEPACK = (MyObj("servicepackmajorversion").ToString())
            IMAGEDATE = ManagementDateTimeConverter.ToDateTime(CStr(MyObj("InstallDate")))
            LASTREBOOT = ManagementDateTimeConverter.ToDateTime(CStr(MyObj("LastBootUpTime")))
        Next
    Catch ex As Exception
        'An error occured getting data, display what we did get
        SERVICEPACK = "Unavailable"
        IMAGEDATE = "Unavailable"
        LASTREBOOT = "Unavailable"
    End Try
    Try
        ' Get data from  Win32_PageFileUsage WMI
        MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
                "Select * FROM Win32_PageFileUsage")
        ' Execute the query
        MyColl = MyObjSearcher.Get
        For Each MyObj In MyColl
            PAGEFILE = (MyObj("AllocatedBaseSize").ToString())
        Next
    Catch ex As Exception
        'An error occured getting data, display what we did get
        PAGEFILE = "Unavailable"
    End Try
    Try
        ' Get data from Win32_ComputerSystem_WMI
        MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
                "Select * FROM Win32_ComputerSystem")
        ' Execute the query
        MyColl = MyObjSearcher.Get
        For Each MyObj In MyColl
            DOMAINRESULT = (MyObj("Domain").ToString())
            PCMODEL = (MyObj("Model").ToString())
            RAMTOTAL += Reformat_TB_GB_MB(MyObj("TotalPhysicalMemory").ToString())
        Next
    Catch ex As Exception
        'An error occured getting data, display what we did get
        DOMAINRESULT = "Unavailable"
        PCMODEL = "Unavailable"
        RAMTOTAL = "Unavailable"
    End Try
    Try
        ' Get data from Win32_ComputerSystem_WMI
        MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
                "Select * FROM Win32_ComputerSystem")
        ' Execute the query
        MyColl = MyObjSearcher.Get
        For Each MyObj In MyColl
            LOGGEDINUSER += (MyObj("Username").ToString())
        Next
    Catch ex As Exception
        'An error occured getting data, display what we did get
        LOGGEDINUSER = "No One Is Logged In"
    End Try
    Try
        ' Get data from  Win32_LogicalDisk WMI
        MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
                "SELECT * From Win32_LogicalDisk WHERE caption = 'C:'")
        ' Execute the query
        MyColl = MyObjSearcher.Get
        For Each MyObj In MyColl
            FREEDRIVESPACE = "C:\" & Reformat_TB_GB_MB(MyObj("Freespace").ToString())
        Next
    Catch ex As Exception
        'An error occured getting data, display what we did get
        FREEDRIVESPACE = "No Media Connected"
    End Try
    Try
        ' Get data from  Win32_LogicalDisk WMI
        MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
                "SELECT * From Win32_LogicalDisk WHERE caption = 'E:' And DriveType <> 5")
        ' Execute the query
        MyColl = MyObjSearcher.Get
        For Each MyObj In MyColl
            EXTDRIVE1 = (MyObj("caption").ToString()) + " " & Reformat_TB_GB_MB(MyObj("Freespace").ToString())
        Next
        If EXTDRIVE1 = "" Then
            EXTDRIVE1 = "No Media Connected"
        End If
    Catch ex As Exception
        'An error occured getting data, display what we did get
        EXTDRIVE1 = "Error"
    End Try
    Try
        ' Get data from  Win32_LogicalDisk WMI
        MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
                "SELECT * From Win32_LogicalDisk WHERE caption = 'F:' And DriveType <> 5")
        ' Execute the query
        MyColl = MyObjSearcher.Get
        For Each MyObj In MyColl
            EXTDRIVE2 = (MyObj("caption").ToString()) + " " & Reformat_TB_GB_MB(MyObj("Freespace").ToString())
        Next
        If EXTDRIVE2 = "" Then
            EXTDRIVE2 = "No Media Connected"
        End If
    Catch ex As Exception
        'An error occured getting data, display what we did get
        EXTDRIVE2 = "Error"
    End Try
    Try
        ' Get data from  Win32_LogicalDisk WMI
        MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
                "SELECT * From Win32_LogicalDisk WHERE caption = 'F:' And DriveType <> 5")
        ' Execute the query
        MyColl = MyObjSearcher.Get
        For Each MyObj In MyColl
            EXTDRIVE3 = (MyObj("caption").ToString()) + " " & Reformat_TB_GB_MB(MyObj("Freespace").ToString())
        Next
        If EXTDRIVE3 = "" Then
            EXTDRIVE3 = "No Media Connected"
        End If
    Catch ex As Exception
        'An error occured getting data, display what we did get
        EXTDRIVE3 = "Error"
    End Try
    Try
        ' Get data from Win32_ComputerSystem_WMI
        MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
                "Select * FROM Win32_VideoController Where DeviceID = 'VideoController1'")
        ' Execute the query
        MyColl = MyObjSearcher.Get
        For Each MyObj In MyColl
            Dim VideoResHorizontal = (MyObj("CurrenthorizontalResolution").ToString())
            Dim VideoResVertical = (MyObj("CurrentVerticalResolution").ToString())
            VIDEORES = VideoResHorizontal + " x " & VideoResVertical
        Next
    Catch ex As Exception
        'An error occured getting data, display what we did get
        VIDEORES = "Unavailable"
    End Try
    Try
        ' Get Network Info from Win32_NetworkAdapterConfiguration_WMI
        MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
                "Select * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
        ' Execute the query
        MyColl = MyObjSearcher.Get
        For Each MyObj In MyColl
            If Not IsDBNull(MyObj.GetPropertyValue("IPAddress")) Then
                Dim IP As Array = MyObj.GetPropertyValue("IPAddress")
                For i = 0 To LBound(IP)
                    IPADDRESS = IP(i)
                    MACADDRESS = (MyObj("Macaddress").ToString())
                    DNSRESULT = (MyObj("DnsDomain").ToString())
                Next
            End If
        Next
    Catch ex As Exception
        'An error occured getting data, display what we did get
        IPADDRESS = "Unknown"
        MACADDRESS = "Unknown"
        DNSRESULT = "Unknown"
    End Try
    Try
        ' Get data from  Win32_TimeZone WMI
        MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString, _
                "Select * FROM Win32_TimeZone")
        ' Execute the query
        MyColl = MyObjSearcher.Get
        For Each MyObj In MyColl
            TIMEZONE1 = (MyObj("DayLightName").ToString())
        Next
    Catch ex As Exception
        'An error occured getting data, display what we did get
        TIMEZONE1 = "Unavailable"
    End Try
End Sub
Private Sub BackgroundWorkerMachineInfo_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorkerMachineInfo.RunWorkerCompleted
    OS_Result_Machine_Table.Text = OSNAME
    Service_Pack_Result_Machine_Table.Text = SERVICEPACK
    Image_Date_Result_Machine_Table.Text = IMAGEDATE
    Last_Reboot_Result_Machine_Table.Text = LASTREBOOT
    Pagefile_Size_Result_Machine_Table.Text = PAGEFILE + " MB"
    Domain_Result_Machine_Table.Text = DOMAINRESULT
    PC_Model_Result_Machine_Table.Text = PCMODEL
    RAM_Total_Result_Machine_Table.Text = RAMTOTAL
    Loggedin_User_Result_Machine_Table.Text = LOGGEDINUSER
    Free_Drive_Space_Result_Machine.Text = FREEDRIVESPACE
    Ext1_Drive_Space_Result_Machine.Text = EXTDRIVE1
    Ext2_Drive_Space_Result_Machine.Text = EXTDRIVE2
    Ext3_Drive_Space_Result_Machine.Text = EXTDRIVE3
    VideoRes_Result_Machine_Table.Text = VIDEORES
    IP_Address_Result_Machine_Table.Text = IPADDRESS
    MAC_Result_Machine_Table.Text = MACADDRESS
    DNS_Result_Machine_Table.Text = DNSRESULT
    TimeZone_Result_Machine_Table.Text = TIMEZONE1
    '----------------------------------------------------------------------
    UNC_Links_Header.Enabled = True
    Machine_Name_Textbox_Header.Enabled = True
End Sub

Private Sub Stop_Button_Header_Click(sender As System.Object, e As System.EventArgs) Handles Stop_Button_Header.Click
    BackgroundWorkerMachineInfo.CancelAsync()
End Sub
Posted
Updated 3-Jan-12 10:43am
v2
Comments
Wendelius 3-Jan-12 16:44pm    
Pre tags added

1 solution

I'm not sure, you might try looking into
VB
control.checkForIllegalcrossthreadcalls=false

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.checkforillegalcrossthreadcalls.aspx[^]
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900