• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ Korzystanie z klas WMI

Object Storage Arubacloud
0 głosów
221 wizyt
pytanie zadane 30 czerwca 2022 w C i C++ przez Hm Nowicjusz (140 p.)

Witam.Chciałbym wyciągnąć z pomocą c++ informację z biosu, poczytałem i znalazłem coś takiego 

[Dynamic, Provider("CIMWin32"), UUID("{8502C4E1-5FBB-11D2-AAC1-006008C78BC7}"), AMENDMENT]
class Win32_BIOS : CIM_BIOSElement
{
  uint16   BiosCharacteristics[];
  string   BIOSVersion[];
  string   BuildNumber;
  string   Caption;
  string   CodeSet;
  string   CurrentLanguage;
  string   Description;
  uint8    EmbeddedControllerMajorVersion;
  uint8    EmbeddedControllerMinorVersion;
  string   IdentificationCode;
  uint16   InstallableLanguages;
  datetime InstallDate;
  string   LanguageEdition;
  String   ListOfLanguages[];
  string   Manufacturer;
  string   Name;
  string   OtherTargetOS;
  boolean  PrimaryBIOS;
  datetime ReleaseDate;
  string   SerialNumber;
  string   SMBIOSBIOSVersion;
  uint16   SMBIOSMajorVersion;
  uint16   SMBIOSMinorVersion;
  boolean  SMBIOSPresent;
  string   SoftwareElementID;
  uint16   SoftwareElementState;
  string   Status;
  uint8    SystemBiosMajorVersion;
  uint8    SystemBiosMinorVersion;
  uint16   TargetOperatingSystem;
  string   Version;
};

Źródło: https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-bios?redirectedfrom=MSDN#properties

No więc, idąc dalej wyczytałem,że trzeba stworzyć nową instancję istniejącej klasy,więc wykonałem 

 

#include <wbemidl.h>

IWbemServices *pSvc;

	IWbemClassObject *pNewInstance = 0;
	IWbemClassObject *pExampleClass = 0;
	IWbemContext *pCtx = 0;
	IWbemCallResult *pResult = 0;

	BSTR PathToClass = SysAllocString(L"Win32_BIOS");
	HRESULT hRes = pSvc->GetObject(PathToClass, 0, pCtx,
				 &pExampleClass, &pResult);
	pExampleClass->SpawnInstance(0, &pNewInstance);

Kompilator mówi "unkown typename 'pExampleClass' " O co tu chodzi? Czy to znak,że funkcja nie zwróciła obiektu do tego wskaźnika? Jeszcze tu źródło funkci GetObject:  https://docs.microsoft.com/en-us/windows/win32/api/wbemcli/nf-wbemcli-iwbemservices-getobject

 

1 odpowiedź

0 głosów
odpowiedź 1 lipca 2022 przez j23 Mędrzec (194,920 p.)

Powinieneś załączyć <wbemcli.h>.

Czy to znak,że funkcja nie zwróciła obiektu do tego wskaźnika? 

Skoro "kompilator mówi", to znaczy, że funkcja nie miała jeszcze okazji czegokolwiek zwrócić, bo kod się nie skompilował (jest błąd), a więc też nie uruchomił.

komentarz 1 lipca 2022 przez Hm Nowicjusz (140 p.)

Na stronie docs było coś takiego "

Header

wbemcli.h (include Wbemidl.h) "

 

Założyłem,że wbemidl.h wystarczy,a załączenie wbemicl.h nic nie dało :/

komentarz 1 lipca 2022 przez j23 Mędrzec (194,920 p.)

Faktycznie, wystarczy załączyć <wbemidl.h>.

Daj przez załączeniem tego pliku #define _WIN32_DCOM

komentarz 2 lipca 2022 przez Hm Nowicjusz (140 p.)

Nadal nie osiągnąłem zamierzonego efektu,znalazłem więc przykład użycia metody z zamiarem wyekstrahowania sposobu na wyciągnięcie parametru.

#define _WIN32_DCOM

#include <vcl.h>
#include <cstdio>
#include <comdef.h>
#include <Wbemidl.h>

#pragma comment(lib, "wbemuuid.lib")
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

FILE *fl=fopen("C:/log.txt", "a");

int main(int iArgCnt, char ** argv)
{
	HRESULT hres;

	// Step 1: --------------------------------------------------
	// Initialize COM. ------------------------------------------

	hres =  CoInitializeEx(0, COINIT_MULTITHREADED);
	if (FAILED(hres))
	{
	 fputs("Failed to initialize COM library. Error code = 0x", fl);
     fclose(fl);
		return 1;                  // Program has failed.
	}

	// Step 2: --------------------------------------------------
	// Set general COM security levels --------------------------

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


    if (FAILED(hres))
    {
		fputs("Failed to initialize security. Error code = 0x", fl);
        fclose(fl);
		CoUninitialize();
		return 1;                      // Program has failed.
	}

	// Step 3: ---------------------------------------------------
	// Obtain the initial locator to WMI -------------------------

	IWbemLocator *pLoc = NULL;

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

	if (FAILED(hres))
	{
		fputs("Failed to create IWbemLocator object.Err code = 0x", fl);
		fclose(fl);
		CoUninitialize();
		return 1;                 // Program has failed.
	}

	// Step 4: ---------------------------------------------------
	// Connect to WMI through the IWbemLocator::ConnectServer method

	IWbemServices *pSvc = NULL;

	// Connect to the local root\cimv2 namespace
	// and obtain pointer pSvc to make IWbemServices calls.
	hres = pLoc->ConnectServer(
		_bstr_t(L"ROOT\\CIMV2"),
		NULL,
		NULL,
		0,
		NULL,
		0,
		0,
		&pSvc
	);

	if (FAILED(hres))
	{
		fputs("Could not connect. Error code = 0x", fl);
		fclose(fl);
		pLoc->Release();
		CoUninitialize();
		return 1;                // Program has failed.
	}

	fputs("Connected to ROOT\\CIMV2 WMI namespace", fl);
	fclose(fl);


	// Step 5: --------------------------------------------------
	// Set security levels for the proxy ------------------------

	hres = CoSetProxyBlanket(
		pSvc,                        // Indicates the proxy to set
		RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
		RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
		NULL,                        // Server principal name
		RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx
		RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
		NULL,                        // client identity
		EOAC_NONE                    // proxy capabilities
	);

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

	// Step 6: --------------------------------------------------
	// Use the IWbemServices pointer to make requests of WMI ----

	// set up to call the Win32_Process::Create method
	BSTR MethodName = SysAllocString(L"Create");
	BSTR ClassName = SysAllocString(L"Win32_Process");

	IWbemClassObject* pClass = NULL;
	hres = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL);

	IWbemClassObject* pInParamsDefinition = NULL;
	hres = pClass->GetMethod(MethodName, 0,
		&pInParamsDefinition, NULL);

	IWbemClassObject* pClassInstance = NULL;
	hres = pInParamsDefinition->SpawnInstance(0, &pClassInstance);

	// Create the values for the in parameters
	VARIANT varCommand;
	varCommand.vt = VT_BSTR;
	varCommand.bstrVal = _bstr_t(L"notepad.exe");

	// Store the value for the in parameters
	hres = pClassInstance->Put(L"CommandLine", 0,
		&varCommand, 0);
	wprintf(L"The command is: %s\n", V_BSTR(&varCommand));

	// Execute Method
	IWbemClassObject* pOutParams = NULL;
	hres = pSvc->ExecMethod(ClassName, MethodName, 0,
	NULL, pClassInstance, &pOutParams, NULL);

	if (FAILED(hres))
	{
		fputs("Could not execute method. Error code = 0x", fl);
        fclose(fl);
		VariantClear(&varCommand);
		SysFreeString(ClassName);
		SysFreeString(MethodName);
		pClass->Release();
		pClassInstance->Release();
		pInParamsDefinition->Release();
		pOutParams->Release();
		pSvc->Release();
		pLoc->Release();
		CoUninitialize();
		return 1;               // Program has failed.
	}

	// To see what the method returned,
	// use the following code.  The return value will
	// be in &varReturnValue
	VARIANT varReturnValue;
	hres = pOutParams->Get(_bstr_t(L"ReturnValue"), 0,
		&varReturnValue, NULL, 0);


	// Clean up
	//--------------------------
	VariantClear(&varCommand);
	VariantClear(&varReturnValue);
	SysFreeString(ClassName);
	SysFreeString(MethodName);
	pClass->Release();
	pClassInstance->Release();
	pInParamsDefinition->Release();
	pOutParams->Release();
	pLoc->Release();
	pSvc->Release();
	CoUninitialize();
	return 0;
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

Oto całość mojego pliku,przechodzi przez kompilator,jednk w pliku log.txt ni błędu ni komunikatu "Connected to ROOT\\CIMV2 WMI namespace".

komentarz 2 lipca 2022 przez j23 Mędrzec (194,920 p.)

Coś mi tu nie gra. Co tam robi TForm1? Skoro to konsolowa aplikacja, to może stwórz normalny projekt aplikacji konsolowej i w niej testuj kod. Teraz to nawet nie wiadomo, czy ten kod w ogóle jest uruchamiany (bo to, że się kompiluje, już wiemy).

komentarz 2 lipca 2022 przez Hm Nowicjusz (140 p.)
A więc to tak :D Może od tego trzeba było zacząć xd Chcę wywołać to w okienkach, spakowałem kod w funkcję bool, samą funkcję komplikowało ale przy próbie użycia dostawałem błąd.Więc wróciłem do main(),czyli trzeba tą funkcję edytować żeby śmigała w bool? Czy źle się do tego zabieram? Czy powodem błędu dla funkcji bool było to,że nic do niej nie wkładałem?
komentarz 2 lipca 2022 przez j23 Mędrzec (194,920 p.)

Nie wiem, bo nie znam treści błędu. Jeśli to ma być aplikacja okienkowa, to zrób normalny projekt aplikacji okienkowej, stwórz funkcję, która wyciąga info przy pomocy WMI i wywołuj ją w jakimś on-clicku (na potrzeby testów).

C++ Builder miał całkiem sensowny debugger, możesz go użyć do analizowania wykonania kodu.

Jeśli z jakichś powodów nie chcesz używać debuggera, wolisz system logów, to lepiej funkcję testować w aplikacji konsolowej, gdzie logi wysyłasz na standardowe wyjście std::cout. A jak już będziesz miał gotową funkcję, która zwraca wszystkie niezbędne dane, przenosisz ją do projektu okienkowego.

komentarz 3 lipca 2022 przez Hm Nowicjusz (140 p.)
Kompilator nie może zlinkować,czyli czegoś brakuje?

[ilink32 error] Error: Unresolved external '__stdcall_com_issue_error(long)' referenced from .../FILE1.OBJ.
komentarz 3 lipca 2022 przez j23 Mędrzec (194,920 p.)

Internety mówią, że wystarczy załączyć nagłówek <comdef.h>. Jak by to nic nie dało, dołącz jeszcze bibliotekę comsuppw.lib.

Podobne pytania

0 głosów
1 odpowiedź 165 wizyt
0 głosów
0 odpowiedzi 296 wizyt
pytanie zadane 10 lipca 2018 w C# przez Duch003 Początkujący (440 p.)
0 głosów
0 odpowiedzi 126 wizyt
pytanie zadane 17 stycznia 2020 w Systemy operacyjne, programy przez Kadordinni Początkujący (260 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...