//---------------------------------------------------------------------------
#include <vcl.h>
#include <windows.h>
#include <Wbemidl.h>
#pragma hdrstop
#pragma argsused
//---------------------------------------------------------------------------
String WMIInfo(String wsClass, String wsType)
{
String Result = "brak wartości";
IWbemLocator *pWbemLocator = NULL;
if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator)
== S_OK)
{
IWbemServices *pWbemServices = NULL;
String wsNamespace = L"ROOT\\CIMV2";
if(pWbemLocator->ConnectServer( wsNamespace.w_str(), NULL, NULL, NULL, 0, NULL,
NULL, &pWbemServices) == S_OK)
{
if (CoSetProxyBlanket(
pWbemServices,
RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_NONE,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE
) != S_OK)
{
return "błąd Proxy";
}
IEnumWbemClassObject *pEnumClassObject = NULL;
String wsWQL = "WQL", wsQuery = "SELECT * FROM " + wsClass;
if(pWbemServices->ExecQuery( wsWQL.w_str(), wsQuery.w_str(),
WBEM_FLAG_RETURN_IMMEDIATELY,
NULL, &pEnumClassObject) == S_OK)
{
IWbemClassObject *pClassObject = NULL;
ULONG uCount = 1, uReturned;
if(pEnumClassObject->Reset() == S_OK)
{
while(pEnumClassObject->Next( WBEM_INFINITE, uCount, &pClassObject, &uReturned)
== S_OK)
{
SAFEARRAY *pvNames = NULL;
if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN,
NULL, &pvNames) == S_OK)
{
long vbl, vbu;
SafeArrayGetLBound(pvNames, 1, &vbl);
SafeArrayGetUBound(pvNames, 1, &vbu);
for(long idx = vbl; idx <= vbu; idx++)
{
long aidx = idx;
wchar_t *wsName = 0;
VARIANT vValue;
VariantInit(&vValue);
SafeArrayGetElement(pvNames, &aidx, &wsName);
BSTR bs = SysAllocString(wsName);
HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
SysFreeString(bs);
if(hRes == S_OK)
{
AnsiString lValue;
Variant vVar = *(Variant*)&vValue;
if(vVar.IsArray())
{
for(int i = vVar.ArrayLowBound(); i <= vVar.ArrayHighBound(); i++)
{
Variant vTmp = vVar.GetElement(i);
if(!lValue.IsEmpty()) lValue += ", ";
lValue += VarToStr(vTmp);
}
}
else
{
lValue = VarToStr(vVar);
}
if( String(wsName).LowerCase() == wsType.LowerCase() )
{
if( lValue.IsEmpty() ) Result = "brak wartości";
else Result = lValue;
}
}
VariantClear(&vValue);
SysFreeString(wsName);
}
}
if(pvNames) SafeArrayDestroy(pvNames);
}
}
if(pClassObject) pClassObject->Release();
}
if(pEnumClassObject) pEnumClassObject->Release();
}
if(pWbemServices) pWbemServices->Release();
}
if(pWbemLocator) pWbemLocator->Release();
return Result.Trim();
}
//---------------------------------------------------------------------------
char *WMIResources[] =
{
"Win32_1394Controller",
"Win32_BaseBoard",
"Win32_Battery",
"Win32_BIOS",
"Win32_Bus",
"Win32_CacheMemory",
"Win32_CurrentProbe",
"Win32_DesktopMonitor",
"Win32_DeviceMemoryAddress",
"Win32_DiskDrive",
"Win32_DisplayConfiguration",
"Win32_DisplayControllerConfiguration",
"Win32_DMAChannel",
"Win32_Fan",
"Win32_FloppyController",
"Win32_FloppyDrive",
"Win32_HeatPipe",
"Win32_IDEController",
"Win32_InfraredDevice",
"Win32_IRQResource",
"Win32_Keyboard",
"Win32_MemoryArray",
"Win32_MemoryDevice",
"Win32_MotherboardDevice",
"Win32_NetworkAdapter",
"Win32_NetworkAdapterConfiguration",
"Win32_OnBoardDevice",
"Win32_ParallelPort",
"Win32_PCMCIAController",
"Win32_PhysicalMemory",
"Win32_PhysicalMemoryArray",
"Win32_PnPEntity",
"Win32_PointingDevice",
"Win32_PortableBattery",
"Win32_PortConnector",
"Win32_PortResource",
"Win32_POTSModem",
"Win32_PowerManagementEvent",
"Win32_Printer",
"Win32_PrinterConfiguration",
"Win32_PrintJob",
"Win32_Processor",
"Win32_Refrigeration",
"Win32_SerialPort",
"Win32_SerialPortConfiguration",
"Win32_SMBIOSMemory",
"Win32_SoundDevice",
"Win32_SystemEnclosure",
"Win32_SystemMemoryResource",
"Win32_SystemSlot",
"Win32_TapeDrive",
"Win32_TemperatureProbe",
"Win32_UninterruptiblePowerSupply",
"Win32_USBController",
"Win32_VideoConfiguration",
"Win32_VideoController",
"Win32_VoltageProbe",
"Win32_CDROMDrive",
NULL
};
extern "C" __declspec(dllexport)AnsiString __fastcall HDD_SN_0(int MajV1, int MinV1) { //pobiera numer seryjny dysku twardego zależnie od wersji systemu: int MajV1 - główny numer systemu (np. 5 dla WinXp), int MinV1 - podrzędny numer systemu, po kropce (np. 1 dla WinXP)
int MV1 = MajV1;
int MiV1 = MinV1;
CoInitializeEx(0, COINIT_MULTITHREADED);
ShowMessage(CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT/*RPC_C_AUTHN_LEVEL_DEFAULT*/, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL ));
::SetCursor(LoadCursor(NULL, IDC_WAIT));
AnsiString SN0;
if (MV1 == 6) {
if (MiV1 >= 0) {
SN0 = WMIInfo("Win32_DiskDrive WHERE Index = 0", "SerialNumber");
}
}
CoUninitialize();
::SetCursor(LoadCursor(NULL, NULL));
return SN0;
}
extern "C" __declspec(dllexport)void Un1(void) { //zamknięcie interfejsu WMI
CoUninitialize();
}