Windows Server 3389
以上的版本都提供了一个基于TCP协议的服务叫终端服务.因为它的监听端口默认为3389,所以俗称3389.实际上,微软开发终端服务的初衷,是为了抗衡UNIX的多用户服务,我去年利用业余时间为一公司开发机顶盒项目时接触到这一块,该项目的核心是把一个Linux系统精减到最小后写入启动芯片,启动后通过我们的客户端程序登陆服务器的终端服务,从而使用服务器上面的所有资源,用几百元的成本生产的机顶盒模拟出奔四电脑的功能来.当然,该系统比较庞大,还涉及到视频 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本文出自 51CTO.COM技术博客 |


hymh
博客统计信息
热门文章
最新评论
友情链接