客户端侦听服务器连接请求,只要连接上,客户端根据服务器的指令来作出操作,其主要程序代码与步骤如下:
(1)Private Sub sckserver_ConnectionRequest(ByVal requestID As Long)
sckserver.Accept requested '服务器首先接收对应客户端申请连接的请求
End Sub
(2)彼此建立TCP/IP连接成功后服务器发送“关机”命令
Private Sub sckserver_DataArrival(ByVal bytesTotal As Long)
Dim remotedata As String
sckserver.GetData remotedata '接收关机命令
If Trim(remotedata) = "关机" Then
Call closeclient() '调用关机程序
End If
End Sub
接下来讲解客户端关机程序closeclient()。
2.客户端关闭2000/XP操作系统
目前计算机系统多为Windows 2000和Windows XP。Windows 98系统下的关机比较容易,只需要直接调用关闭计算机函数ExitWindowEx就可以了,而在Windows 2000系统下的调用这个函数只能“注销”而不能实现系统关机。在Windows 2000系统实现关机操作需得到SHUTDOWN许可,得到SHUTDOWN许可需要调用相应的API函数,具体过程如下:
①首先得到当前程序的进程句柄;
②使用这个进程句柄得到当前程序的访问标记;
③生成TOKEN_PRIVILEGES结构;
④有了TOKEN_PRIVILEGES结构后再获得SHUTDOWN权限;
⑤最后使用ExitWindowEx函数进行相关操作。
(1)相关的API函数
1)获得当前进程伪句柄函数GetCurrentProcess,函数声明如下:
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
2)取得程序访问标记函数OpenProcessToken,函数声明如下:
Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
3)查找进程权限函数LookupPrivilegeValue,函数声明如下:
Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
4)获得关机权限函数AdjustTokenPrivileges,函数声明如下:
Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
5)关机函数ExitWindowEx
用于关机操作的一些常数如表2所示。
表2
常数值 |
字符标识 |
作用 |
&H20 |
TOKEN_ADJUST_PRIVILEGES |
关机权限标识 |
&H8 |
TOKEN_QUERY |
标识查询 |
&H2 |
SE_PRIVILEGE_ENABLED |
私有进程有效 |
0 |
EWX_LOGOFF |
终止进程系统注销 |
1 |
EWS_SHUTDOWN |
关闭系统电源 |
2 |
EWS_REBOOT |
重新启动 |
4 |
EWS_FORCE |
强行终止没有响应的进程 |
|