在程序中实现远程访问控制

原创 2002年07月23日 09:05:00

                             在程序中实现远程访问控制
                                                              作者:xrbeck

  远程访问控制(Remote Access Service)是Windows NT,
Win2000 Server提供的一种远程服务,它允许用户从远端
通过拨号连接连接到一个本地的计算机网络,一旦建立了
连接,就相当于处在了本地的LAN中,从而可以使用各种各样
的网络函数以便进行访问,本文就是给大家介绍这种听起来
就很动心的技术。 :)
  首先我们需要配置服务器端的RAS服务,在这里以2k Server
为例,第一安装modem,相信大家应该没什么问题吧.装好
modem后,选择"控制面板"中的"网络和拨号连接",新建连接,
选择"接受接入的连接",并且在最后一步添加一个允许登录
的帐号,本文设置用户名:xr 密码:xr,这样就在服务器端
建立了一个"等待接入"的连接,然后右键选择属性,在网络
中选择TCP/IP协议,因为笔者的LAN中是通过代理,静态的分配
保留IP地址172.18.所以在这个地方选择"指定TCP/IP地址"
从'172.18.1.27“到"172.18.1.28"分配两个IP地址.这是
因为VLSM是255.255.255.224,一个LAN中保留30台机器,
选择后面几台未分配的IP地址。打开控制面板中的管理工具,
选择路由和远程访问,选择本地服务器,并且"配置并启用
路由和远程访问",可以查看活动与否的端口.
   这样在服务器端就配置好了RAS服务.接下来进入关键
部分:在远端用程序实现RAS连接.同样我们需要电话线和modem.
安装好后我们就能利用系统提供的rasapi实现拨号连接.
  以BCB5.0为例:给出源程序如下:
1.连入头文件ras.h,raserror.h和库文件rasapi.lib
  这个地方要注意有个版本冲突问题,所以需要临时的设置
WINVER这个变量.具体代码如下:
#define OLDVER WINVER
#undef  WINVER
#define WINVER 0x400

#include <ras.h>
#include <raserror.h>

#undef WINVER
#define WINVER OLDVER
#undef OLDVER
静态连入rasapi.lib后,我们就能利用API函数实现拨号了

2. 拨接部分:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        //
        hrasconn=NULL;
        RASDIALPARAMS params;
        char    buf[256];
        memset(buf,0,256);

        params.dwSize=sizeof(RASDIALPARAMS);

        lstrcpy(params.szEntryName,"");
        lstrcpy(params.szPhoneNumber,"208");
        lstrcpy(params.szUserName,"xr");
        lstrcpy(params.szPassword,"xr");
        lstrcpy(params.szDomain,"");

        int ret=RasDial(NULL,
                        NULL,
                        &params,
                        0,
                        &RasDialFunc,
                        &hrasconn);
        if(ret!=0)
        {
            RasGetErrorString(ret, buf, 256);
      memStatus->Lines->Add(buf);

        }
}
其中RasDial为异步访问方式,208为笔者测试的公司内部
的服务器的电话号码,xr是登录的用户名和口令,因为
测试的2K Server是作为对等网中的普通一员,没有domain,
所以设置为空.

3. 回调函数部分:
   类似大部分的window程序,ras也提供了回调函数来
异步的处理连接,这样的情况很多,比如Winsock也提供
了窗口消息的异步方式.
void WINAPI RasDialFunc(UINT MSG,RASCONNSTATE rasconnstate,DWORD dwError)
{
    //
    char szRasString[256]; // Buffer for storing the error string
    memset(szRasString,0,256);
    DWORD cb=sizeof(RASPPPIP);
    DWORD ret;

 if (dwError)  // Error occurred
 {
  RasGetErrorString((UINT)dwError, szRasString, 256);
  Form1->memStatus->Lines->Add(szRasString);
  return;
 }
     switch (rasconnstate)
 {
  // Running States
  case RASCS_OpenPort:
   Form1->memStatus->Lines->Add("Opening port...");
   break;

  case RASCS_PortOpened:
   Form1->memStatus->Lines->Add("Port opened.");
          break;

  case RASCS_Authenticated:
   Form1->memStatus->Lines->Add("Authentication complete.");
   break;

  case RASCS_Connected:
   Form1->memStatus->Lines->Add("Connection Connected.");

              Form1->lpProjection=new RASPPPIP;
              Form1->lpProjection->dwSize=sizeof(RASPPPIP);
              if(RasGetProjectionInfo(Form1->hrasconn,RASP_PppIp,Form1->lpProjection,&cb)==ERROR_SUCCESS)
              {
                  Form1->memStatus->Lines->Add("Server IP:"+(AnsiString)(Form1->lpProjection->szServerIpAddress));
                  Form1->memStatus->Lines->Add("Local IP:"+(AnsiString)(Form1->lpProjection->szIpAddress));
          }
   break;

  case RASCS_Disconnected:
   Form1->memStatus->Lines->Add("Disconnecting...");
   break;

  default:
   Form1->memStatus->Lines->Add("Unknown Status ");
   break;
 }

处理各种消息,其中在连接部分使用RasGetProjectionInfo得到连接
分配的IP地址和服务器端的地址.由于是静态的分配的,所以和服务器
端是处于一个子网当中,也就能使用各种各样的资源了,比如说可以使用
WNET系列函数得到LAN中的情况,又或者在Connect事件后建立套接字,
实现传输.笔者测试如下:拔掉客户端的网线后,建立连接后能ping到
LAN中其他的机器,而且由于处于子网中,所以也能上网了,使用IPHelper
函数返回的子网掩码和网关是一致的.

   本文为大家介绍了什么是RAS以及如何编程实现RAS服务,无疑这是一项
方便而强大的功能.希望能给大家带来帮助.也欢迎大家进一步继续
讨论.QQ.33854303

测试环境: 客户端BCB5.0+Win98. 服务器端:Win2000 Server
         
参考书籍: Windows网络编程
           Internet与TCP/IP程序设计之C++ Builder高手  

postfix邮件服务:远程发送及访问控制

1.远程主机发送邮件 [root@foundation19 Desktop]# telnet 172.25.254.119 25 Trying 172.25.254.119… Connected...
  • Error_404notFound
  • Error_404notFound
  • 2017年05月22日 22:33
  • 265

Windows的访问控制模型

经过12月份的奋斗,OJ的判题程序已经初具雏形了,不过安全性仍然是一个令我非常头疼的问题,在这个问题上几乎耗了半个月的时间。虽然还没有找到完美的解决方法,但总算了解了Windows的安全性是如何工作的...
  • az44yao
  • az44yao
  • 2015年06月30日 19:30
  • 732

java访问控制关键字用法

(1)私有的:用关键字private修饰,只有本类可见。 (2)默认的:不用访问控制符关键字修饰,在本类、本包可见,不同包的子类都不可见。 (3)受保护的:用关键词protected修饰,在本类、...
  • bruse1990
  • bruse1990
  • 2014年06月07日 00:38
  • 875

Linux运维笔记----sshd(远程访问控制服务)

sshd(远程访问控制服务)1.什么是openSSH openSSH 是 SSH (Secure SHell) 协议的免费开源实现。SSH协议族可以用来进行远程控制, 或在计算机之间传送文件。而实现...
  • men_wen
  • men_wen
  • 2016年09月03日 22:43
  • 1255

自主访问控制

自主访问控制是根据自主访问控制策略建立的一种模型,允许合法用户以用户或用户组的身份访问策略规定的客体,同时组织非授权用户访问客体,某些用户还可以把自己拥有的客体的访问权限授予其他用户 自主访问控制又...
  • ShaoqunLiu
  • ShaoqunLiu
  • 2016年08月06日 14:00
  • 1470

PHP:访问控制

访问控制,也称为“可见性”,描述了类的属性和方法的可访问性。通俗一点,就是用于指示类的成员在哪里可被引用,在哪里不能被访问。 可见性有三个等级:public、protected和private。把其中...
  • github_36704158
  • github_36704158
  • 2017年03月07日 18:14
  • 131

对类成员访问权限的控制,是通过设置成员的访问控制属性实现的,下列不是访问控制属性的是( )

对类成员访问权限的控制,是通过设置成员的访问控制属性实现的,下列不是访问控制属性的是(    )  正确答案: D   你的答案: D (正确) 公有类型 私...
  • chengonghao
  • chengonghao
  • 2016年07月15日 20:21
  • 1008

在云计算中实现安全、可伸缩、细粒度数据的访问控制

Achieving Secure, Scalable, and Fine-grained Data Access Control in Cloud Computing
  • zhangyuehuan
  • zhangyuehuan
  • 2014年04月22日 20:49
  • 5274

Java类成员访问控制权限

类成员访问控制权限   在JAVA中有四种访问控制权限,分别为:private, default, protected, public   1、Private 如果一个成员方法或变量名前使用...
  • s634772208
  • s634772208
  • 2017年04月05日 22:21
  • 194

java访问控制权限

所有优秀的代码都是再反复重写多次,不断的改变下才变得完美。但是通常客户端程序员需求类库的的代码某些方面保持不变。而类库开发者需要完善修改类库的代码。由此产生了一个基本问题:“如何把变动的事物和保持不变...
  • VNanyesheshou
  • VNanyesheshou
  • 2015年09月29日 13:37
  • 1534
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在程序中实现远程访问控制
举报原因:
原因补充:

(最多只允许输入30个字)