delphi запрос к бд wmic постоянно возвращает разные результаты

Цель получить серийник диска. На машине нет жесткого диска и ответ должен всегда = Null однако запрос постоянно возвращает разные символы

Ниже лог где получаю номер диска и его модель

После построчного дебага пришел к тому что это сама база выдает такое или интерфейс кривой. Но как иногда NULL а иногда абракадабра?

Приведенный ниже запрос это аналог cmd wmic diskdrive get serialnumber

function MagWmiGetDiskSerial (drive: integer): string ;
begin
    result := '' ;
    MagWmiGetOneQ ('SELECT SerialNumber FROM Win32_PhysicalMedia '
    +'WHERE ' +  'Tag = "\\\\.\\PHYSICALDRIVE' + IntToStr (drive) + '"'
       , 'SerialNumber', Result) ;
end ;
NULL
Red Hat VirtIO SCSI Disk Device

NULL
Red Hat VirtIO SCSI Disk Device

NULL
Red Hat VirtIO SCSI Disk Device

аяяШІІаяяШІІаяя
Red Hat VirtIO SCSI Disk Device

иІІаяя
Red Hat VirtIO SCSI Disk Device

ДОП ИНФА О ЗАПРОСЕ

function MagWmiGetOneQ (const Arg, Prop: widestring ; var ResStr: string): integer ;
var
    wmiLocator: TSWbemLocator;
    wmiServices: ISWbemServices;
    wmiObjectSet: ISWbemObjectSet;
    wmiObject: ISWbemObject;
    wmiProp: ISWbemProperty;
    ovVar: OleVariant;
    lwValue: LongWord;
    Enum: IEnumVariant;
begin
    ResStr := '' ;
    wmiLocator := TSWbemLocator.Create (Nil);
    try
    try
        wmiServices := wmiLocator.ConnectServer ('', RootNameSpace, '', '',
                                                                      '', '', 0, nil);
        wmiObjectSet := wmiServices.ExecQuery (Arg, 'WQL',
                                                     wbemFlagReturnImmediately, nil) ;
        result := wmiObjectSet.Count ;
        if (result <> 1) then exit ;  // can only handle a single instance
        Enum := (wmiObjectSet._NewEnum) as IEnumVariant;
        while (Enum.Next (1, ovVar, lwValue) = S_OK) do
        begin
            wmiObject := IUnknown(ovVar) as SWBemObject;

            wmiProp := wmiObject.Properties_.Item (Prop, 0) ;
            if wmiProp.Name <> Prop then exit ;
            ResStr := MagWmiGetPropStr (wmiProp) ;
            if ResStr <> 'NULL' then result := 1 ;
        end ;
    except
        result := -1 ;
    end ;
    finally
        wmiLocator.Free;
    end;
end ;
function MagWmiGetPropStr (wmiProp: ISWbemProperty): string ;
var
    I: integer ;
    b1,b2,b3:boolean;
    s:string;
begin
    result := '';
   { b1:= VarIsClear(wmiProp.Get_Value);
    b2:= VarIsEmpty(wmiProp.Get_Value);
    b3:=  VarIsNull(wmiProp.Get_Value);
    s:=VarToStr(wmiProp.Get_Value);
    showmessage('Get_Value' +b1.ToString()+b2.ToString() +b3.ToString + '"'+s+'"');

    }
    if VarIsNull(wmiProp.Get_Value) then
        result := 'NULL'
    else
    begin
        case wmiProp.CIMType of
            wbemCimtypeSint8, wbemCimtypeUint8, wbemCimtypeSint16,
            wbemCimtypeUint16, wbemCimtypeSint32, wbemCimtypeUint32,
            wbemCimtypeSint64:
                if VarIsArray(wmiProp.Get_Value) then
                begin
                    for I := 0 to VarArrayHighBound (wmiProp.Get_Value, 1) do
                    begin
                        if I > 0 then result := result + '|' ;
                        result := result + IntToStr (wmiProp.Get_Value [I]) ;
                    end ;
                end
                else
                    result := IntToStr (wmiProp.Get_Value);

            wbemCimtypeReal32, wbemCimtypeReal64:
                result := FloatToStr (wmiProp.Get_Value);

            wbemCimtypeBoolean:
                if wmiProp.Get_Value then result := 'True' else result := 'False';

            wbemCimtypeString, wbemCimtypeUint64:
                if VarIsArray(wmiProp.Get_Value) then
                begin
                    for I := 0 to VarArrayHighBound (wmiProp.Get_Value, 1) do
                    begin
                        if I > 0 then result := result + '|' ;
                        result := result + wmiProp.Get_Value [I] ;
                    end ;
                end
                else
                begin
                    result := wmiProp.Get_Value;
                end;

            wbemCimtypeDatetime:
                result := wmiProp.Get_Value;

            wbemCimtypeReference:
            begin
                result := wmiProp.Get_Value ;
            // Services.Get(result, 0, nil).GetObjectText_(0));  another query
            end;

            wbemCimtypeChar16:
                result := '<16-bit character>';

            wbemCimtypeObject:
                result := '<CIM Object>';
        end ;
    end;
end ;

Переделал запрос к другой таблице ВСЕ РЕШЕНО!

    sql:= 'SELECT SerialNumber FROM Win32_DiskDrive WHERE  Name = "\\\\.\\PHYSICALDRIVE'+intTostr(Index)+'"';
    if MagWmiGetOneQ (sql, 'SerialNumber' ,Result) <> 1 then
    Result:=''
    else Result:= Result.Trim;

Ответы (0 шт):