利用网卡ID号自动注册
利用网卡ID号自动注册
目前,有不少单位用Novell服务器+无盘工作站的形式组建局域网。但在使用时,由于要求每台工作站对应一个固定用户名注册以便于管理,因此不能在AUTOEXEC.BAT中直接注册,只能由用户在上网时手工键入。
其实Novell客户程序(IPX、ODI皆可)加载后,通过DOS中断的eeH功能可以获取网卡的ID号(48bit,全世界唯一):
mov ah,eeH
int 21H
下面这个程序中,当ax返回值不是ee00H时,cx、bx、ax就将返回网卡ID号。
void getNicID(char *nicID)
{
unsigned int rCX,rBX,rAX;
asm {
mov ah, 0xee;
int 0x21;
mov word ptr rAX,ax;
mov word ptr rBX,bx;
mov word ptr rCX,cx;
}
if(rAX!=0xee00) sprintf( nicID, “%04x%04x%04x”,rCX, rBX,rAX);
else sprintf( nicID, “000000000000”);
}
创建一文本文件LOGIN.LST,格式如下:
第一行为总用户数
第二行为用户名
第三行为该用户的机器网卡ID号
第四行为用户名
第五行为该用户的机器网卡ID号
...
调用函数getNicID()获得网卡ID号后,查注册数据文件LOGIN.LST就可获得注册名。
修改AUTOEXEC.BAT如下:
lh IPX.COM
NETX.EXE
set COMSPEC=f:\login\command.com
AUTOLGIN.EXE
当用户打开计算机电源或重启动后,AUTOLGIN.EXE自动查询LOGIN.LST,若该机器网卡地址有对应用户名则自动注册,否则显示网卡ID号并等待用户键入用户名。
(源程序附后,可以省略)
//源程序 Borland C++3.1调试通过autolgin.cpp
//根据网卡ID号自动注册
//必须在网络驱动程序加载后运行
#include<stdio.h>
#include<string.h>
#include<process.h>
void getNicID(char *nicID)
{
unsigned int rCX,rBX,rAX;
asm {
mov ah, 0xee;
int 0x21;
mov word ptr rAX,ax;
mov word ptr rBX,bx;
mov word ptr rCX,cx;
}
if(rAX!=0xee00) sprintf( nicID, “%04x%04x%04x”,rCX, rBX,rAX);
else sprintf( nicID, “000000000000”);
}
void findLoginName(char *name,char *myNicID)
{
int i,number;
char nicID[13],loginName[20];
FILE *fp;
fp=fopen(“login.lst”,“r”);
fscanf(fp,“%d”,&number);
name[0]='\0';
for(i=0;i<number;i++)
{
fscanf(fp,“%s”,loginName);
fscanf(fp,“%s”,nicID);
strupr(nicID);
if(strcmp(nicID,myNicID)==0)
{
strcpy(name,loginName);
break;
}
}
fclose(fp);
}
void main()
{
char myNetID[13];
char name[20];
char command[80];
getNicID(myNetID);
strupr(myNetID);
findLoginName(name,myNetID);
printf("AUTO_LOGIN V1.0\nHawkfly Software (c)Copyright
1996-1997\n\n");
if(strlen(name)!=0)
{
printf(“Login Name :%s\n”,name);
printf(“Nic ID is:%s\n”,myNetID);
sprintf(command,“f:login %s”,name);
system(command);
else
printf(“Nic ID is:%s\n”,myNetID);
sprintf(command,“f:\\login\\login”);
system(command);
}
}
董丰云