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;