2012-06-24 87 views
0

我想通過使用WMI傳遞命令行參數來找出作業ID。 int main(int argc,char ** argv) { HRESULT hres;WMI編程找到作業ID

// Initialize COM. 
hres = CoInitializeEx(0, COINIT_MULTITHREADED); 
if (FAILED(hres)) 
{ 
    cout << "Failed to initialize COM library. " 
     << "Error code = 0x" 
     << hex << hres << endl; 
    return 1;    // Program has failed. 
} 

// Initialize 
hres = CoInitializeSecurity(
    NULL,  
    -1,  // COM negotiates service     
    NULL, // Authentication services 
    NULL, // Reserved 
    RPC_C_AUTHN_LEVEL_DEFAULT, // authentication 
    RPC_C_IMP_LEVEL_IMPERSONATE, // Impersonation 
    NULL,    // Authentication info 
    EOAC_NONE,  // Additional capabilities 
    NULL    // Reserved 
    ); 


if (FAILED(hres)) 
{ 
    cout << "Failed to initialize security. " 
     << "Error code = 0x" 
     << hex << hres << endl; 
    CoUninitialize(); 
    return 1;   // Program has failed. 
} 

// Obtain the initial locator to Windows Management 
// on a particular host computer. 
IWbemLocator *pLoc = 0; 

hres = CoCreateInstance(
    CLSID_WbemLocator,    
    0, 
    CLSCTX_INPROC_SERVER, 
    IID_IWbemLocator, (LPVOID *) &pLoc); 

if (FAILED(hres)) 
{ 
    cout << "Failed to create IWbemLocator object. " 
     << "Error code = 0x" 
     << hex << hres << endl; 
    CoUninitialize(); 
    return 1;  // Program has failed. 
} 

IWbemServices *pSvc = 0; 

// Connect to the root\cimv2 namespace with the 
// current user and obtain pointer pSvc 
// to make IWbemServices calls. 

hres = pLoc->ConnectServer(

    _bstr_t(L"ROOT\\CIMV2"), // WMI namespace 
    NULL,     // User name 
    NULL,     // User password 
    0,      // Locale 
    NULL,     // Security flags     
    0,      // Authority  
    0,      // Context object 
    &pSvc     // IWbemServices proxy 
    );        

if (FAILED(hres)) 
{ 
    cout << "Could not connect. Error code = 0x" 
     << hex << hres << endl; 
    pLoc->Release();  
    CoUninitialize(); 
    return 1;    // Program has failed. 
} 

cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl; 

// Set the IWbemServices proxy so that impersonation 
// of the user (client) occurs. 
hres = CoSetProxyBlanket(

    pSvc,       // the proxy to set 
    RPC_C_AUTHN_WINNT,   // authentication service 
    RPC_C_AUTHZ_NONE,    // authorization service 
    NULL,       // Server principal name 
    RPC_C_AUTHN_LEVEL_CALL,  // authentication level 
    RPC_C_IMP_LEVEL_IMPERSONATE, // impersonation level 
    NULL,       // client identity 
    EOAC_NONE      // proxy capabilities  
); 

if (FAILED(hres)) 
{ 
    cout << "Could not set proxy blanket. Error code = 0x" 
     << hex << hres << endl; 
    pSvc->Release(); 
    pLoc->Release();  
    CoUninitialize(); 
    return 1;    // Program has failed. 
} 


// Use the IWbemServices pointer to make requests of WMI. 
// Make requests here: 

// For example, query for all the running processes 
IEnumWbemClassObject* pEnumerator = NULL; 
hres = pSvc->ExecQuery(
    bstr_t("WQL"), 
    bstr_t("SELECT * FROM Win32_Process where CommandLine like 'commandLineString'"), 
    WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
    NULL, 
    &pEnumerator); 
cout << " After execquery"<< endl ; 
if (FAILED(hres)) 
{ 
    cout << "Query for processes failed. " 
     << "Error code = 0x" 
     << hex << hres << endl; 
    pSvc->Release(); 
    pLoc->Release();  
    CoUninitialize(); 
    return 1;    // Program has failed. 
} 
else 
{ 
    IWbemClassObject *pclsObj; 
    ULONG uReturn = 0; 

    while (pEnumerator) 
    { 
     hres = pEnumerator->Next(WBEM_INFINITE, 1, 
      &pclsObj, &uReturn); 

     if(0 == uReturn) 
     { 
      break; 
     } 

     VARIANT vtProp; 

     // Get the value of the Name property 
     hres = pclsObj->Get(L"ProcessId", 0, &vtProp, 0, 0); 
     int processId = (int)vtProp.intVal; 
     cout << "Process ID : " << processId << endl;   

     DWORD dwProcessId = (DWORD) processId; 
     DWORD dwDesiredAccess = PROCESS_TERMINATE; 
     BOOL bInheritHandle = FALSE; 
     HANDLE hProcess = OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId); 
     if (hProcess == NULL) 
     { 
      cout << "hProcess is null " << endl; 
     }else { 
     BOOL result = TerminateProcess(hProcess, 1); 
     CloseHandle(hProcess); 
     cout << "Process is terminated " << result <<endl; 
     } 
    } // while   
} // else 

// Cleanup 
// ======== 

pLoc->Release(); 
pSvc->Release(); 
CoUninitialize(); 
getchar(); 
return 0; // Program successfully completed. 

}

以上是C++代碼,我的問題是如何在我訪問NSIS結構。 像下面的線上面的代碼

1. hres = pLoc->ConnectServer(
2. hres = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); 
3. hres = pclsObj->Get 

請幫我在這...

+0

它們不是結構,它們是COM接口中的方法... – Anders

回答

1

你看了WmiInspector插件?或者,使用您現有的C++代碼創建一個custom plugin

要調用在NSIS Windows的API或一個COM接口,你必須使用系統插件:

!include LogicLib.nsh 
!define CLSCTX_INPROC_SERVER 0x1 
!define CLSID_ApplicationAssociationRegistrationUI {1968106d-f3b5-44cf-890e-116fcb9ecef1} 
!define IID_IApplicationAssociationRegistrationUI {1f76a169-f994-40ac-8fc8-0959e8874710} ;[Vista+] 

section 
;NSIS has called CoInitialize 
System::Call 'OLE32::CoCreateInstance(g "${CLSID_ApplicationAssociationRegistrationUI}",i 0,i ${CLSCTX_INPROC_SERVER},g "${IID_IApplicationAssociationRegistrationUI}",*i.r1)i.r0' ;ptr is now in $1 and hr in $0 
${If} $1 <> 0 
    System::Call '$1->3(w "Internet Explorer")i.r0' ;IApplicationAssociationRegistrationUI::LaunchAdvancedAssociationUI 
    System::Call '$1->2()' ;IUnknown::Release 
${EndIf} 
sectionend 

您必須手動查找的IID和虛函數表這麼使用大量COM的是方法抵消不會很有趣...

+0

我的意思是從結構中訪問方法。像這樣使用$ 1-> 3就像硬編碼不是嗎?是否有任何其他方式使用系統插件(這是在2.46版本中)。請詳細告訴我「 - > 3」意思是 – user1234

+0

$ 1-> 2()在系統語法中表示:$ 1是接口的地址, - >表示這是對COM方法的調用,2是方法在Vtable中的偏移量(Queryinterface = 0,AddRef = 1,Release = 2,第一個非IUnknown方法是3)。有關更多信息,請參閱http://blogs.msdn.com/b/oldnewthing/archive/2004/02/05/68017.aspx ... – Anders

+0

有關調用COM的稍微好一些的方法,請參閱http://nsis.svn.sourceforge .net/viewvc/nsis/NSIS/trunk/Include/Win/COM.nsh?view =標記(你將不得不將所有的p類型改爲2.46) – Anders