juank1971
01-03-2013, 16:58:19
Hola amigos hace tiempo no andaba por el foro, me complace ver que delphi siempre va ganando terreno, a pesar que hay tanto mundo informático tratando de absorber todas las formas de programación. Pero me quedo con delphi creo que lo AMO.
Disculpe la muela salida de tema, estoy nostálgico hoy.
Estoy haciendo una aplicación que controla todas las computadoras de mi red 73, Red local, dentro de muchas cosas que hago muy particulares de mis servidores y mis Software montados, ahora necesito incorporar algunos temas de HardWere , entonces necesito aplicar algunos de los componentes y funciones que se tratan en los foros para números de serie por ejemplo del disco duro etc, pero en la red.? me dan alguna idea?.
tengo delphi XE, por ejmplo esta función sacada de los trucos con algunos cambios como cambiar pchar por pansichar , funciona perfecta en la maquina local, y me da el numero de serie físico del disco ,hay que poner PHYSICALDRIVE0 para que devuelva el serie físico sino devuelve el serial lógico que se pierde con el formateo, necesito esta función para la red, teniendo en cuenta que soy el administrador y tengo las claves de administrador del dominio y las IP de todas las Maquinas.
Discúlpenme si me falta algo por decir para un mejor entendimiento de mi pregunta o si no estoy preguntando en el foro correcto, me dicen y rectifico al instante.
Gracias a todos
function GetSerialNumber(Letra: Char; var VendorId: string; var ProductId: string;
var SerialNumber: string; var Extraible: Boolean): string;
var
Disk: THandle;
Size: Cardinal;
Buffer: Pointer;
DeviceDescriptor: PSTORAGE_DEVICE_DESCRIPTOR;
begin
Result:= EmptyStr;
Disk:= CreateFile(PChar('\\.\PHYSICALDRIVE0'),GENERIC_READ,FILE_SHARE_READ
// Disk:= CreateFile(PChar('\\.\' + Letra + ':'),GENERIC_READ,FILE_SHARE_READ
or FILE_SHARE_WRITE,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if Disk <> INVALID_HANDLE_VALUE then
begin
GetMem(Buffer,12);
try
FillChar(Buffer^,12,0);
if DeviceIOControl(Disk, IOCTL_STORAGE_QUERY_PROPERTY,
Buffer,12,Buffer,12,Size, nil) then
begin
FreeMem(Buffer);
Size:= PSTORAGE_DESCRIPTOR_HEADER(Buffer).Size;
GetMem(Buffer, Size);
FillChar(Buffer^,Size,0);
if DeviceIOControl(Disk, IOCTL_STORAGE_QUERY_PROPERTY,
Buffer,12,Buffer,Size,Size, nil) then
begin
DeviceDescriptor:= Buffer;
Extraible:= DeviceDescriptor.RemovableMedia;
if DeviceDescriptor.VendorIdOffset > 0 then
VendorId:= String(PChar(Buffer) + DeviceDescriptor.VendorIdOffset)
else
VendorId:= EmptyStr;
if DeviceDescriptor.ProductIdOffset > 0 then
ProductId:= String(PansiChar(Buffer) + DeviceDescriptor.ProductIdOffset)
else
ProductId:= EmptyStr;
if (DeviceDescriptor.SerialNumberOffset > 0) and
(DeviceDescriptor.SerialNumberOffset < Size) then
SerialNumber:= String(PansiChar(Buffer) + DeviceDescriptor.SerialNumberOffset)
else
SerialNumber:= EmptyStr;
end else Result:= SysErrormessage(GetLastError);
end else Result:= SysErrormessage(GetLastError);
finally
FreeMem(Buffer);
end;
CloseHandle(Disk);
end else Result:= SysErrormessage(GetLastError);
end;
Disculpe la muela salida de tema, estoy nostálgico hoy.
Estoy haciendo una aplicación que controla todas las computadoras de mi red 73, Red local, dentro de muchas cosas que hago muy particulares de mis servidores y mis Software montados, ahora necesito incorporar algunos temas de HardWere , entonces necesito aplicar algunos de los componentes y funciones que se tratan en los foros para números de serie por ejemplo del disco duro etc, pero en la red.? me dan alguna idea?.
tengo delphi XE, por ejmplo esta función sacada de los trucos con algunos cambios como cambiar pchar por pansichar , funciona perfecta en la maquina local, y me da el numero de serie físico del disco ,hay que poner PHYSICALDRIVE0 para que devuelva el serie físico sino devuelve el serial lógico que se pierde con el formateo, necesito esta función para la red, teniendo en cuenta que soy el administrador y tengo las claves de administrador del dominio y las IP de todas las Maquinas.
Discúlpenme si me falta algo por decir para un mejor entendimiento de mi pregunta o si no estoy preguntando en el foro correcto, me dicen y rectifico al instante.
Gracias a todos
function GetSerialNumber(Letra: Char; var VendorId: string; var ProductId: string;
var SerialNumber: string; var Extraible: Boolean): string;
var
Disk: THandle;
Size: Cardinal;
Buffer: Pointer;
DeviceDescriptor: PSTORAGE_DEVICE_DESCRIPTOR;
begin
Result:= EmptyStr;
Disk:= CreateFile(PChar('\\.\PHYSICALDRIVE0'),GENERIC_READ,FILE_SHARE_READ
// Disk:= CreateFile(PChar('\\.\' + Letra + ':'),GENERIC_READ,FILE_SHARE_READ
or FILE_SHARE_WRITE,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if Disk <> INVALID_HANDLE_VALUE then
begin
GetMem(Buffer,12);
try
FillChar(Buffer^,12,0);
if DeviceIOControl(Disk, IOCTL_STORAGE_QUERY_PROPERTY,
Buffer,12,Buffer,12,Size, nil) then
begin
FreeMem(Buffer);
Size:= PSTORAGE_DESCRIPTOR_HEADER(Buffer).Size;
GetMem(Buffer, Size);
FillChar(Buffer^,Size,0);
if DeviceIOControl(Disk, IOCTL_STORAGE_QUERY_PROPERTY,
Buffer,12,Buffer,Size,Size, nil) then
begin
DeviceDescriptor:= Buffer;
Extraible:= DeviceDescriptor.RemovableMedia;
if DeviceDescriptor.VendorIdOffset > 0 then
VendorId:= String(PChar(Buffer) + DeviceDescriptor.VendorIdOffset)
else
VendorId:= EmptyStr;
if DeviceDescriptor.ProductIdOffset > 0 then
ProductId:= String(PansiChar(Buffer) + DeviceDescriptor.ProductIdOffset)
else
ProductId:= EmptyStr;
if (DeviceDescriptor.SerialNumberOffset > 0) and
(DeviceDescriptor.SerialNumberOffset < Size) then
SerialNumber:= String(PansiChar(Buffer) + DeviceDescriptor.SerialNumberOffset)
else
SerialNumber:= EmptyStr;
end else Result:= SysErrormessage(GetLastError);
end else Result:= SysErrormessage(GetLastError);
finally
FreeMem(Buffer);
end;
CloseHandle(Disk);
end else Result:= SysErrormessage(GetLastError);
end;