25. januar 2009 - 19:52Der er
12 kommentarer og 1 løsning
Læse IP oplysninger fra 1 maskine og skrive dem på en anden
Jeg har brug for at kunne læse IP oplysninger på en maskine og gemme dem for senere at kunne skrive dem på en anden maskine.
Årsagen er at hvis vores serviceteknikere skifter en computer, skal den nye maskine have de IP oplysninger der var på maskinen de skiftede. Jeg kopierer i forvejen datafiler ud på et USB stick, så et plus ville være hvis IP oplysningerne kom med også.
Jeg har brug for IP adresse, subnet mask og default gateway.
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
Jeg ville bruge et VB script, hvis jeg var dig. Der er masser af eksempler på nettet om hvordan du får fat i den, gemmer den i en fil og senere indlæser den fra en fil.
function GetIPFromHost(var HostName, IPaddr, WSAErr: string): Boolean; type Name = array[0..100] of Char; PName = ^Name; var HEnt: pHostEnt; HName, HName1: PName; WSAData: TWSAData; i: Integer; begin Result := False; if WSAStartup($0101, WSAData) <> 0 then begin WSAErr := 'Winsock is not responding."'; Exit; end; IPaddr := ''; New(HName); if GetHostName(HName^, SizeOf(Name)) = 0 then begin HostName := StrPas(HName^); HEnt := GetHostByName(HName^); for i := 0 to HEnt^.h_length - 1 do begin IPaddr := Concat(IPaddr,IntToStr(Ord(HEnt^.h_addr_list^[i])) + '.'); end; SetLength(IPaddr, Length(IPaddr) - 1); Result := True; end else begin case WSAGetLastError of WSANOTINITIALISED:WSAErr:='WSANotInitialised'; WSAENETDOWN :WSAErr:='WSAENetDown'; WSAEINPROGRESS :WSAErr:='WSAEInProgress'; end; end; Dispose(HName); WSACleanup; end;
procedure TForm2.Button1Click(Sender: TObject); var Host, IP, Err: string; begin if GetIPFromHost(Host, IP, Err) then begin Edit1.Text := Host; Edit2.Text := IP; end else MessageDlg(Err, mtError, [mbOk], 0);
spil2vind> efter min beste overbevisning så er det 'kun' IP adressen du læser. Så er der jo 5 trin mere.
nca> jeg har godt set at der findes VB scripts der skulle kunne gøre det. Men alle dem jeg har set er på en eller anden måde navngivne forbindelser. Og jeg har ingen chance for at vide om forbindelsen hedder 'LAN connection' 'Local Area...' eller noget helt tredie.
Jeg bruger selv dette script til at vise maskinens netværksadresser. Måske kan det bruges?
sIp = "" strComputer = "." Set objWMIService = GetObject("winmgmts:" & "!\\" & strComputer & "\root\cimv2") Set colAdapters = objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled = True") For Each objAdapter in colAdapters sDNSHostName = objAdapter.DNSHostName If Not IsNull(objAdapter.IPAddress) Then For i = LBound(objAdapter.IPAddress) To UBound(objAdapter.IPAddress) sIp = sIp + objAdapter.IPAddress(i) + ", " Next End If Next ' Skip det ekstra ', ' sIp = Left(sIp, Len(sIp)-2)
Dette script viser hvis alt, hvad du har behov for
' WMI script that returns configuration data similar to that returned by IpConfig. strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colAdapters = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True") n = 1 WScript.Echo
If Not IsNull(objAdapter.IPAddress) Then For i = 0 To UBound(objAdapter.IPAddress) WScript.Echo " IP address: " & objAdapter.IPAddress(i) Next End If
If Not IsNull(objAdapter.IPSubnet) Then For i = 0 To UBound(objAdapter.IPSubnet) WScript.Echo " Subnet: " & objAdapter.IPSubnet(i) Next End If
If Not IsNull(objAdapter.DefaultIPGateway) Then For i = 0 To UBound(objAdapter.DefaultIPGateway) WScript.Echo " Default gateway: " & objAdapter.DefaultIPGateway(i) Next End If
WScript.Echo WScript.Echo " DNS" WScript.Echo " ---" WScript.Echo " DNS servers in search order:"
If Not IsNull(objAdapter.DNSServerSearchOrder) Then For i = 0 To UBound(objAdapter.DNSServerSearchOrder) WScript.Echo " " & objAdapter.DNSServerSearchOrder(i) Next End If
WScript.Echo " DNS domain: " & objAdapter.DNSDomain
If Not IsNull(objAdapter.DNSDomainSuffixSearchOrder) Then For i = 0 To UBound(objAdapter.DNSDomainSuffixSearchOrder) WScript.Echo " DNS suffix search list: " & objAdapter.DNSDomainSuffixSearchOrder(i) Next End If
If Not IsNull(objAdapter.DHCPLeaseObtained) Then utcLeaseObtained = objAdapter.DHCPLeaseObtained strLeaseObtained = WMIDateStringToDate(utcLeaseObtained) Else strLeaseObtained = "" End If WScript.Echo " DHCP lease obtained: " & strLeaseObtained
If Not IsNull(objAdapter.DHCPLeaseExpires) Then utcLeaseExpires = objAdapter.DHCPLeaseExpires strLeaseExpires = WMIDateStringToDate(utcLeaseExpires) Else strLeaseExpires = "" End If WScript.Echo " DHCP lease expires: " & strLeaseExpires
Ja men ud fra nca's forslag har jeg fået lavet mig et script der læser adresse, subnet og gateway og gemmer det i en fil.
Jeg har så efterfølgende tilrettet det script jeg allerede havde til at sætte IP adresserne så det læser denne fil og sætter adresserne. Så nu er der kun 2 ting tilbage:
1. test, test og atter test 2. nac lægger et svar så han kan få sine point for sin VBS løsning selvom det er i Delphi kategorien :-)
Det er nemmere i VBS men man kan også bruge WMI i Delphi:
program wmifun;
{$APPTYPE CONSOLE}
uses SysUtils, ActiveX, Variants, WbemScripting_TLB in 'WbemScripting_TLB.pas';
var loc : ISWbemLocator; serv : ISWbemServices; objset : ISWbemObjectSet; enum : IEnumVariant; temp : OleVariant; val : Cardinal; obj : ISWbemObject; prop : ISWbemProperty; addr : OleVariant; i : integer;
begin CoInitialize(nil); loc := CoSWbemLocator.Create; serv := loc.ConnectServer('.', 'root\cimv2', '', '', '','', 0, nil); objset := serv.ExecQuery('Select * from Win32_NetworkAdapterConfiguration Where IPEnabled = True', 'WQL', wbemFlagReturnImmediately and wbemFlagForwardOnly , nil); enum := (objset._NewEnum) as IEnumVariant; while (enum.Next(1, temp, val) = S_OK) do begin obj := IUnknown(temp) as ISWBemObject; prop := obj.Properties_.Item('IPAddress', 0); addr := prop.Get_Value; for i := VarArrayLowBound(addr,1) to VarArrayHighBound(addr,1) do begin write(VarToStr(addr[i])); end; writeln; end; CoUninitialize(); end.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.