3

アプリケーションに関して、Windows XP で問題があります。Windows XP では次のエラーが表示されますが、7/8 では正常に動作し、次に何をすべきかわかりません。この問題を調べたところ、WMI に関連していることがわかりました。Windows XP システムで WMI の修復を試みましたが、それでも機能しませんでした。

これは私が受け取っているエラーです:

************** 例外テキスト **************

System.Management.ManagementException: Not found at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode) at System.Management.PropertyData.RefreshPropertyInfo() at System.Management.PropertyDataCollection.get_Item(String propertyName) at System.Management.ManagementBaseObject.GetPropertyValue (String propertyName) で System.Management.ManagementBaseObject.get_Item(String propertyName)
で ?.?.(Object , EventArgs ) で System.Windows.Forms.Timer.OnTick(EventArgs e) で System.Windows.Forms.Timer.TimerNativeWindow .WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

上記のシステムで winmgmt サービスが実行されています。次に何をすべきかについて何か考えがある人はいますか?現在、バグを特定するために Windows XP をインストールしていますが、このサイトの経験豊富なメンバーの助けを借りることができます。

エラーをシミュレートするコードを次に示します。hdd.Get ループで停止します

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        TextBox1.Text = TextBox1.Text + vbNewLine + "Starting process"
        Try
            Dim HDD_Serial As String = Nothing
            TextBox1.Text = TextBox1.Text + vbNewLine + "Step 1"
            Dim hdd As New ManagementObjectSearcher("select * from Win32_DiskDrive")
            TextBox1.Text = TextBox1.Text + vbNewLine + "Step 2"
            For Each hd In hdd.Get
                TextBox1.Text = TextBox1.Text + vbNewLine + "Step 2.x"
                HDD_Serial = hd("SerialNumber")
            Next
            TextBox1.Text = TextBox1.Text + vbNewLine + "Step 3"
            HDD_Serial = HDD_Serial.Replace(" ", "")
            TextBox1.Text = TextBox1.Text + vbNewLine + "Step 4"
            Dim regkey As String = "0000-0000-0000-0000"
            TextBox1.Text = TextBox1.Text + vbNewLine + "Step 5"
            Dim sstring As String = regkey + "|" + HDD_Serial
            TextBox1.Text = TextBox1.Text + vbNewLine + "Step 6"
            sstring = AESEncrypt(sstring, "4545664456", "1251545478")
            TextBox1.Text = TextBox1.Text + vbNewLine + "Step 7"
            sstring = StrToHex(sstring)
            TextBox1.Text = TextBox1.Text + vbNewLine + "Step 8"
            Dim rk2 As RegistryKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\Test Key")
            TextBox1.Text = TextBox1.Text + vbNewLine + "Step 9"
            rk2.SetValue("regentry", sstring, RegistryValueKind.String)
            TextBox1.Text = TextBox1.Text + vbNewLine + "Step 10"
        Catch ex As Exception
            MessageBox.Show("Error")
            TextBox1.Text = TextBox1.Text + vbNewLine + vbNewLine + "-----------------------------------------------------" + vbNewLine + ex.ToString
        End Try
        TextBox1.Text = TextBox1.Text + vbNewLine + "End of log"
    End Sub

エラーの画像:

ここに画像の説明を入力

4

2 に答える 2

1

これに対する回避策を見つけることができました。最初に実行中の Windows のバージョンを検出し、次に Windows XP の場合は、WMI の代わりに API 呼び出しを使用して HDD ID を取得しました。バージョンが XP 以上の場合は、WMI を使用しました。私のアプリケーションは NET Framework 4.0 を使用しているため、以前のバージョンの Windows を確認する必要はありません。

<DllImport("kernel32.dll")> _
    Private Shared Function GetVolumeInformation(ByVal PathName As String, ByVal VolumeNameBuffer As StringBuilder, ByVal VolumeNameSize As Int32, ByRef VolumeSerialNumber As Int32, ByRef MaximumComponentLength As Int32, ByRef FileSystemFlags As Int32, ByVal FileSystemNameBuffer As StringBuilder, ByVal FileSystemNameSize As Int32) As Long
    End Function

    Friend Function GetVolumeSerial(ByVal strDriveLetter As String) As String

        Dim serNum As System.Int32 = 0
        Dim maxCompLen As System.Int32 = 0
        Dim VolLabel As StringBuilder = New StringBuilder(256)
        Dim VolFlags As Int32 = New Int32
        Dim FSName As StringBuilder = New StringBuilder(256)
        strDriveLetter += ":\"
        Dim Ret As Long = GetVolumeInformation(strDriveLetter, VolLabel, CType(VolLabel.Capacity, Int32), serNum, maxCompLen, VolFlags, FSName, CType(FSName.Capacity, Int32))
        Return Convert.ToString(serNum)
    End Function
于 2013-08-30T20:05:02.360 に答える