none
利用WUA API 解析WSUSSCN2.cab获取未安装更新数据,函数需要5小时才返回结果?? RRS feed

  • 问题

  • 大家好,最近用WUA API 离线扫描wsusscn2.cab文件获取本地计算机系统未安装、已安装更新信息。

    同样的程序在windows 7上,IUpdateSearcher::Search需要3分钟左右返回结果,但是在windows xp sp3 (x86)上,这个函数需要一晚上(5小时)才能返回。

    具体测试环境:用VM 搭建的windows xp sp3系统虚拟机,1G 内存,双核酷睿CPU。

    xp系统我已经升级了最新的WUA 3.0,wuapi.dll升级为7.4。

    不管是调用异步BeginSearch函数还是同步Search函数,都是需要大约5小时才能返回。在此期间,一个svchost.exe进程长时间cpu占用100%。

    另外,我用MSDN上的vb脚本去获取当前更新信息,也是一样的情况。

    对这个问题,已经困扰我很久了,希望大家可以给我一些指点,非常感谢。

    贴上我部分代码:

       IUpdateSession*        UpdateSession        = NULL;
       IUpdateServiceManager* UpdateServiceManager = NULL;
       IUpdateService*        UpdateService        = NULL;
       IUpdateSearcher*       UpdateSearcher       = NULL;
       ISearchResult*         SearchResult         = NULL;
       IUpdateCollection*     UpdateCollection     = NULL;
       BSTR                   bstrServiceID        = NULL;
       ServerSelection        ss                   = { ssOthers } ;
    
       BOOL                   bReturn              = TRUE;
       HRESULT                lResult              = S_OK;
    
       lResult = CoCreateInstance (CLSID_UpdateSession, NULL, CLSCTX_INPROC_SERVER, IID_IUpdateSession, (LPVOID*)&UpdateSession);
       if ((UpdateSession == NULL) || FAILED(lResult))
       {
          DbgPrint ("LX,%d", ScanCpp);
          bReturn = FALSE;
          goto ReleaseHere;
       }
    
       lResult = CoCreateInstance (CLSID_UpdateServiceManager, NULL, CLSCTX_INPROC_SERVER, IID_IUpdateServiceManager, (LPVOID*)&UpdateServiceManager);
       if ((UpdateServiceManager == NULL) || FAILED(lResult))
       {
          DbgPrint ("LX,%d", ScanCpp);
          bReturn = FALSE;
          goto ReleaseHere;
       }
    
       lResult = UpdateServiceManager->AddScanPackageService (bstrSerName, bstrCabPath, 0, &UpdateService);
       if ((UpdateService == NULL) || (FAILED(lResult)))
       {
          DbgPrint ("LX,%d", ScanCpp);
          bReturn = FALSE;
          goto ReleaseHere;
       }
    
       lResult = UpdateSession->CreateUpdateSearcher (&UpdateSearcher);
       if (FAILED (lResult) || (UpdateSearcher == NULL))
       {
          DbgPrint ("LX,%d", ScanCpp);
          bReturn = FALSE;
          goto ReleaseHere;
       }
    
       lResult = UpdateSearcher->put_ServerSelection (ss);
       if (FAILED (lResult))
       {
          DbgPrint ("LX,%d", ScanCpp);
          bReturn = FALSE;
          goto ReleaseHere;
       }
    
       lResult = UpdateService->get_ServiceID (&bstrServiceID);
       if ((FAILED (lResult)) || (bstrServiceID == NULL))
       {
          DbgPrint ("LX,%d", ScanCpp);
          bReturn = FALSE;
          goto ReleaseHere;
       }
    
       lResult = UpdateSearcher->put_ServiceID (bstrServiceID);
       if ((FAILED (lResult)) || (bstrServiceID == NULL))
       {
          DbgPrint ("LX,%d", ScanCpp);
          bReturn = FALSE;
          goto ReleaseHere;
       }
       
       // 调用下面函数时,在xp系统上CPU长时间100%,而且几个小时不返回。。。
       lResult = UpdateSearcher->Search (
          bInstalled ? (_bstr_t("Type = 'Software' and IsInstalled = 1")) : (_bstr_t("Type = 'Software' and IsInstalled = 0")),
          &SearchResult);
       if ((FAILED (lResult)) || (SearchResult == NULL))
       {
          DbgPrint ("LX,%d", ScanCpp);
          bReturn = FALSE;
          goto ReleaseHere;
       }






    2013年11月18日 6:37

答案

全部回复

  • 你好,

    根据你的描述,首先我们可以排除代码本身的问题,因为代码都是可以正常运行的,只是运行时间的问题,所以我们关注的焦点应该是XP操作系统的问题。

    你可以尝试安装以下更新,在XP上再试试。

    Windows Search 4.0 for Windows XP (KB940157)

    http://www.microsoft.com/en-gb/download/details.aspx?id=23

    除此之外,我觉得之所以在XP上耗时长,主要原因是svchost.exe进程cpu占用100%的问题。因此从这个链接 我们可以找到如下解决方案,供你参考。

    Install KB2846071 for IE version 6:  http://www.microsoft.com/en-us/download/details.aspx?id=39519
    Or update IE to version 8:  http://www.microsoft.com/en-us/download/internet-explorer-8-details.aspx
    New info:  The best way is KB2870699.  It's resolve the problem with high CPU.
    http://technet.microsoft.com/en-us/security/bulletin/ms13-069

    如果上述方案仍然不能解决问题,建议你到Windows相关论坛咨询。

    Best Regards,

    May


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2013年11月19日 9:25
  • 感谢回复。

    我在我的windows xp sp3系统上试过您提供的方式后,问题依旧。这个问题困扰我很久了。

    奇怪的是windows xp sp1,sp2上运行此程序都很快的得到结果。反而更新成sp3后,WUA API扫描本地cab包就出现这样的结果。。。

    刚才看了一下虚拟机环境,wuapi.dll版本是7.1的话,会比较快的返回结果,但是更新成7.4后,就长时间不能返回了。

    仍然表示感谢。


    2013年11月20日 1:44
  • 你好,版主。感谢回复。

    请问,你所指的windows相关论坛是指那些论坛呢?能否给个链接?谢谢。

    2013年11月21日 2:42
  • 你好,

    感谢你的反馈。

    你可以到这个论坛咨询windows相关问题。

    http://answers.microsoft.com/en-us/windows/forum/windows_xp?tab=Threads


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2013年11月21日 7:10