unit UpdateIP;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, NB30, StdCtrls, DB, ADODB;
type
TfrmUpdateIPAddress = class(TForm)
adoCntAccess: TADOConnection;
adoDacAddress: TADODataSet;
procedure adoCntAccessBeforeConnect(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmUpdateIPAddress: TfrmUpdateIPAddress;
implementation
{$R dfm}
//============================================================
// 设置数据库路径
//============================================================
procedure TfrmUpdateIPAddressadoCntAccessBeforeConnect(Sender: TObject);
begin
adoCntAccessConnectionString := 'Provider=MicrosoftJetOLEDB40;Password="";' +
'User ID=Admin;Data Source=' + ExtractFilePath(ApplicationExeName) +
'\MacDatamdb;Mode=Share Deny None;Extended Properties=""';
end;
//============================================================
// 获取计算机的 MAC 地址
//============================================================
function NBGetAdapterAddress(a :Integer) : string;
var
NC : TNCB;
ADAPTE : TADAPTERSTATUS;
LANAENU : TLANAENUM;
intId : Integer;
cR : Char;
strTem : string;
begin
Result := '';
try
ZeroMemory(@NC, SizeOf(NC));
NCncb_command := Chr(NCBENUM);
cR := NetBios(@NC);
//Reissue enum command
NCncb_buffer := @LANAENU;
NCncb_length := SizeOf(LANAENU);
cR := NetBios(@NC);
if Ord(cR) <> 0 then
exit;
ZeroMemory(@NC, SizeOf(NC));
NCncb_command := Chr(NCBRESET);
NCncb_lana_num := LANAENUlana[a];
cR := NetBios(@NC);
if Ord(cR) <> 0 then
exit;
ZeroMemory(@NC, SizeOf(NC));
NCncb_command := Chr(NCBASTAT);
NCncb_lana_num := LANAENUlana[a];
StrPCopy(NCncb_callname, '');
NCncb_buffer := @ADAPTE;
NCncb_length := SizeOf(ADAPTE);
cR := NetBios(@NC);
strTem := '';
for intId := 0 To 5 do
strTem := strTem+ InttoHex(Integer(ADAPTEadapter_address[intId]), 2);
Result := strTem;
finally
end;
end;
//============================================================
// 设置计算机名
//============================================================
function SetComputerName(AComputerName: string): Boolean;
var
ComputerName: array[0MAX_COMPUTERNAME_LENGTH + 1] of Char;
begin
StrPCopy(ComputerName, AComputerName);
Result := WindowsSetComputerName(ComputerName);
end;
//============================================================
// 启动时自动修改IP地址以及计算机名
//============================================================
procedure TfrmUpdateIPAddressFormShow(Sender: TObject);
var
sMac, sNum, sComputerName, BatchFileName: string;
ProcessInfo: TProcessInformation;
StartUpInfo: TStartupInfo;
begin
sMac := NBGetAdapterAddress(0);
AdoCntAccessConnected := True;
adoDacAddressClose;
adoDacAddressParametersParamByName('mac')Value := sMac;
adoDacAddressOpen;
if adoDacAddressRecordCount = 0 then
ApplicationTerminate;
sNum := Trim(adoDacAddressFieldByName('ComputerID')Value);
//设置计算机名
sComputerName := 'Stu_' + sNum;
if not SetComputerName(sComputerName) then
begin
ShowMessage('计算机名没有设置成功!');
ApplicationTerminate;
end;
//设置IP地址、DNS等
BatchFileName := ExtractFilePath(ParamStr(0)) + 'AutoUpdatebat ' + sNum;
StartUpInfodwFlags := STARTF_USESHOWWINDOW;
StartUpInfowShowWindow := SW_Hide;
if CreateProcess(nil, PChar(BatchFileName), nil, nil,
False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo, ProcessInfo) then
begin
CloseHandle(ProcessInfohThread);
CloseHandle(ProcessInfohProcess);
end;
ApplicationTerminate;
end;
end
该程序首先获取当前机器的MAC地址,然后从Access表中检索机器号,并根据机器号生成机器名“Stu_+机器号”。在修改完机器名后,自动启动一个外部批处理(在这里是一个BAT文件),进行挂参数的批处理调用,实现修改IP地址工作。如果有人问为什么要调用批处理的话,实际上我想将系统做成自删除的系统,程序执行完就将自己删除的干干静静,不留任何痕迹,这在后面再讨论。
批处理文件的内容如下:
@ECHO OFF
rem 修改IP地址、子网掩码、网关
cmd /c netsh interface ip set address name="本地连接" source=static addr=101619%1 mask=2552552550 gateway=101619254 gwmetric=1
rem 修改DNS
cmd /c netsh interface ip set dns name="本地连接" source=static addr=2103119865
rem 删除放在启动组中的快捷方式
del /q "C:\Documents and Settings\All Users\「开始」菜单\程序\启动\AutoUpdate"
rem 调用重启机的批处理文件
Restartbat
从文件中可以看出,为了让系统在第一次运行时自动修改IP地址,在开始菜单的启动中创建了一个快捷方式,自动调用我的程序,程序执行完后,将启动菜单中快捷方式删除,然后重新启动。至于自删除的功能,这里我没有放上来,感兴趣的话,可以在Google中检索“Delphi 自己 删除”,能找到很多资料。
下面说说重新启动,Windows 98、Windows Me重新启动很简单,只要一条命令就可以了:
rundll32exe shell32dll,SHExitWindowsEx n
其中最后面的n表示:
0 - LOGOFF
1 - SHUTDOWN
2 - REBOOT
4 - FORCE
8 - POWEROFF
Window XP的重启不同于98,需要使用 shutdown 命令,具体可以参考手册。
最困难的是NT 2000的重启,使用上面的方法都不起作用。必须通过多条命令实现。下面看看NT 2000重启的批处理文件:
@ECHO OFF & cd/d %temp% & echo [version] > {out}inf
(set inf=InstallHinfSection DefaultInstall)
echo signature=$chicago$ >> {out}inf
echo [defaultinstall] >> {out}inf
rundll32 setupapi,%inf% 1 %temp%\{out}inf
del {out}inf
有些乱,但很管用。
以上就是关于怎样改变程序的访问IP地址全部的内容,包括:怎样改变程序的访问IP地址、如何修改IP、IP怎么重新设置等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)