對Windows網絡權限機制的改進

發表于:2007-07-14來源:作者:點擊數: 標簽:
康帕斯(中國)國際信息服務有限公司 馬文騫 無論是Win9x還是NT,甚至是最新的Win2000, Windows 的網絡共享權限始終僅能作用于驅動器級和文件夾級,缺乏象UNIX那樣的文件級訪問權限使得Windows在網絡資源管理的功能上始終不能盡善盡美。本文給出了完善 Wind
康帕斯(中國)國際信息服務有限公司 馬文騫  

無論是Win9x還是NT,甚至是最新的Win2000,Windows的網絡共享權限始終僅能作用于驅動器級和文件夾級,缺乏象UNIX那樣的文件級訪問權限使得Windows在網絡資源管理的功能上始終不能盡善盡美。本文給出了完善 Windows網絡共享機制的設計思想,以及實現該設計的示例程序。這種擴充的機制在提高網絡安全性及靈活性方面有廣泛的應用。
一、網絡共享權限的擴充機制
Windows 的網絡共享權限有三種:“只讀”、“完全”和“根據密碼訪問”。但這種權限并不能作用于單獨的文件。這就給具體的網絡應用帶來了很大的局限性。
通過在服務器端及各個客戶端加裝 Client/Server形式的應用,可以有效地改進這種狀況。其中服務器上的管理程序負責維護和校驗客戶權限,并對符合權限要求的客戶請求提供服務。這些請求一般包括:下載服務器上的文件,將本地文件上傳至服務器的指定位置,修改、移動或刪除服務器上的文件,等等。
下面的示例程序給出了這種擴充機制的一個具體實現,即“上傳文件”。一個遠程客戶即使在 Windows級不擁有服務器上某文件夾的“寫”權限(甚至連“讀”的權限也沒有),但只要他在擴充機制中擁有該文件夾中某文件的“寫”權限,他依然可以上傳該文件。
1. 客戶程序(Client)
下圖是客戶程序的外觀及執行情況。在填入正確的用戶名和密碼后,遠程用戶成功上傳了 Logow.sys文件。這次文件覆蓋操作將導致服務器關機畫面的改變。由于上述文件存在于服務器的系統目錄(\Windows或\WinNT)下,將整個文件夾的“寫”權限在 Windows級共享給某用戶是非常危險的,因此上述擴充機制很好地化解了風險。


客戶程序源代碼如下(VB 6.0):
Option Explicit
Dim BlockSize As Integer
Private Sub cmdConnect_Click()
If tcpClient.State <> sckClosed Then tcpClient.Close
tcpClient.RemoteHost = txtIP.Text
tcpClient.RemotePort = 1001
tcpClient.Connect ' 連接到服務器
End Sub
?  
Private Sub cmdDisconnect_Click()
tcpClient.SendData "Close" ' 關閉連接
cmdConnect.Enabled = True
cmdUpload.Enabled = False
cmdDisconnect.Enabled = False
End Sub
??  
Private Sub cmdUpload_Click()
' 發送用戶名和密碼(為簡單起見,未做加密)
tcpClient.SendData "ID:" + txtName + "|PASS:" + txtPass
frmClient.MousePointer = 11
End Sub
?  
Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)
Static FileID As Integer, Cur_Pos As Long, FileLen As Long
Dim strData As String, j As Long
Dim Buf() As Byte
tcpClient.GetData strData
Select Case strData
Case "Connect OK" ' 收到連接成功的通知
cmdConnect.Enabled = False
cmdUpload.Enabled = True
cmdDisconnect.Enabled = True
Case "User Check Passed" ' 用戶權限驗證
tcpClient.SendData "File:" + txtDestination
Case "Please Upload File" ' 開始上傳文件
If Dir$(txtSource) <> "" Then
FileID = FreeFile
Open txtSource For Binary As #FileID
FileLen = LOF(FileID)
If FileLen > 3072 Then
BlockSize = 3072
Else
BlockSize = FileLen ' 若文件小于3K,則一次發送完成
End If
ReDim Buf(1 To BlockSize) As Byte
Get #FileID, , Buf
tcpClient.SendData Buf
Cur_Pos = BlockSize
End If
Case "Next Block" ' 傳送文件的后續塊
If Cur_Pos = FileLen Then
tcpClient.SendData "End"
Close FileID ' 上傳完成
frmClient.Caption = "TCP Client Upload " + Trim(Str(FileLen)) + " bytes"
frmClient.MousePointer = 0
Exit Sub
End If
j = Cur_Pos + BlockSize
If j > FileLen Then
j = FileLen - Cur_Pos
Else
j = BlockSize
End If
ReDim Buf(1 To j) As Byte
Get #FileID, , Buf
tcpClient.SendData Buf
Cur_Pos = Cur_Pos + j
frmClient.Caption = "TCP Client " + Trim(Str(Cur_Pos)) + " Bytes Uploaded."
End Select
End Sub
2. 服務器上的管理/服務程序(Server)
Option Explicit
Dim FileName As String
?  
Private Sub Form_Load()
tcpServer.LocalPort = 1001
tcpServer.Listen ' 監聽用戶登錄申請
End Sub
?  
Private Sub tcpServer_ConnectionRequest(ByVal requestID As Long)
If tcpServer.State <> sckClosed Then tcpServer.Close
tcpServer.Aclearcase/" target="_blank" >ccept requestID
tcpServer.SendData "Connect OK"
End Sub
?  
Private Sub tcpServer_DataArrival(ByVal bytesTotal As Long)
Static FileID As Integer
Dim strData As String, j As Long
Dim Buf() As Byte
ReDim Buf(bytesTotal) As Byte
tcpServer.GetData Buf
' 收到斷開登錄的申請
If Chr(Buf(0)) = "C" And Chr(Buf(1)) = "l" Then
tcpServer.Close
tcpServer.LocalPort = 1001
tcpServer.Listen
Exit Sub
End If
' 收到用戶名及密碼
If Chr(Buf(0)) = "I" And Chr(Buf(1)) = "D" Then
strData = ""
For j = 0 To bytesTotal - 1
strData = strData + Chr(Buf(j))
Next
If Mid$(strData, 4, InStr(4, strData, "|") - 4) = "Kompass" And _
Mid$(strData, InStr(4, strData, "|") + 6) = "ReedInfo" Then
tcpServer.SendData "User Check Passed"
End If
Exit Sub
End If
' 收到目標文件名
If Chr(Buf(0)) = "F" And Chr(Buf(1)) = "i" Then
FileName = ""
For j = 5 To bytesTotal - 1
FileName = FileName + Chr(Buf(j))
Next
' 為簡單起見,未做“同名確認”操作
If Dir$(FileName) <> "" Then Kill FileName
FileID = FreeFile
Open FileName For Binary As #FileID
tcpServer.SendData "Please Upload File"
Exit Sub
End If
' 收到文件傳送完畢的通知
If Chr(Buf(0)) = "E" And Chr(Buf(1)) = "n" Then
Close #FileID
Exit Sub
End If
' 收到文件(二進制形式)的一塊,并申請下一塊
Put #FileID, , Buf
tcpServer.SendData "Next Block"
End Sub
二、擴充機制的進一步說明
第一,數據庫的使用。上述服務器端的示例程序只是象征性地驗證了一下遠程用戶的身份,而在真實的應用環境中應使用數據庫來管理“用戶名/密碼/資源/權限”這四者的關系。
第二,與現有機制相配合。本文的擴充機制并不依賴于 Windows現有的權限機制。即使在 Windows下所有的資源共享都被關閉時(即所有資源均不共享),上述擴充機制仍能獨立發揮作用。但如果與現有機制巧妙地配合,擴充機制可大大減少程序量。
第三,控件數組的使用。服務器端的示例程序僅使用了一個 Winsock控件進行通訊,而在真實的使用環境中應將之改為 Winsock控件數組來應付多用戶的同時訪問。
第四,對 UNIX 方式的模擬。進一步完善擴充機制以實現UNIX式的權限管理也并非難事。這種更豐富、更靈活的權限管理機制在較大型局域網中有著廣泛的應用。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97