First we try, then we trust

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  183 随笔 :: 111 文章 :: 2983 评论 :: 339 引用

一、问题提出

当上实验中心主任后的一个棘手的问题就是机房管理。机房不大,只有60多台电脑,而且已经装上了海光硬盘保护卡豪华版,可以直接网络GHOST硬盘。只要安装好一台电脑,就可以在6个小时左右将40G硬盘信息传遍每一台电脑。

虽然是一个小小的实验中心,也要为大家上机服务,什么等级考试、财务会计、外贸模拟、软件开发样样具全。这样,在40G硬盘中装了6个操作系统(DOS、Win 98、Win 2003 Server、Win 2000 Server、WinXP、Win 2000 Server(英文版MCSE用))。在与补丁和病毒做了一番斗争后,剩下的问题就是自动更新IP地址与计算机名。机房中的每台机器都有一个编号,机器的IP分配也与编号相关。海光蓝卡虽然提供自动修改IP的功能,但对Server版的操作系统不起作用(修改完后,系统就瘫痪了),对非Server版的操作系统虽然起作用,但IP地址分配是随机的,如果想人为定制,必须自己建立MAC地址与IP地址的映射表。总之,使用起来非常不方便,何况还没法对NT Server修改IP呢。打电话咨询海光公司,回话是:你用的保护卡不具备修改NT Server IP地址的功能,我们这里的最新产品是MAX版,可以解决你的问题。这不是又要从兜里掏银子吗!还是自己动手解决吧。


二、解决办法

一开始,我使用DHCP动态分配IP,对每台机器保留一固定IP地址,但由于所有的机器都是克隆出来的,机器名完全一样,每次启机都报有重名计算机存在,还影响了网上邻居的使用。最后一生气,干脆自己编一个自动修改机器名与IP地址的程序。

考查了一下,可以使用Windows Script或是WinBatch实现,不过需要在机器上安装这些软件,似乎有些大材小用。最后决定使用Delphi自己编写一个自动修改IP的程序。这样,借助海光蓝卡上自动修改IP的功能(说是自动修改IP,经我研究,实际上就是解开硬盘保护,自动将每个系统重新启动一下,在启动的过程中,海光自己的驱动程序完成修改工作。),实现自己修改IP。具体方法就是,不再安装海光自动修改IP的程序,改成自己的程序,让系统在第一次启动的时候自动修正IP和计算机名,并重新启动机器。

说干就干,首先将所有机器号与MAC映射表存储成Access数据库,并将IP地址设置为自动获取DHCP,防止启机时冲突。然后在Delphi中编写如下程序:

unit UpdateIP;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, NB30, StdCtrls, DB, ADODB;

type
  TfrmUpdateIPAddress = class(TForm)
    adoCntAccess: TADOConnection;
    adoDSMacAddress: TADODataSet;
    procedure adoCntAccessBeforeConnect(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmUpdateIPAddress: TfrmUpdateIPAddress;

implementation

{$R *.dfm}

//============================================================
// 设置数据库路径
//============================================================
procedure TfrmUpdateIPAddress.adoCntAccessBeforeConnect(Sender: TObject);
begin
  adoCntAccess.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Password="";' +
    'User ID=Admin;Data Source=' + ExtractFilePath(Application.ExeName) +
    '\MacData.mdb;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));
    NC.ncb_command := Chr(NCBENUM);
    cR := NetBios(@NC);
 
    //Reissue enum command
    NC.ncb_buffer := @LANAENU;
    NC.ncb_length := SizeOf(LANAENU);
    cR := NetBios(@NC);
    if Ord(cR) <> 0 then
      exit;
 
    ZeroMemory(@NC, SizeOf(NC));
    NC.ncb_command := Chr(NCBRESET);
    NC.ncb_lana_num := LANAENU.lana[a];
    cR := NetBios(@NC);
    if Ord(cR) <> 0 then
      exit;
 
    ZeroMemory(@NC, SizeOf(NC));
    NC.ncb_command := Chr(NCBASTAT);
    NC.ncb_lana_num := LANAENU.lana[a];
    StrPCopy(NC.ncb_callname, '*');
    NC.ncb_buffer := @ADAPTE;
    NC.ncb_length := SizeOf(ADAPTE);
    cR := NetBios(@NC);
    strTem := '';
    for intId := 0 To 5 do
      strTem := strTem+ InttoHex(Integer(ADAPTE.adapter_address[intId]), 2);
    Result := strTem;
  finally
  end;
end;

//============================================================
// 设置计算机名
//============================================================
function SetComputerName(AComputerName: string): Boolean;
var
  ComputerName: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char;
begin
  StrPCopy(ComputerName, AComputerName);
  Result := Windows.SetComputerName(ComputerName);
end;

//============================================================
// 启动时自动修改IP地址以及计算机名
//============================================================
procedure TfrmUpdateIPAddress.FormShow(Sender: TObject);
var
  sMac, sNum, sComputerName, BatchFileName:  string;
  ProcessInfo:  TProcessInformation;
  StartUpInfo:  TStartupInfo;
begin
  sMac := NBGetAdapterAddress(0);

  AdoCntAccess.Connected := True;
  adoDSMacAddress.Close;
  adoDSMacAddress.Parameters.ParamByName('mac').Value := sMac;
  adoDSMacAddress.Open;

  if adoDSMacAddress.RecordCount = 0 then
    Application.Terminate;

  sNum := Trim(adoDSMacAddress.FieldByName('ComputerID').Value);

  //设置计算机名
  sComputerName := 'Stu_' + sNum;
  if not SetComputerName(sComputerName) then
  begin
    ShowMessage('计算机名没有设置成功!');
    Application.Terminate;
  end;

  //设置IP地址、DNS等
  BatchFileName  :=  ExtractFilePath(ParamStr(0))  +  'AutoUpdate.bat ' + sNum;
  StartUpInfo.dwFlags  :=  STARTF_USESHOWWINDOW;
  StartUpInfo.wShowWindow  :=  SW_Hide;
  if CreateProcess(nil, PChar(BatchFileName),  nil,  nil,
    False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo, ProcessInfo) then
  begin
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);
  end;
  Application.Terminate;
end;

end.


该程序首先获取当前机器的MAC地址,然后从Access表中检索机器号,并根据机器号生成机器名“Stu_+机器号”。在修改完机器名后,自动启动一个外部批处理(在这里是一个BAT文件),进行挂参数的批处理调用,实现修改IP地址工作。如果有人问为什么要调用批处理的话,实际上我想将系统做成自删除的系统,程序执行完就将自己删除的干干静静,不留任何痕迹,这在后面再讨论。

批处理文件的内容如下:

@ECHO OFF
rem 修改IP地址、子网掩码、网关
cmd /c netsh interface ip set address name="本地连接" source=static addr=10.16.19.%1 mask=255.255.255.0 gateway=10.16.19.254 gwmetric=1

rem 修改DNS
cmd /c netsh interface ip set dns name="本地连接" source=static addr=210.31.198.65

rem 删除放在启动组中的快捷方式
del /q "C:\Documents and Settings\All Users\「开始」菜单\程序\启动\AutoUpdate.*"

rem 调用重启机的批处理文件
Restart.bat

从文件中可以看出,为了让系统在第一次运行时自动修改IP地址,在开始菜单的启动中创建了一个快捷方式,自动调用我的程序,程序执行完后,将启动菜单中快捷方式删除,然后重新启动。至于自删除的功能,这里我没有放上来,感兴趣的话,可以在Google中检索“Delphi 自己 删除”,能找到很多资料。

下面说说重新启动,Windows 98、Windows Me重新启动很简单,只要一条命令就可以了:

rundll32.exe shell32.dll,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

有些乱,但很管用。

好了,所有的准备工作都已经具备,下面是实施办法:

1、首先需要准备一台机器做DHCP服务器,并且配置好IP地址池,但这个IP地址池不要与你想分配的IP地址相重复,否则会有不少麻烦。比如你想给克隆后的机器分配从10.16.19.1到10.16.19.100的IP地址段,那么你可以给你的DHCP服务器分配一个IP地址为192.168.1.1,并且配置可分配地址池为192.168.1.2到192.168.1.101,最好不要将租期设置的很长,否则可能出现IP不够分配的问题,或者在每次操作时清空一下租约。
2、安装客户端机器。
3、将编译好的可执行文件以及两个批处理文件还有一个Access数据库文件拷贝到一个目录中;
4、在目录“C:\Documents and Settings\All Users\「开始」菜单\程序\启动\”中建立一个指向该可执行文件的快捷方式(操作系统不同,目录可能也各不相同);
5、将客户端机器的IP地址设置为自动获取。
6、关闭计算机,使用海光蓝卡克隆硬盘;
7、从海光蓝卡上执行“分配IP地址”功能,所有机器自动重启,当机器启动起来后,首先会自动申请一IP地址,比如说192.168.1.2,并且所有机器IP不会冲突,从而避免因IP地址冲突造成无法正常获取MAC地址的问题出现。然后自己编写的程序将被调用,并完成自动修改IP,设置机器名称,重新启动的过程。这样,IP地址与计算机名就自动修正好了。(没有海光蓝卡的用户也可以通过手动重启机实现自动修正功能)


三、目前还存在的一些问题

目前还没有完全解决NT Server在克隆中的问题,比如说NT内部会有一唯一标识号,在克隆过程中也被复制了,而且上面的方法不能修改NT Server的AD域名。要想解决这个问题,需要从安装着手。Windows NT 2000的安装说明中有这方面的解决办法。如果哪位需要精益求精的话,可以找这方面的参考资料看看。

posted on 2004-09-03 09:42 吕震宇 阅读(20993) 评论(71)  编辑 收藏

评论

#1楼  2004-09-03 10:48 郑彬 [未注册用户]
windows操作系统不是带有一个工厂安装模式的方法吗?用这个不就是了嘛。这个可以更改唯一标识号。
  回复  引用    

#2楼  2004-09-03 11:22 Lostinet [未注册用户]
这个在网吧很实用。

  回复  引用    

#3楼  2004-09-14 19:32 #me [未注册用户]
但是我看不懂
  回复  引用    

#4楼  2004-09-21 15:26 xjie [未注册用户]
想试试,但不知道我能不能做到,如果行的话真的省下了很多一台台设置计算机名和IP地址的时间了。
  回复  引用    

#5楼 [楼主] 2004-09-21 17:39 吕震宇      
我现在正在研究修改HostName,资料已经找到,但还没时间实现。等什么时候做完了,再来补充这部分内容。
  回复  引用  查看    

#6楼  2004-10-03 13:54 liangdd [未注册用户]
程序有误,不能彻底改主机名,IP地址一冲突就不能得到MAC了,我现正为这头大呢,谁能帮我呀?????
  回复  引用    

#7楼  2004-10-03 13:56 liangdd [未注册用户]

IP地址一冲突就不能得到MAC了?????????
有高手能解决吗?
  回复  引用    

#8楼  2004-10-03 13:57 liangdd [未注册用户]
总不会一定要关掉交换机吧?
还有别的办法吗??
  回复  引用    

这是什么垃圾文章,不是骗稿费就是网络垃圾,还搞这样的东西,真是世风日下,请看WIN XP下使用详情:
  1.IP冲突时不能取得MAC;
  2.关了交换机时不能取得MAC;
3.拨了网线后不能得到MAC;
.........

  想一下吧,克出来的系统能不冲突吗?
  请大家不要为这样的文章所累,姓吕的纯是骗人的。
  回复  引用    

好文章,楼上的你太笨了吧,这文章的思想很好,方法也不错,只是细节上还差一点点,我提个意见,2K下可以用XP的SHUTDOWN实现重启.

  回复  引用    

#11楼  2004-10-04 23:09 看客 [未注册用户]
的确在IP冲突时不能得到MAC,文章中的方法行不通
  回复  引用    

#12楼 [楼主] 2004-10-05 22:01 吕震宇      
呵呵,出去玩了几天,回来后这里竟然翻了天,还背上了一个骗子的名声。不过这不怨别人,怨我某些地方没有说清楚。现在补充上:

首先需要准备一台机器做DHCP服务器,并且配置好IP地址池,但这个IP地址池不要与你想分配的IP地址相重复,否则会有不少麻烦。比如你想给克隆后的机器分配从10.16.19.1到10.16.19.100的IP地址段,那么你可以给你的DHCP服务器分配一个IP地址为192.168.1.1,并且配置可分配地址池为192.168.1.2到192.168.1.101,最好不要将租期设置的很长,否则可能出现IP不够分配的问题,或者在每次操作时清空一下租约。

然后装好客户机器,记得将IP地址设置为自动获取,然后克隆,开机...

这样,当机器启动起来后,会自动申请一IP地址,比如说192.168.1.2,并且所有机器IP不会冲突,从而避免楼上所说的问题出现,然后计算机自动修改IP,设置机器名称,重新启动。

重新启动后,新的IP地址便是10.16.19.~网段的了,根DHCP分配的IP也不会冲突。

呵呵,试试吧,不过成功后不要忘了把我这顶“骗人”的帽子给摘了呀:)
  回复  引用  查看    

哈哈,总算把您逼出来了,这招虽损,但管用呀!
您不早说,总是等我想到了才说;
其实为这个问题,要想得到MAC, 我想出了两个解决方法:
  1.有赖于DHCP,这是为了避开IP冲突;
  2.得意于IPCONFIG/ALL,这无须避开IP冲突;
最后,想为这位姓吕的先生正名:其实我没上当,大家也没
上当,上当的是粗心的不加思考的懒汉。多谢了!
  


  回复  引用    

#14楼  2004-10-07 17:26 吕震宇      
First we try, then we trust
  回复  引用  查看    

#15楼  2004-10-09 15:25 35号房客      
机器名冲突,不影响机器的使用的。
设置为dhcp,完全不会有问题啊。

我现在就有一批机器(win2000)是用的这样的办法
  回复  引用  查看    

#16楼 [楼主] 2004-10-09 16:13 吕震宇      
@35号房客

学生上机的机房管理起来要麻烦的多,仅一个DHCP不够。因为每台机器有机器号,机器号与IP地址相对应。如果校园网上有“盗用帐号”行为,需要顺着IP地址唯一定位一台机器,然后找到“元凶”^_^

即使将DHCP的IP地址池中的IP绑定到每台机器的MAC上也不行。很多一年级的学生在使用网上邻居时,重名计算机会让他们茫然不知所措。所以动态修正IP地址和计算机名还是很有必要的,至少对我来说是这样。
  回复  引用  查看    

哈哈,你们还没解决机器名冲突的问题呀,其实这不难呀,哈哈
机器号与IP地址相对应,你这个机器号可以改为座席号呀。那就不用找得这么累了。
改机器名可以导入相应部分注册表呀。

  回复  引用    

#18楼  2004-10-23 23:33 大厨师 [未注册用户]
机器名可以导入相应部分注册表

实际上我仅在win98的系统上作过试验,将ip和机器名的注册表部分(当然,我的系统中还包括outlook Express等的部分设置)导出。
当你知道内容后就可以自己动态的创建该注册表文件,我用TC2.0写了一个程序,ghost完成后,启动到ms-dos方式,然后计算机名和ip地址都不会冲突。
对于w2k,xp,ghost前是不是可以禁用网卡,然后在程序当中作一定的设置
  回复  引用    

#19楼 [楼主] 2004-10-24 00:06 吕震宇      
@大厨师

应当是可以的吧。至少海光蓝卡自己带的修改IP程序是要先禁用网卡。如果使用DHCP的化,禁用网卡就可以免了。
  回复  引用  查看    

#20楼  2004-11-30 21:11 bbscool [未注册用户]
如何使用vb来实现呢?我用API函数,在XP下只能修改netbios计算机名……不知道这能不能管用……

如果哪位大侠知道XP的计算机名设置藏在哪里的话(比如说注册表等等什么地方),不妨给大家透露一下:)
  回复  引用    

#21楼 [楼主] 2004-11-30 22:35 吕震宇      
XP中分为ComputerName与HostName两种,分别存储在两个不同的地方。在NT4SP5中修改HostName与ComputerName的方法如下:

How to set local machine HostName from your program ?
Follow this steps :
1. Open registry on the HKEY_LOCAL_MACHINE
2. Find the subKey = SYSTEM\CurrentControlSet\Services\TcpIp\Parameters
3. Set data for the value "HostName"
4. Find the subKey = SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName
5. Set data for the value "ComputerName"
6. Reboot your PC and HostName will be set.

WARNING: Modify registry incorrect can cause serious, system-wide problems . Use this at your own risk

  回复  引用  查看    

#22楼  2004-12-26 09:00 yyc [未注册用户]
其实修改IP地址和主机名可以通过VB的API函数,我已经实验成功,应用于有300台机器的机房,很方便。若有朋友希望交流,可与我联系。
MAIL:yaoyuchun@cqu.edu.cn
  回复  引用    

用netsh那个有一个缺点是不能指定两个DNS解析,比如有一个主DNS,还有一个辅助DNS这个办法不行了,要用到注册表写入的办法还成。哪位能提供一下思路?
我把我作的一些方法写上来和大家分享:
//下面用于通过程序得到网卡的MAC地址
//其中参数A是0,表示第一块网卡 
Function NBGetAdapterAddress(a:Integer) : String;
Var

NCB : TNCB; // Netbios control block //NetBios控制块
ADAPTER : TADAPTERSTATUS; // Netbios adapter status//取网卡状态
LANAENUM : TLANAENUM; // Netbios lana
intIdx : Integer; // Temporary work value//临时变量
cRC : Char; // Netbios return code//NetBios返回值
strTemp : String; // Temporary string//临时变量
Begin
Result := '';
Try
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBENUM);
cRC := NetBios(@NCB);
NCB.ncb_buffer := @LANAENUM;
NCB.ncb_length := SizeOf(LANAENUM);
cRC := NetBios(@NCB);
If Ord(cRC)<>0 Then
exit;

ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBRESET);
NCB.ncb_lana_num := LANAENUM.lana[a];
cRC := NetBios(@NCB);
If Ord(cRC)<>0 Then
exit;
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBASTAT);
NCB.ncb_lana_num := LANAENUM.lana[a];
StrPCopy(NCB.ncb_callname, '*');
NCB.ncb_buffer := @ADAPTER;
NCB.ncb_length := SizeOf(ADAPTER);
cRC := NetBios(@NCB);
strTemp := '';
For intIdx := 0 To 4 Do
strTemp := strTemp+InttoHex(Integer(ADAPTER.adapter_address[intIdx]),2)+'-';
//黄海为了加上-才想出的办法
strTemp := strTemp+InttoHex(Integer(ADAPTER.adapter_address[5]),2);
Result := strTemp;
Finally
End;
End;

procedure TForm1.FormCreate(Sender: TObject);
begin
//取得第一块网卡的MAC地址
Label5.Caption:=NBGetAdapterAddress(0);
//设置并读取数据库中IP信息
ADOConnection1.ConnectionString :='Provider=Microsoft.Jet.OLEDB.4.0;Password="";' +
'User ID=Admin;Data Source=' + ExtractFilePath(Application.ExeName) +
'\MacData.mdb;Mode=Share Deny None;Persist Security Info=True;Extended Properties=""';

ADOQuery1.Connection := ADOConnection1;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select *from IP_MAC_TABLE where MAC = :sh');
ADOQuery1.Parameters.ParamByName('sh').Value:=NBGetAdapterAddress(0);

ADOQuery1.Open;
Label6.Caption:=ADOQuery1.fieldByName('IP').Value;
Label7.Caption:=ADOQuery1.fieldByName('COMPUTER_NAME').Value;
Label8.Caption:=ADOQuery1.fieldByName('USER').Value;
Label11.Caption:=ADOQuery1.fieldByName('GATEWAY').Value;
Label12.Caption:=ADOQuery1.fieldByName('subnetmask').Value;
Label14.Caption:=ADOQuery1.fieldByName('dns').Value;
ADOQuery1.Close;

end;


procedure WriteHostName(HostName:string);
var
Reg:Tregistry;
begin
//第一步
Reg:=Tregistry.Create;{创建Tregistry对象的实例}
Reg.Rootkey:= HKEY_LOCAL_MACHINE;{设置根键名称}
Reg.OpenKey('SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName',true);
Reg.WriteString ('ComputerName',HostName);
Reg.CloseKey;{将更改内容写入注册表并关闭}
Reg.Free;{释放对象}

//第二步
Reg:=Tregistry.Create;{创建Tregistry对象的实例}
Reg.Rootkey:= HKEY_LOCAL_MACHINE;{设置根键名称}
Reg.OpenKey('SYSTEM\CurrentControlSet\Services\Tcpip\Parameters',true);
Reg.WriteString ('Hostname',HostName);
Reg.CloseKey;
Reg.Free;{释放对象}

//第三步
Reg:=Tregistry.Create;{创建Tregistry对象的实例}
Reg.Rootkey:= HKEY_LOCAL_MACHINE;{设置根键名称}

Reg.OpenKey('SYSTEM\CurrentControlSet\Services\Tcpip\Parameters',true);
Reg.WriteString ('NV Hostname',HostName);

Reg.CloseKey;{将更改内容写入注册表并关闭}
Reg.Free;{释放对象}

end;



  回复  引用    

#24楼  2004-12-27 15:44 吕震宇      
@网际浪子

非常感谢提供代码!
  回复  引用  查看    

#25楼  2005-01-18 06:38 ycwang [未注册用户]
海光蓝卡产生的用户,只是一些授限用户,这种用户在Win2000中软件执行时会产生错误,请问各位高手如何解决.
1.将海光蓝卡产生的用户,添加到Win2000管理员组
2.解决如OFFICE2000 在不同用户中的共享使用问题
3.如何使在win2000中任一用户中安装的软件能被所有用户所共用.
  回复  引用    

#26楼 [楼主] 2005-01-18 07:42 吕震宇      
在海光蓝卡的说明书中写着,将所有自动生成的用户都改成administrator后再确认修改IP地址。不知道与这个有没有关系。
  回复  引用  查看    

#27楼  2005-01-21 00:03 lzp [未注册用户]
记得好像有文档说这样复制可能有安全问题。特别是域的环境。另外,windows2000下有一个工具sysprep可能能解决这个问题。另:运行这个程序前最好看看说明。
  回复  引用    

#28楼  2005-01-26 17:12 李锦江 [未注册用户]
WIN2000的计算机名不能修改问题出在那里?
  回复  引用    

#29楼  2005-03-15 17:25 王新博 [未注册用户]
高手就是高手!我什么也没看懂!
哎!
好郁闷呀!
能来点简单的吗?
比如说安装个小程序就可以搞顶了!
谢谢!那位仁兄能推荐一下呀!
谢谢 !
  回复  引用    

#30楼  2005-03-20 13:00 创峰 [未注册用户]
可以提供编好的程序吗?
  回复  引用    

#31楼  2005-03-20 13:01 创峰 [未注册用户]
只要修改计算机名的就行了。
  回复  引用    

#32楼  2005-04-13 13:51 风 [未注册用户]
你可不可以在写一个nt注销的bat文件呀?
我很想知道怎么用bat让nt注销
  回复  引用    

#33楼  2005-04-28 06:42 高申 [未注册用户]
我说个思路或许有用,如果只使用ghost 会导致名字冲突,如果在ghost之前用 sysprep 封装系统,并提供自动配置文件(其中的计算机名设置为随即,ip 地址自动获取) 然后再ghost过去,这样客户端 ghost 结束后还要执行一个最小化安装过程(时间很快,解决了名字冲突), 然后再运行搂主那样的程序或者脚本,只需要根据dhcp分配的ip 改成相应的名字就可以了,还可以去掉ip-mac 的数据库。

不过我忘记一个问题了 sysperp 封装以后 用不用重新安装驱动 ???想不起来了 有时间4一下再回复,

我qq 49589927 msn isa.net@163.com 希望搂主解决了问题的话
能把程序或者脚本给我一份:) 谢谢!!!
  回复  引用    

#34楼  2005-04-29 18:38 GingkoY      
克隆成功后,系统重新启动。但克隆后的XP系统会发现新设备:重新识别网卡,并且网卡名变成了“本地连接 2”。如果我在样板机上将网卡名改为“本地连接 2”,则克隆后的机器网卡名变为“本地连接”。

我用了个笨方法:对这两个名称的网卡都改了IP及DNS。实在不高明,所以求助原作者了。


  回复  引用  查看    

#35楼 [楼主] 2005-04-30 19:13 吕震宇      
我也曾经遇到过这样的问题,可能是网卡并不完全相同。我的解决办法是在BAT文件上做文章:

@ECHO OFF
rem 修改IP地址、子网掩码、网关
cmd /c netsh interface ip set address name="本地连接" source=static addr=10.16.19.%1 mask=255.255.255.0 gateway=10.16.19.254 gwmetric=1

cmd /c netsh interface ip set address name="本地连接2" source=static addr=10.16.19.%1 mask=255.255.255.0 gateway=10.16.19.254 gwmetric=1

。。。

呵呵,这样就两头堵了:),一个“本地连接”一个“本地连接2”。

另外我还遇到过克隆后系统没有自动设置为DHCP,而是取了原有机器的IP地址(不明白为什么)。这个时候系统就报告IP冲突并且也不会自动到DHCP上自动申请IP地址。所以现在我采用的方法是这样的(对BAT文件进行一番改造):

......

cmd /c netsh interface ip set address name="本地连接" source=dhcp

cmd /c netsh interface ip set address name="本地连接2" source=dhcp

cmd /c netsh interface ip set address name="本地连接" source=static addr=10.16.19.%1 mask=255.255.255.0 gateway=10.16.19.254 gwmetric=1

cmd /c netsh interface ip set address name="本地连接2" source=static addr=10.16.19.%1 mask=255.255.255.0 gateway=10.16.19.254 gwmetric=1

......

呵呵,开始4头堵了:)
  回复  引用  查看    

#36楼  2005-05-01 23:02 abc [未注册用户]
对于楼上的问题,我一般是在克隆之前,将母版机的网卡删除掉,这样克隆之后就不会有2个连接了
  回复  引用    

其他的我都看的懂 就是 "将所有机器号与MAC映射表存储成Access数据库,并将IP地址设置为自动获取DHCP" 这里我不明白…………因为我对SQL和编程不是很了解 呵呵~~~ 如何做到这2步呢??
  回复  引用    

我的是2000 SERVER,为什么计算机名始终改得不成功.从我的电脑的属性里面的网络标识看,那个计算机名始终改不了,请问有什么办法改啊?
  回复  引用    

#39楼  2005-06-22 15:18 吕震宇      
@贴心男儿

你在2000 Server中看到的是HostName,而文中所写的程序更改的是ComputerName,所以改不了。如果想修改HostName,那么可以通过修改注册表实现。

在上面的“回复”中,你可以读一读我的回复以及“ 网际浪子”的回复,里面有设置什么注册表键值以及如何用Delphi修改注册表。
  回复  引用  查看    

#40楼  2005-06-27 09:01 傻大个 [未注册用户]
有怎么好的软件^你发给我试试^^在网吧工作^改IP很累呀^^同类人都知道^^^那好人加我QQ:吧^^^117798225^^晚上基本都在^傻大个在这谢谢大家了
  回复  引用    

#41楼  2005-06-28 18:01 周生 [未注册用户]
有时取出来的MAC地址,不是当前的
比如我的电脑两个网卡,但是NETBIOS命令能够显示出6个MAC地址,有时0代表的是当前的,但有时又不是,现在还没解决的
  回复  引用    

[原创] Ghost 以后自动修改 机器名,IP地址!
————————————————————————————————————————————————————————————————————————————------
@echo off

:::--------------------------------------------------------------------------
:::::请你在使用把[MacAddress] 字段下 改为你自己的机器配置:::::::::
:::::此文件,只在win2k 专业版下 测试过:::::::::::::
:::::带有“::::” 后面的语句为 注释::::::::::
:::::因为会修改你的机器配置。请在测试机器上使用!:::::
:::---------------------------------------------------------------------

@cls :::清屏
@echo [ComputerName] [MacAddress] [IPAddress] [CS-CDKey] >config.cfg
@echo Nh005 00-11-5B-CF-C8-12 192.168.0.5 3245164654063 >>config.cfg
@echo Nh006 00-11-5B-BD-2F-E4 192.168.0.6 3385636230783 >>config.cfg
@echo Nh007 00-11-5B-B3-F0-86 192.168.0.7 2030698167302 >>config.cfg
@echo Nh008 00-11-5B-C8-C8-E1 192.168.0.8 7149496192146 >>config.cfg
:::::::添加你自己的机器配置
::::获取机器的TCP/IP 配置
if exist ipconfig.txt del ipconfig.txt
ipconfig /all >ipconfig.txt

:::分离出机器的物理地址,并保存到 ( phyaddr.txt) 文件中
if exist phyaddr.txt del phyaddr.txt
find "Physical Address" ipconfig.txt >phyaddr.txt

::::从(c:\phyaddr.txt)文件中取得物理地址字符串,并赋给变量"MacAddress"
for /f "skip=2 tokens=12" %%M in (phyaddr.txt) do set strMac=%%M

:::显示物理地址字符串
@echo %strMac%

::::以变量"strMac"为关键字搜索(Config.cfg)中相同的字符串行,并保存到(ComputerCfg.txt)
find "%strMac%" Config.cfg >ComputerCfg.txt

::::显示机器名. (从"ComputerCfg.txt"中分离出 机器名字段,并赋给变量"ComputerName")
for /f "skip=2 tokens=1" %%N in (ComputerCfg.txt) do set ComputerName=%%N
@echo %ComputerName%

::::显示IP地址. (从"ComputerCfg.txt"中分离出 IP地址字段,并赋给变量"IPAddress")
for /f "skip=2 tokens=3" %%I in (ComputerCfg.txt) do set IPAddress=%%I
@echo %IPAddress%

::::显示网卡MAC地址.(从"ComputerCfg.txt"中分离出 MAC地址字段,并赋给变量"MacAddress")
for /f "skip=2 tokens=2" %%M in (ComputerCfg.txt) do set MacAddress=%%M
@echo %MacAddress%
for /f "skip=2 tokens=4" %%C in (ComputerCfg.txt) do set strCdkey=%%C
@echo %strCdkey%
::::创建注册表文件
@echo Windows Registry Editor Version 5.00 >ComputerName.reg
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName] >>ComputerName.reg

::::用变量"%ComputerName%"去替换实际的机器名
@echo "ComputerName"="%ComputerName%" >>ComputerName.reg
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters] >>ComputerName.reg

::::用变量"%ComputerName%"去替换实际的机器名
@echo "NV Hostname"="%ComputerName%" >>ComputerName.reg
@echo "Hostname"="%ComputerName%" >>ComputerName.reg
::::修改 CS-CDKEY 不用管它
@echo [HKEY_CURRENT_USER\Software\Valve\CounterStrike\Settings]>>ComputerName.reg
@echo "Key"="%strCdkey%">>ComputerName.reg
@echo [HKEY_USERS\S-1-5-21-839522115-507921405-2146800195-500\Software\Valve\CounterStrike\Settings]>>ComputerName.reg
@echo "Key"="%strCdkey%">>ComputerName.reg

::::导入注册表文件。用的时候把" :: " 去掉
regedit /s ComputerName.reg

::::修改IP 地址。用变量"%IPAddress%" 去替换实际的IP 地址
netsh interface ip set address name="本地连接" source=static addr=%IPAddress% mask=255.255.255.0 gateway=192.168.0.1 gwmetric=1
::::重起机器批处理!
setlocal
cd/d %temp%
echo [version] > reboot.inf
set inf=InstallHinfSection DefaultInstall
echo signature=$chicago$ >> reboot.inf
echo [defaultinstall] >> reboot.inf
rundll32 setupapi,%inf% 1 %temp%\reboot.inf
del reboot.inf


c:
cdcd %USERPROFILE%\「开始」菜单\程序\启动
del /q *.*
-------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------

把此内容 粘贴到 记事本里。另存为 “1。bat” 批处理文件。在做ghost 镜像时
放到启动组里!
有什么问题 请联系 : QQ:233002600
  回复  引用    

#43楼  2005-09-11 21:27 wang [未注册用户]
digsea2000的贴子。实在是高!!!!!!是这里最好的@!@@@@@
  回复  引用    

#44楼  2005-09-17 01:48 klrtbf [未注册用户]
手工取的MAC 在DHCP服务器上为客户机改名!改IP!可能实现~~~~~~~~~~~~~~~~
  回复  引用    

楼主好,
想向你请教一个问题。就是你这60多台机器里的xp系统是怎么做的,我这里的机器配置都一样,只是我做的镜像恢复以后系统就启动不起来了。需要重新激活,或者系统干脆不干了。我用的是xpsp2.

急切请教这个问题。可以mail我:LuoZii@Gmail.com
也可QQ:3306237


顺便提一下,最近在一网吧看到他们重新恢复系统以后,再配置机器时只输入了一个编号,然后ip,计算机名字,网关,DNS就都好了。他们有个wins服务器.

请楼主回复,或者指点我。我关注此帖.
  回复  引用    

叼 看不懂
  回复  引用    

#47楼 [楼主] 2005-10-11 23:58 吕震宇      
digsea2000的帖子解决了Windows 2000更新的问题,XP只需进行微小的调整也可以适用,但对于Win98就不灵了。Win98的批处理命令中对for命令的支持有限,所以digsea2000给出的批处理在98下无法使用。

可是该死的NIT考试居然还在考98,这让我不得不另找思路。我使用了WinBatch。首先创建MAC Address数据库(Config.cfg文件)

[ComputerName] [MacAddress] [IPAddress] [HostName] [ID]

Stu01 50-78-4C-43-39-6F 10.16.19.1 Stu01 1
Stu02 50-78-4C-43-72-F5 10.16.19.2 Stu02 2
Stu03 50-78-4C-43-6B-D0 10.16.19.3 Stu03 3
......
*EOF*

然后编写UpdateIP-98.WBT

#DefineFunction GetTCPIPInfo_UDF(value)
Caption = "Error"
origdir = DirGet()
OutputFile = StrCat (origdir, "IPCFG_TEMP.TXT")
RunHideWait('WINIPCFG', '/ALL /BATCH > "%OutputFile%"')

If !FileExist(OutputFile)
MessageTxt = StrCat ("TCP/IP parameters can't be determined.", @CRLF)
MessageTxt = StrCat (MessageTxt, @CRLF, "No data will be captured.", @CRLF)
Message (Caption, MessageTxt)
exit
EndIf

h = FileOpen("%OutputFile%", "READ")

while @TRUE ; Loop till break do us end
l = FileRead(h)
if StrIndex(l, value, 1, @FWDSCAN) != 0 Then Break
endwhile

Address = StrSub(l, StrScan(l, ":", 1, @FWDSCAN) + 1, -1)
Address = StrTrim(Address)
FileClose(h)
FileDelete(OutputFile)

return Address
#EndFunction

macAddr = GetTCPIPInfo_UDF("物理地址")

; To open for reading:
handle = FileOpen(StrCat(DirGet(), "config.cfg"), "READ")

while @TRUE ; Loop till break do us end
line = FileRead(handle)
if StrIndex(line, macAddr, 1, @FWDSCAN) != 0 Then Break
if StrIndex(line, "*EOF*", 1, @FWDSCAN) != 0 Then Terminate(@TRUE, "", "Can't find MAC Address!")
endwhile

fileclose(handle)

computerName = StrSub(line, 2, 5)
ipAddress = StrSub(line, 30, 11)

; Write to a register file
handle = FileOpen(StrCat(DirGet(), "ComputerName.reg"), "WRITE")
FileWrite(handle, "REGEDIT4")
FileWrite(handle, "[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName]")
FileWrite(handle, '"ComputerName"="%computerName%"')

; Loop for each Net Card to set IP
key=RegOpenkey(@RegMachine, "System\CurrentControlSet\Services\Class\NetTrans")
netTrans=RegQueryKeys(key)

; Parse a string with multiple delimiters into standard param format
length=StrLen(netTrans)
start = 1
while @TRUE
finish = StrScan(netTrans, @tab, start, @FWDSCAN)
If finish == 0
break
else
value = StrSub(netTrans, start, finish - start)
start=finish+1
FileWrite(handle, "[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans\%value%]")
FileWrite(handle, '"IPAddress"="%ipAddress%"')
FileWrite(handle, '"IPMask"="255.255.255.0"')
FileWrite(handle, '"DefaultGateway"="10.16.19.254"')
If finish == length then Break
endif
endwhile
If start <= length
finish = length+1
value = StrSub(netTrans, start, finish - start)
FileWrite(handle, "[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans\%value%]")
FileWrite(handle, '"IPAddress"="%ipAddress%"')
FileWrite(handle, '"IPMask"="255.255.255.0"')
FileWrite(handle, '"DefaultGateway"="10.16.19.254"')
endif

FileClose(handle)

RunHideWait('regedit', '/s ComputerName.reg')
FileDelete(StrCat(DirGet(), "ComputerName.reg"))
FileDelete('C:\WINDOWS\Start Menu\Programs\启动\UpdateIP*.*')
Display(3, "Reg Updated","Update OK!")
Gosub Close_all

; Reboot
RunHideWait('rundll32.exe', 'shell32.dll,SHExitWindowsEx 2')
Exit


:Close_all ;Close all windows except hidden
windows = WinItemize()
cnt=ItemCount(windows, @tab)
for c = 1 to cnt
current = ItemExtract(c, windows, @TAB)
if StrIndexNc(current, "Close95.wbt", 1, @FWDSCAN) != 0 then continue ;skip if window is for this script
if WinState(current) == @HIDDEN then continue ;skip if window is hidden
WinClose(current)
next
IntControl(12,5,0,0,0) ;Allow quiet termination of script
return
------------------

这样,在Win98下也可以自动修改IP了。写这些算是对digsea2000的帖子的一个补充吧。
  回复  引用  查看    

#48楼  2005-10-13 11:53 严严 [未注册用户]
有没有用ASP写的版本呢?
  回复  引用    

#49楼 [楼主] 2005-10-17 19:45 吕震宇      
ASP??你不会是指写网页用的ASP吧?我想用这个东西恐怕写不出来。
  回复  引用  查看    

#50楼 [楼主] 2005-11-07 09:37 吕震宇      
digsea2000的帖子中存在的一点问题:

当批处理用在WinXP和Win2003时会出问题,原因是for命令截取出来的ComputerName等会在后面加一个空格。Windows是不允许当计算机名后面有空格的。尽管IP地址完全可以正常分配,但有空格的计算机名和HostName将导致一些网络功能失败。例如通过“\\10.16.19.1\c$”访问另外一台计算机的资源时导致失败。

解决的办法就是要去掉可能存在的“空格”。下面提供一种思路,在WinXP和Win2003上已经测试通过:

1、修改config.cfg文件格式如下:
[ComputerName] [MacAddress] [IPAddress] [HostName] [ID]

"Stu01" 50-78-4C-43-39-6F 10.16.19.1 "Stu01" 1
"Stu02" 50-78-4C-43-72-F5 10.16.19.2 "Stu02" 2
"Stu03" 50-78-4C-43-6B-D0 10.16.19.3 "Stu03" 3
......

注意在ComputerName列以及HostName列中是包含双引号的名称。

2、修改生成注册表的那几条命令,去掉双引号:

REM ---------------------------------------------------------------------
REM 用变量"%ComputerName%"去替换实际的机器名
REM ---------------------------------------------------------------------
@echo "ComputerName"=%ComputerName% >>ComputerName.reg
@echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters] >>ComputerName.reg

REM ---------------------------------------------------------------------
REM 用变量"%strHostName%"去替换实际的HostName
REM ---------------------------------------------------------------------
@echo "NV Hostname"=%strHostName% >>ComputerName.reg
@echo "Hostname"=%strHostName% >>ComputerName.reg

这样就不会出现结尾有空格的问题了。
  回复  引用  查看    

牛叉。弱弱的问一句,必须要用DHCP服务器才能使用不?
  回复  引用    

#52楼 [楼主] 2005-11-07 13:16 吕震宇      
不用
  回复  引用  查看    

如果配置多个网关和多个DNS呢?
  回复  引用    

上面那个问题已经搞定了。

[ComputerName] [MacAddress] [IPAddress] [HostName] [ID]

"Stu01" 50-78-4C-43-39-6F 10.16.19.1 "Stu01" 1
"Stu02" 50-78-4C-43-72-F5 10.16.19.2 "Stu02" 2
"Stu03" 50-78-4C-43-6B-D0 10.16.19.3 "Stu03" 3


中的MAC地址区分大小写的吗?为什么我两边大小写不统一就不行呢?
  回复  引用    

#55楼 [楼主] 2005-11-07 20:17 吕震宇      
由于比较MAC地址时是与IPCONFIG /ALL的输出结果进行比较,所以必须全部大写。
  回复  引用  查看    

你们有什么简便的办法制作config.cfg文件?难道非要一个一个去抄MAC地址吗?
  回复  引用    

#57楼 [楼主] 2005-11-08 21:27 吕震宇      
办法到是有:
1、使用一些工具软件,我印象中Windows优化大师提供这种功能。
2、实在不行自己动手,如果你现在的机器已经手工分配好了IP地址,那么可以通过编一个小程序获得MAC地址及IP地址列表,然后通过数据库技术或EXCEL完成config文件的制作(可以导出成txt)格式。程序可以参考我的另外一篇blog:
http://zhenyulu.cnblogs.com/archive/2004/08/13/33037.html
《获取同网段其它机器的Mac地址》
3、实在不行也可以用DHCP动态分配IP后,在参考第2种方法。

在获得MAC地址后,有效的使用一些数据库(我用的是VFP),可以事半功倍。
  回复  引用  查看    

#58楼  2005-12-13 09:01 胡子 [未注册用户]
换机器就好了,-------赫赫。我用带保护卡的联想机以上功能都可以,海光保护卡做得最早不过很烂
  回复  引用    

#59楼  2005-12-13 09:07 胡子 [未注册用户]
换机器就好了,-------赫赫。我用带保护卡的联想机以上功能都可以,海光保护卡做得最早不过很烂
另外为什末一定用静态地址呢????????
  回复  引用    

ghost server+sysperp+自动获取ip地址
老大你的方法太没效率了
我这里300台机器,半小时就完了
  回复  引用    

#61楼  2005-12-21 12:54 FishGuoo [未注册用户]
楼主以及其他回复的内容都是好东西。
但我想问一下,如果不单独生成*.exe的文件,而是写在ASP里,放在本地服务器上,然后访问该ASP页面时获得访问者的计算机名或MAC地址,放在本地服务器的数据库内。这个有谁能告诉怎么写(不做非法用途)?
这个方法一般用在一些匿名调查页面内。为了防止用户反复提交,但又因为是匿名调查,所以不可能通过用户名来排查,所以只能通过获得访问者的计算机名或者MAC地址进行排查。当然,我也有尝试获得IP和Cookies来排查。但想到IP的话,虚拟的拨号,IP是不固定的;而获得Cookies,我觉得也不太现实,因为就拿我自己来说,我基本上是每隔24小时清空一次Cookies。
因此,特此前来向各位前辈讨教。
我的邮箱地址是shuangyu_g@yahoo.com.cn
  回复  引用    

看了大家的发言后,觉得都不错,我是一名高校的机房管理人员,楼主的思路很好,跟我现在使用的方法是一样的,但有些差别,在2000中就算IP冲突但不断交换机是不会取不到MAC的,但XP就没有试过,所以我不需要架设DHCP服务器,我取MAC是这样来取的
Private Sub Command1_Click()
strComputer = "."
WQL = "SELECT * FROM " & "Win32_NetworkAdapterConfiguration WHERE IPEnabled = True"
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set NetworkAdapters = objWMIService.ExecQuery(WQL)
For Each Adapter In NetworkAdapters
Mac = Adapter.MACAddress
Next
Text1.Text = Mac
End Sub
加个TEXT1和按钮就可以了!
我是进入系统重启,后再进行检查,如果跟库里的一样那就删除启动并修改登陆用户和密码,再重启就能用设定的用户登陆,我设的是USER用户。
  回复  引用    

#63楼  2006-03-27 15:35 guest [未注册用户]
吕震宇老师,用winbatch 运行UpdateIP-98.WBT 的代码,报错RunHideWait('WINIPCFG', '/ALL /BATCH > "D:\IPCFG_TEMP.TXT"') 。请帮助
  回复  引用    

#64楼  2006-04-01 01:48 yangx [未注册用户]
吕震宇老师:帮帮忙,在win98下实现自动修正计算机名
  回复  引用    

#65楼  2006-04-30 10:35 pc技术 [未注册用户]
不错
  回复  引用    

#66楼  2007-05-17 08:45 zxj [未注册用户]
kghjghjkgh
  回复  引用    

if exist ipconfig.txt del ipconfig.txt
ipconfig /all >ipconfig.txt

:::分离出机器的物理地址,并保存到 ( phyaddr.txt) 文件中
if exist phyaddr.txt del phyaddr.txt
find "Physical Address" ipconfig.txt >phyaddr.txt

::::从(c:\phyaddr.txt)文件中取得物理地址字符串,并赋给变量"MacAddress"
for /f "skip=2 tokens=12" %%M in (phyaddr.txt) do set strMac=%%M

:::显示物理地址字符串
@echo %strMac%

::::以变量"strMac"为关键字搜索(Config.cfg)中相同的字符串行,并保存到(ComputerCfg.txt)
find "%strMac%" Config.cfg >ComputerCfg.txt
-------------------------------------------------
查看变量
set
strMac=00-30-18-A9-30-47
--------------------------------------------------------------
问题:我生成的comptercfg.txt中一个文字也没有 但我打开comptercfg.txt查找的确有00-30-18-A9-30-47这个MAC地址
find "%strMac%" Config.cfg >ComputerCfg.txt 怀疑这条命令为什么没把变量转换
我的系统是XP SP2
  回复  引用    

但输入find "00-30-18-A9-30-47 " Config.cfg >ComputerCfg.txt
可以得到
F:\123>type computercfg.txt

---------- PC.CFG
A-151-044 00-30-18-a9-30-47 192.168.2.44

请问如何解决这个部题?
谢谢
  回复  引用    

#69楼  2007-11-14 16:12 leowang [未注册用户]
你还用还原卡的GHOST网克呀,太慢
我的几百台机就几十分钟搞定了!
  回复  引用    

#70楼  2007-11-22 19:12 03UDENT [未注册用户]
哈哈 老吕
老师您好 我是你03届的学生 .net学的不怎么样但是不影响学生想你呀
您人品好好 我在这里给你做广告了 哈哈
说实话 在理工吕老师口碑很好的 不好的是我们这帮不争气的学生 55555

  回复  引用