VB.NET System32路径FileNotFoundException

时间:2015-01-29 22:53:57

标签: vb.net

我有以下代码:


    Imports System.Management

    Module Module1
        Private MicrosoftProcs As New List(Of String)
        Private Sub FindMicrosoftProcs()
            Dim searcher As New ManagementObjectSearcher("SELECT * FROM Win32_Process")
            For Each p2 As ManagementObject In searcher.Get()
                If p2("Name") <> "System" Or p2("Name") <> "System Idle Process" Or p2("Name") <> Process.GetCurrentProcess.ProcessName & ".exe" Then
                    Dim x As String = p2("ExecutablePath")
                    If Not x Is Nothing Then
                        If x.Length > 2 Then
                            Dim fvi As System.Diagnostics.FileVersionInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo(p2("ExecutablePath").ToString)
                            Dim sDescription As String = fvi.CompanyName & "/" & fvi.LegalCopyright & "/" & fvi.LegalTrademarks & "/" & fvi.ProductName & "/" & fvi.FileDescription & "/"
                            If sDescription.ToLower.Contains("microsoft") Then
                                MicrosoftProcs.Add(p2("ExecutablePath"))
                                Debug.WriteLine("Microsoft process : " & p2("ExecutablePath"))
                            End If
                        End If
                    End If
                End If
            Next
        End Sub
    End Module

我正在使用64位Windows,但代码是为32位Windows编译的(兼容性)。如果我运行为64位编译的代码,我没有代码问题,但如果我运行它编译为32位我得到FileNotFoundException:


    A first chance exception of type 'System.IO.FileNotFoundException' occurred in System.dll
    System.IO.FileNotFoundException: C:\Windows\system32\csrss.exe
       at System.Diagnostics.FileVersionInfo.GetVersionInfo(String fileName)
       at WindowsApplication1.Form1.Button1_Click(Object sender, EventArgs e) in C:\Users\Maximus\Documents\Visual Studio 2010\Projects\rupe\rupe\Form1.vb:line 81

我不知道如何修复它。你能帮我吗 ?提前谢谢。

1 个答案:

答案 0 :(得分:0)

我似乎无法找到一个确切的答案,但我很确定问题是32位进程没有访问64位进程模块的权限。这就是为什么你的64位应用程序没有问题,但32位应用程序不喜欢某些进程。我能找到的最好的资源是另一个问题,你可以在这里阅读:System.ArgumentException and System.ComponentModel.Win32Exception when getting process information

话虽如此,当您运行32位应用程序时,似乎没有办法获取这些64位进程的文件信息。如果您绝对需要此信息,则别无选择,只能将应用程序构建为64位。如果你真的不需要这些信息,并希望继续使用32位应用程序中可以访问的进程,你可以尝试这样的事情:

Private Sub FindMicrosoftProcs()
    Try
        Dim searcher As New ManagementObjectSearcher("SELECT * FROM Win32_Process")

        For Each p2 As ManagementObject In searcher.Get()
            If p2("Name") <> "System" Or p2("Name") <> "System Idle Process" Or p2("Name") <> Process.GetCurrentProcess.ProcessName & ".exe" Then
                Dim x As String = p2("ExecutablePath")
                If Not x Is Nothing Then
                    If x.Length > 2 Then
                        Dim fvi As System.Diagnostics.FileVersionInfo

                        Try
                            fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(p2("ExecutablePath").ToString)
                            Dim sDescription As String = fvi.CompanyName & "/" & fvi.LegalCopyright & "/" & fvi.LegalTrademarks & "/" & fvi.ProductName & "/" & fvi.FileDescription & "/"
                            If sDescription.ToLower.Contains("microsoft") Then
                                MicrosoftProcs.Add(p2("ExecutablePath"))
                                Debug.WriteLine("Microsoft process : " & p2("ExecutablePath"))
                            End If
                        Catch ex As Exception
                            nSkipped += 1
                        End Try
                    End If
                End If
            End If
        Next

        MessageBox.Show("Found " & MicrosoftProcs.Count & " and skipped " & nSkipped & " files.")
    Catch ex As Exception
        MessageBox.Show("Error:  " & ex.Message)
    End Try
End Sub