<?

// Объем оперативной памяти
function TotalPhysicalMemoryMB() {
	static $CIMV2;

	if($CIMV2 === null)
		$CIMV2 = new com('winmgmts://localhost/root/CIMV2');

	// эту наркоманию писал не я!
	foreach($CIMV2->execQuery("Select * from Win32_ComputerSystem") as $v)
		$res = $v->TotalPhysicalMemory/1024/1024;

	return $res;
}

// проходит по всем дискам и возвращает максимальную температуру
// при первом запуске можно подвиснуть на пару секунд
/*

procedure GetTemperature(var Airflow, HDA, Temperature: Integer);
var
  objLocator: ISWbemLocator;
  objServices: ISWbemServices;
  objObjectSet: ISWbemObjectSet;
  EnumSet: IEnumVariant;
  SetVar: OleVariant;
  Fetched: Cardinal;
  objObject: ISWbemObject;
  objProperty: ISWbemProperty;
  v: OleVariant;
  i: Integer;
begin
  Airflow:=-1;
  HDA:=-1;
  Temperature:=-1;
  objLocator:=CreateComObject(CLASS_SWbemLocator) as ISWbemLocator;
  objServices:=objLocator.ConnectServer('', 'root\WMI', '', '', '', '', 0, nil);
  objObjectSet:=objServices.ExecQuery('select * from MSStorageDriver_ATAPISmartData', 'WQL', 0, nil);
  EnumSet:=IUnknown(objObjectSet._NewEnum) as IEnumVariant;
  while EnumSet.Next(1, SetVar, Fetched)=S_OK do
  begin
    objObject:=IUnknown(SetVar) as ISWbemObject;
    objProperty:=objObject.Properties_.Item('VendorSpecific', 0);
    if (objProperty.CIMType=wbemCimtypeUint8) and objProperty.IsArray then
    begin
      v:=objProperty.Get_Value;
      for i:=0 to ((VarArrayHighBound(v, 1)-1) div 12)-1 do
      begin
        if v[2+i*12]=190 then Airflow:=v[2+i*12+3];
        if v[2+i*12]=194 then HDA:=v[2+i*12+3];
        if v[2+i*12]=231 then Temperature:=v[2+i*12+3];
      end;
    end;
  end;
end;

только нужно исправить код для нескольких жестких дисков, иначе будет выдавать для последнего.

*/
function MaxTemprAllDisk() {
	STATIC $wmi;

	if($wmi === null)
		$wmi = new COM('winmgmts://localhost/root/WMI'); 

	if(!$wmi)
		return 0;

	$obj = $wmi->execQuery("SELECT InstanceName, VendorSpecific FROM MSStorageDriver_ATAPISmartData"); 
	if(!$obj) 
		return 0;

	$max_tempr = 0;
	foreach($obj as $id) { 
	    //$temp .= $id->InstanceName._BR_; 
	    $VendorSpecific = $id->VendorSpecific; 
	    for($i=0; $i<=361; $i++) { 
	        if($VendorSpecific[$i] == 194) { 
	        	$tempr = $VendorSpecific[($i+5)];
	        	if($tempr > $max_tempr) {
	        		$max_tempr = $tempr;
	        	}
	        	break;
	        } 
	    } 
	} 

	return $max_tempr;
}

?>