注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 科普系列之-使用Windows的..
 帮助

Windows Server 3389


2007-08-16 23:27:34
 标签:Windows Server    [推送到技术圈]

以上的版本都提供了一个基于TCP协议的服务叫终端服务.因为它的监听端口默认为3389,所以俗称3389.实际上,微软开发终端服务的初衷,是为了抗衡UNIX的多用户服务,我去年利用业余时间为一公司开发机顶盒项目时接触到这一块,该项目的核心是把一个Linux系统精减到最小后写入启动芯片,启动后通过我们的客户端程序登陆服务器的终端服务,从而使用服务器上面的所有资源,用几百元的成本生产的机顶盒模拟出奔四电脑的功能来.当然,该系统比较庞大,还涉及到视频传输等与教学相关的功能.RDP只不过是其中一小块.而且该系统是基于Linux下的程序,不过协议部分在Windows平台下也是通用的.现在把当时的一些小技巧写出来供大家参考.文章分为开启3389,使用3389和3389的实质---RDP协议剖析三大部分.

    一:开启终端服务    终端服务使用的其实是RDP协议.默认情况下,操作系统是没有启动这个服务的.要开启这个服务,可以通过"添加删除Windows组件"来实现,或者在系统管理的"服务"里面直接启动.其实,安装完操作系统的时候,Windows已经把终端服务所需要的文件都安装了,要启动它,只要修改注册表然后重新启动电脑即可.

    1:开启本地终端服务.打开Delphi,编译以下代码,即可生成一个大小为11KB的StartRdp.exe,运行它即可打开本机的终端服务了.

program StartRdp;
{=======================================================}
{                                                       }
{ 深入浅出3389 - 打开本机3389代码                      }
{                                                       }
{ 版权所有 (c) 2004 陈经韬                              }
{                                                       }
{ http://www.138soft.com                                }
{                                                       }
{=======================================================}
uses
   Windows;
{$R *.res}

procedure AdjustToken();{NT内核电脑关机需要通过本函数获取特权}
var
hdlProcessHandle: Cardinal;
hdlTokenHandle: Cardinal;
tmpLuid: Int64;
tkp: TOKEN_PRIVILEGES;
tkpNewButIgnored: TOKEN_PRIVILEGES;
lBufferNeeded: Cardinal;
Privilege: array[0..0] of _LUID_AND_ATTRIBUTES;
begin
hdlProcessHandle := GetCurrentProcess;
OpenProcessToken(hdlProcessHandle,
(TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY),hdlTokenHandle);
LookupPrivilegeValue('', 'SeShutdownPrivilege', tmpLuid);
Privilege[0].Luid := tmpLuid;
Privilege[0].Attributes := SE_PRIVILEGE_ENABLED;
tkp.PrivilegeCount := 1; // One privilege to set
tkp.Privileges[0] := Privilege[0];
AdjustTokenPrivileges(hdlTokenHandle,False,tkp,Sizeof(tkpNewButIgnored),
tkpNewButIgnored,lBufferNeeded);
end;

function MyRegWriteInteger  (RootKey:HKEY;SubKey:String;KeyName:String;Value:integer):Boolean;
var
key : HKEY;
ret : integer;
chg : DWORD;
begin
Result:=False;
key := 0;
ret := RegCreateKeyEx(RootKey,Pchar(SubKey),0,Nil,REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,Nil,key,@chg);
if (ret<>ERROR_SUCCESS) or (key=0) then exit;
try
RegSetValueEx(key,Pchar(KeyName),0,REG_DWORD,@Value,sizeof(Value));
finally
RegCloseKey(key);
end;
Result:=True;
end;

const
RootKey:array[1..6] of HKEY=(HKEY_LOCAL_MACHINE,
HKEY_LOCAL_MACHINE,
HKEY_LOCAL_MACHINE,
HKEY_LOCAL_MACHINE,
HKEY_LOCAL_MACHINE,
HKEY_LOCAL_MACHINE);
SubKey:array[1..6] of String=('SOFTWAREMicrosoftWindowsCurrentVersionnetcache',
'SOFTWAREPoliciesMicrosoftWindowsInstaller',
'SYSTEMCurrentControlSetControlTerminal Server',
'SYSTEMCurrentControlSetServicesTermDD',
'SYSTEMCurrentControlSetServicesTermService',
'SYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp');
KeyName:array[1..6] of String=('Enabled','EnableAdminTSRemote','TSEnabled',
'Start','Start','PortNumber');
Value:array[1..6] of integer=(0,1,1,2,2,3389);
var
i:integer;
begin
for i:=1 to 6 do MyRegWriteInteger(RootKey[i],SubKey[i],KeyName[i],Value[i]);
AdjustToken; {获取关机特权}
ExitWindowsEx(EWX_REBOOT + EWX_FORCE, 0);{重启电脑}
end.

  2:开启远程3389服务方法之一:修改远程电脑注册表
  如果对方电脑开了远程注册表服务(默认情况下是开),那么我们可以直接连接该电脑然后修改它的注册表即可.简单的调用下面的函数即可实现向指定计算机的注册表写入键值.
function My_NetRegWriteInteger(StrServerName:String;RegRootKey:HKEY;StrSubKey,StrValueName:String;intValue:integer):Boolean;
begin
Result:=False;
with TRegistry.Create(KEY_READ or KEY_WRITE) do
try
RootKey:=RegRootKey;
if (StrServerName [1] <> '') and (StrServerName [2] <> '') then StrServerName:='\'+StrServerName;
if not RegistryConnect(StrServerName) then Exit;
if not OpenKey(StrSubKey,True) then Exit;
try
WriteInteger(StrValueName,intValue);
except
Free;
Exit;
end;
Result:=True;
finally
CloseKey;
Free;
end;
  写入注册表后,需要远程重新启动该电脑.
  (1)第一步:使用NetUser连接对方电脑:
function NetUse(const Server, User, Pasword: String): Boolean;
var
NetSource : TNetResource;
Re:integer;
begin
with NetSource do
begin
dwScope:=2;
dwDisplayType:=2;
dwUsage:=10;
lpComment:=nil;
dwType := RESOURCETYPE_ANY;
lpLocalName :=pchar('');
lpRemoteName:=Pchar('\'+Trim(Server)+'ipc




    文章评论
 
 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: