Ir al contenido


Foto

Usar WMI para leer y modificar la configuración de red


  • Por favor identifícate para responder
11 respuestas en este tema

#1 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 06 enero 2009 - 01:33

Aquí dejo un pequeño ejemplo de como usar WMI (Windows Management Instrumentation) para cambiar la configuración de red (ip, puerta de enlace, etc ...). Este ejemplo además sirve para mostrar como podemos usar las clases de WMI desde delphi, y así aprovechar todas las ventajas que ofrecen.

Aquí dejo el código, aunque también adjunto un zip con todo el proyecto:


delphi
  1. unit ufrmMain;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls;
  8.  
  9. type
  10.   TfrmMain = class(TForm)
  11.     cmbAdapters: TComboBox;
  12.     btnCambiar: TButton;
  13.     btnDHCP: TButton;
  14.     txtIP: TEdit;
  15.     txtMask: TEdit;
  16.     txtGateway: TEdit;
  17.     txtDns1: TEdit;
  18.     txtDns2: TEdit;
  19.     Label1: TLabel;
  20.     Label2: TLabel;
  21.     Label3: TLabel;
  22.     Label4: TLabel;
  23.     Label5: TLabel;
  24.     Label6: TLabel;
  25.     procedure FormCreate(Sender: TObject);
  26.     procedure btnCambiarClick(Sender: TObject);
  27.     procedure btnDHCPClick(Sender: TObject);
  28.     procedure cmbAdaptersChange(Sender: TObject);
  29.   private
  30.     { Private declarations }
  31.   public
  32.     { Public declarations }
  33.   end;
  34.  
  35. var
  36.   frmMain: TfrmMain;
  37.  
  38. implementation
  39.  
  40. {$R *.dfm}
  41.  
  42. uses ComObj, ActiveX;
  43.  
  44. procedure TfrmMain.btnCambiarClick(Sender: TObject);
  45. var
  46.   ScriptControl: OleVariant;
  47.   WmiService: OleVariant;
  48.   Items: IUnknown;
  49.   Enum: IEnumVariant;
  50.   Fetched: Cardinal;
  51.   Item: OleVariant;
  52.   Str: String;
  53.   IPAddress: Variant;
  54.   SubnetMask: Variant;
  55.   Gateway: Variant;
  56.   DNSServer: Variant;
  57. begin
  58.   // Cambiamos los valores
  59.   if cmbAdapters.ItemIndex >= 0 then
  60.   begin
  61.     Str:= Trim(cmbAdapters.Items[cmbAdapters.ItemIndex]);
  62.     if Str <> EmptyStr then
  63.     begin
  64.       ScriptControl:= CreateOleObject('ScriptControl');
  65.       ScriptControl.Language := 'VBScript';
  66.       WmiService:= ScriptControl.Eval('GetObject("winmgmts:\\.\root\cimv2")');
  67.       Items:= WMIService.ExecQuery('Select * from Win32_NetworkAdapterConfiguration where Description='
  68.         + QuotedStr(Str))._NewEnum;
  69.       Enum:= Items as IEnumVariant;
  70.       Enum.Reset;
  71.       Enum.Next(1, Item, Fetched);
  72.       while Fetched = 1 do
  73.       begin
  74.         if Trim(VarToStrDef(Item.Description,EmptyStr)) = Str then
  75.         begin
  76.           IPAddress:= VarArrayCreate([1,1],varOleStr);
  77.           SubnetMask:= VarArrayCreate([1,1],varOleStr);
  78.           Gateway:= VarArrayCreate([1,1],varOleStr);
  79.           Gateway:= VarArrayCreate([1,1],varOleStr);
  80.           DNSServer:= VarArrayCreate([1,2],varOleStr);
  81.           IPAddress[1]:= txtIP.Text;
  82.           SubnetMask[1]:= txtMask.Text;
  83.           Gateway[1]:= txtGateway.Text;
  84.           DNSServer[1]:= txtDns1.Text;
  85.           DNSServer[2]:= txtDns2.Text;
  86.           Item.EnableStatic(IPAddress,SubnetMask);
  87.           Item.SetGateways(GateWay);
  88.           Item.SetDNSServerSearchOrder(DNSServer);
  89.         end;
  90.         Enum.Next(1, Item, Fetched);
  91.       end;
  92.     end;
  93.   end;
  94. end;
  95.  
  96. procedure TfrmMain.btnDHCPClick(Sender: TObject);
  97. var
  98.   ScriptControl: OleVariant;
  99.   WmiService: OleVariant;
  100.   Items: IUnknown;
  101.   Enum: IEnumVariant;
  102.   Fetched: Cardinal;
  103.   Item: OleVariant;
  104.   Str: String;
  105. begin
  106.   // Indicamos que se debe usar DHCP
  107.   if cmbAdapters.ItemIndex >= 0 then
  108.   begin
  109.     Str:= Trim(cmbAdapters.Items[cmbAdapters.ItemIndex]);
  110.     if Str <> EmptyStr then
  111.     begin
  112.       ScriptControl:= CreateOleObject('ScriptControl');
  113.       ScriptControl.Language := 'VBScript';
  114.       WmiService:= ScriptControl.Eval('GetObject("winmgmts:\\.\root\cimv2")');
  115.       Items:= WMIService.ExecQuery('Select * from Win32_NetworkAdapterConfiguration where Description='
  116.         + QuotedStr(Str))._NewEnum;
  117.       Enum:= Items as IEnumVariant;
  118.       Enum.Reset;
  119.       Enum.Next(1, Item, Fetched);
  120.       while Fetched = 1 do
  121.       begin
  122.         if Trim(VarToStrDef(Item.Description,EmptyStr)) = Str then
  123.         begin
  124.           Item.EnableDHCP;
  125.           Item.SetDNSServerSearchOrder;
  126.           Item.RenewDHCPLease;
  127.         end;
  128.         Enum.Next(1, Item, Fetched);
  129.       end;
  130.     end;
  131.     cmbAdaptersChange(nil);
  132.   end;
  133. end;
  134.  
  135. procedure TfrmMain.cmbAdaptersChange(Sender: TObject);
  136. var
  137.   ScriptControl: OleVariant;
  138.   WmiService: OleVariant;
  139.   Items: IUnknown;
  140.   Enum: IEnumVariant;
  141.   Fetched: Cardinal;
  142.   Item: OleVariant;
  143.   Str: String;
  144.   IPAddress: Variant;
  145.   SubnetMask: Variant;
  146.   Gateway: Variant;
  147.   DNSServer: Variant;
  148. begin
  149.   // Llenamos los TEdits con los valores actuales
  150.   if cmbAdapters.ItemIndex >= 0 then
  151.   begin
  152.     Str:= Trim(cmbAdapters.Items[cmbAdapters.ItemIndex]);
  153.     if Str <> EmptyStr then
  154.     begin
  155.       ScriptControl:= CreateOleObject('ScriptControl');
  156.       ScriptControl.Language := 'VBScript';
  157.       WmiService:= ScriptControl.Eval('GetObject("winmgmts:\\.\root\cimv2")');
  158.       Items:= WMIService.ExecQuery('Select * from Win32_NetworkAdapterConfiguration where Description='
  159.         + QuotedStr(Str))._NewEnum;
  160.       Enum:= Items as IEnumVariant;
  161.       Enum.Reset;
  162.       Enum.Next(1, Item, Fetched);
  163.       while Fetched = 1 do
  164.       begin
  165.         if Trim(VarToStrDef(Item.Description,EmptyStr)) = Str then
  166.         begin
  167.           IPAddress:= Item.IPAddress;
  168.           txtIP.Text:= VarToStrDef(IPAddress[0],EmptyStr);
  169.           SubnetMask:= Item.IPSubnet;
  170.           txtMask.Text:= VarToStrDef(SubnetMask[0],EmptyStr);
  171.           Gateway:= Item.DefaultIPGateway;
  172.           txtGateway.Text:= VarToStrDef(Gateway[0],EmptyStr);
  173.           DNSServer:= Item.DNSServerSearchOrder;
  174.           txtDns1.Text:= VarToStrDef(DNSServer[0],EmptyStr);
  175.           txtDns2.Text:= VarToStrDef(DNSServer[1],EmptyStr);
  176.         end;
  177.         Enum.Next(1, Item, Fetched);
  178.       end;
  179.     end;
  180.   end;
  181. end;
  182.  
  183. procedure TfrmMain.FormCreate(Sender: TObject);
  184. var
  185.   ScriptControl: OleVariant;
  186.   WmiService: OleVariant;
  187.   Items: IUnknown;
  188.   Enum: IEnumVariant;
  189.   Fetched: Cardinal;
  190.   Item: OleVariant;
  191.   Str: String;
  192. begin
  193.   // Llenamos el combo con las tarjetas de red
  194.   cmbAdapters.Clear;
  195.   ScriptControl:= CreateOleObject('ScriptControl');
  196.   ScriptControl.Language := 'VBScript';
  197.   WmiService:= ScriptControl.Eval('GetObject("winmgmts:\\.\root\cimv2")');
  198.   Items:= WMIService.ExecQuery('Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE')._NewEnum;
  199.   Enum:= Items as IEnumVariant;
  200.   Enum.Reset;
  201.   Enum.Next(1, Item, Fetched);
  202.   while Fetched = 1 do
  203.   begin
  204.     Str:= Trim(VarToStrDef(Item.MACAddress,EmptyStr));
  205.     if Str <> EmptyStr then
  206.       cmbAdapters.Items.Add(Item.Description);
  207.     Enum.Next(1, Item, Fetched);
  208.   end;
  209. end;
  210.  
  211. end.



*Hace falta ser administrador para cambiar la configuración de red, así que si usas Windows Vista acuerdate de utilizar "Run as administrator"

Archivos adjuntos


  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.177 mensajes
  • LocationMéxico

Escrito 06 enero 2009 - 01:35

hey amigo seoane,

Esto me va a permitir prescindir del Panel de Control y etc etc  ^o|

Salud OS
  • 0

#3 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 06 enero 2009 - 01:39

Esto me va a permitir prescindir del Panel de Control y etc etc  ^o|

Si te refieres a si cambia las propiedades de la conexión de forma permanente, así es. El efecto es igual que si vas a las propiedades de la conexión de red y fijas manualmente los valores de ip, puerta de enlace, etc ...
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.177 mensajes
  • LocationMéxico

Escrito 06 enero 2009 - 01:42

Ah pues que bien, me estas dando algunas ideas :D

Salud OS y gracias por el aporte (y)
  • 0

#5 Caral

Caral

    Advanced Member

  • Administrador
  • 4.261 mensajes
  • LocationCosta Rica

Escrito 06 enero 2009 - 01:56

Hola
Muy interesante aunque no se usarlo. :D
Saludos
  • 0

#6 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 06 enero 2009 - 02:00

Saludos.

Las sentencias que están en las comillas deben de ser de Visual Basic Script?
  • 0

#7 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 06 enero 2009 - 02:11

Lo averiguaste por esto  :D


delphi
  1. ScriptControl.Language := 'VBScript';



Por ahí chackAll tenia un código que permitía evitar el uso de VBS, si lo pone por aquí ya tendríamos dos alternativas.
  • 0

#8 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 06 enero 2009 - 05:33

Aquí dejo un pequeño ejemplo de como usar WMI (Windows Management Instrumentation) para cambiar la configuración de red (ip, puerta de enlace, etc ...). Este ejemplo además sirve para mostrar como podemos usar las clases de WMI desde delphi, y así aprovechar todas las ventajas que ofrecen.
....


Y podrías por principio de cuentas, aclararnos qué es esto ?  :D... si no es mucha molestia  :$  :p
  • 0

#9 seoane

seoane

    Advanced Member

  • Administrador
  • 1.257 mensajes
  • LocationEspaña

Escrito 06 enero 2009 - 05:43

En resumen, una herramienta que viene instalada en windows que permite obtener información, configurar y controlar diversos parámetros del sistema operativo. Y en teoría (yo no le he probado) se puede controlar, además del propio equipo, otros equipos remotos conectados en red con el nuestro.

Introducción a WMI

Instrumental de administración de Windows (WMI, Windows Management Instrumentation) es la implementación de Microsoft de WBEM, una iniciativa que pretende establecer normas estándar para tener acceso y compartir la información de administración a través de la red de una empresa. WMI cumple con WBEM y proporciona compatibilidad integrada para el Modelo de información común (CIM, <i>Common Information Model</i>), que describe los objetos existentes en un entorno de administración.

WMI incluye un repositorio de objetos compatible con CIM, que es la base de datos de definiciones de objetos, y el Administrador de objetos CIM, que controla la recopilación y manipulación de objetos en el repositorio y reúne información de los proveedores de WMI. Los proveedores de WMI actúan como intermediarios entre los componentes del sistema operativo, las aplicaciones y otros sistemas. Por ejemplo, el proveedor del Registro extrae su información, mientras que el proveedor de SNMP proporciona datos y sucesos de los dispositivos SNMP. Los proveedores proporcionan información acerca de sus componentes, y podrían proporcionar métodos para manipular los componentes, las propiedades que se pueden establecer, o los sucesos que le pueden alertar de las modificaciones efectuadas en los componentes.

Las herramientas de administración de equipos, como Microsoft Systems Management Server, pueden utilizar WMI para ayudarle a administrar sus equipos. WMI también se utiliza en otras tecnologías y herramientas de Microsoft, como Microsoft Health Monitor y Microsoft Operations Manager, y también lo utilizan otros fabricantes de sistemas de administración de equipos. Puede utilizar WMI con sistemas de programación o de secuencias de comandos (como Windows Script Host) para obtener información de configuración acerca de la mayor parte de los aspectos de los sistemas informáticos, incluidas las aplicaciones de servidor, o para realizar cambios en los mismos. Para obtener más información, consulte el SDK de WMI.


El enlace http://technet.micro...y/cc787057.aspx
  • 0

#10 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 598 mensajes

Escrito 07 enero 2009 - 09:34

...Por ahí chackAll tenia un código que permitía evitar el uso de VBS...




delphi
  1. uses ActiveX, ComObj;
  2.  
  3. procedure TForm1.Button1Click(Sender: TObject);
  4. var
  5. WMI, Item: OleVariant;
  6. foreach: IEnumVariant;
  7. enum: IUnknown;
  8. List: string;
  9. begin
  10. WMI := CreateOleObject('WbemScripting.SWbemLocator');
  11. enum := WMI.ConnectServer.InstancesOf('Win32_Process')._NewEnum;
  12. foreach := enum as IEnumVariant;
  13. List := '';
  14. while foreach.Next(1, Item, PDWORD(0)^) = 0 do
  15.   begin
  16.   List := List + Item.Name + #13;
  17.   VariantClear(Item);
  18.   end;
  19. enum := nil;
  20. foreach := nil;
  21. VariantClear(WMI);
  22.  
  23. ShowMessage(List);
  24. end;


  • 0

#11 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 753 mensajes
  • LocationPinar del Río, Cuba

Escrito 09 mayo 2009 - 11:33

Hola a todos
Y usando las WMI tambien puedo saber el modelo de la MB, frecuencia del Micro, tipo de RAM (DDR, DDR2, etc.) y demas datos del hardware?  *-)

De ser asi como serí­a??  :^)


  • 0

#12 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 598 mensajes

Escrito 09 mayo 2009 - 06:51

Win32_BaseBoard, Win32_Processor,
Win32_PhysicalMemory, etc.
  • 0