PDA

Ver la Versión Completa : Numero de Serie de un Disco Duro por la red


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;

Neftali [Germán.Estévez]
01-03-2013, 18:58:07
Otras veces en los foros hemos hablado de WMI (http://msdn.microsoft.com/es-es/library/windows/desktop/aa394582(v=vs.85).aspx). Si buscas en los foros encontrarás bastante información.
Utilizando WMI puedes obtener toda la información que desees del ordenador.

Lo bueno de WMI, es que no sólo funciona sobre el ordenador local, sino que también puedes consultar parámetros de otras máquinas, siempre y cuando tengas las credenciales adecuadas.
Revisa este artículo "Conector to WMI on a remote compurter" (http://msdn.microsoft.com/en-us/library/windows/desktop/aa389290(v=vs.85).aspx).

Yo creo que con esto ya puedes empezar a buscar.

en mi web tienes una librería de componentes que te pueden ayudar en este tema (GLibWMI (http://neftali.clubdelphi.com/?p=589))

juank1971
01-03-2013, 21:11:14
Ok, gracias amigo si recuerdo que tu has estado activo en esos temas , lo que el primer vistazo que eche en mi maquina los glib que encontré eran para delphi 2009, hace unos años estuve probandolos , no pensé que se siguieras actualizando, y tampoco pensé que me funcionaran remoto.

Gracias.

Salud y pesetas para todos

Neftali [Germán.Estévez]
03-03-2013, 20:50:20
Hola. No se trata de la librería GLib (http://neftali.clubdelphi.com/?p=586), que sí es un poco más antigua, sino de la GlibWMI (http://neftali.clubdelphi.com/?p=589)(pacere que no soy muy original con los nombres ;) ), que está dedicada exclusivamente al trabajo con WMI.
Tal vez tengas que hacerles algún retoque, pero diría que no te darán problemas en las versiones nuevas de Delphi.
Para el tema de remoto échale un vistazo al código, y tal vez sólo tengas que cambiar un par de parámetros.
Si tienes problemas, ya dirás...